这个作业属于哪个课程 | <2020-2021-1Linux内核原理与分析)> |
---|---|
这个作业要求在哪里 | <2020-2021-1Linux内核原理与分析第六周作业> |
这个作业的目标 | <使用gdb跟踪分析一个系统调用内核函数,分析system_call对应的汇编代码工作过程> |
作业正文 | https://www.cnblogs.com/wzyxiaowang/p/13977300.html |
一、给MenuOS添加命令
1、删除之前的menu目录,下载新版本目录
-rm -rf menu
git clone http://github.com/mengning/menu.git
2、进入menu目录后,生成根目录系统并使用make rootfs进入MenuOS
3、在test.c文件中新添加Time以及TimeAsm函数
4、再次使用make rootfs命令,重新编译
-rootfs
-MenuOS>>help
-MenuOS>>Gpid
二、跟踪系统调用内核函数sys_time
1、进入到LinuxKernel目录,启动内核并冻结
-cd LinuxKernel
-qemu -kernel linux-3.18.6/arch/x86/boot/bzImge -initrd rootfs.img -s -S
2、打开新的shell窗口,使用gdb调试,连接1234端口并设置断点
-(gdb)file linux-3.18.6/vmlinux
-(gdb)target remote:1234
-(gdb)b start_kernel
3、用b sys_time命令在sys_time处设置断点,在QEMU终端中输入time后可以看到命令只执行到time函数
-(gdb)b sys_time
-(gdb)c
三、实验总结:
在system_call处设置断点,查看system_call可知,它其实就是系统调用的处理过程,内部没有严格遵守函数调用堆栈基址,不支持gdb的调试,所以MenuOS中仍停留在sys_time。由代码可知,系统调用的过程大致分为三个阶段:保存现场SAVE_ALL、调用系统调用相对应的处理函数如time、getpid等,call *sys_call_table()、恢复现场RESORE_ALL 最后ire结束,返回用户态。在这个过程中,可能 会用到syscall_exit_work,里面有关于进程调度的函数。中断处理是用户态进入内核态的主要方式,系统调用是一种特殊的中断。在系统调用返回之前,可能会发生进程调度(call_schedule),其中可能还会发生中断上下文的切换和进程上下文的切换。
系统调用过程: