分析 system_call 中断处理过程
实验过程
往MenuOS中添加命令
1.进入LinuxKernel目录下,输入如下命令,先删除之前的menu目录,再下载更新了版本之后的menu目录;
-rm -rf menu
-git clone http://github.com/mengning/menu.git
2.进入menu目录之后,生成根目录系统,使用make rootf进入MenuOS,并使用help查看现有的命令
-make rootfs
-MenuOS>>help
3.将上周作业的代码getppid()和getppid_asm()函数加入到test.c中,并且再main函数中添加
MenuConfig("getppid","show The ppid",getppid);
MenuConfig("getppid_ams","Show The ppid(asm)",getppid_asm);
4.再次使用make rootfs进入MenuOS,并使用help查看现有的命令
gdb调用内核函数sys_time()
1.返回LinuxKernel目录,启动内核
cd LinuxKernel //返回LinuxKernel目录
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S //启动内核
2.启动gdb,加载内核,建立连接,在start_kernel函数处设置断点
file linux-3.18.6/vmlinux
target remote:1234 //建立连接
b start_kernel //在start函数中设置断点
使用list查看前后代码
3.输入b sys_time
设置一个断点,执行后程序停止在sys_time函数处,按s即可继续单步执行
system_call流程
系统调用是用户程序请求内核服务的关键机制,其流程从用户态发起,通过int 0x80
或syscall
指令切换到内核态。在内核中,CPU将当前上下文保存到内核栈,并根据系统调用号找到对应的处理函数执行逻辑,如文件操作或进程管理。执行完成后,内核将返回值存入寄存器,并判断是否需要处理信号或进行调度。如果不需要,使用iret
(32位)或sysret
(64位)指令恢复用户态的上下文,切换回用户程序,使其从系统调用后的下一条指令继续执行。这一过程确保了用户态与内核态的隔离,实现了系统资源的安全管理与高效调用。