MenOs
删除并clone新的MenuOs
rm -rf menu
git clone https://github.com/mengning/menu.git
make rootfs
如何新增命令
新增自己的命令
int make(){
int ret;
ret = mkdir("xzx",0666);
if(ret == -1)
printf("mkdir xzx failed");
else
printf("mkdir xzx success!");
return 0;
}
并且在main函数中添加
MenuConfig("mkdir","mkdir named xzx",mkdir);
使用自己的命令
使用GDB调试
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
file
file linux-3.18.6/vmlinux
target remote:1234
设置断点
分别在start_kernel
和sys_mkdir
处设置断点
单步执行
经过多次单步执行之后,会发现最终停留在 sys_mkdir
处,系统定义在fs/namei.c.
之后继续单步执行,讲道理应该会停留在 **“Cannot find bounds of current function”**处,但是我这个一直处于同一个循环中。
系统调用分析
系统调用初始化
系统调用可以理解为特殊一点的中断
系统调用返回之前,可能会发现进程调度
set_system_trap_gate(SYSCALL_VECTOR, &system_call); //绑定中断向量0x80和system_call中断服务程序入口,其中SYSCALL_VECTOR定义为0x80
SAVE_ALL//用来保存现场
current->work // 检测当前任务是否需要exit
sys_call_table //系统调用表
work_notifysing // 处理信号
work_resched // 重新调度