标签:
李辰希 原创作品转载请注明出处 《Linux内核分析》
MOOC课程http://mooc.study.163.com/course/USTC-100002900
进入实验楼
克隆一个新的menu
进入menu之后,输入make rootfs,就可以自动编译
6.给MenuOS增加time和time_asm命令的步骤:
进入内核,冻结启动
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
代码如下:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
gdb (gdb)file linux-3.18.6/vmlinux //加载符号表
(gdb)target remote:1234 //连接
b sys_time:在系统调用time的位置设置断点
c:继续执行,停在断点处
n/s:单步运行,s进入函数,n不进入
理解system_call到iret之间的主要代码
系统调用返回前可能进行进程调用,里面会发生进程上下文的切换。
从系统调用入口开始:ENTRY(system_call)
SAVE_ALL //保存现场
system_call:
call *system_call_table(,%eax,4)
//调用了系统调用处理函数,有系统调用号eax中,是实际的系统调用处理程序。
当前任务syscall_exit_work里面有work_pending里面有
work_notifysig //处理pending信号,不用管
重要的是work_resched:call schedule //决定了进程调度的代码,调用完会跳转到restore_all
restore_all //恢复现场
INTERRUPT_RETURN //irp_return宏,中断处理过程在这结束
系统调用是一种特殊的中断。它是写一个函数,它需要用到内核中的代码,但这部分代码我没有办法直接访问,所以,我通过系统调用,它说它帮我去让内核执行我想执行的代码,把最后的结果告诉我。这时,我作为用户就是什么都不知道了,等着系统调用来告诉我结果。系统调用,它先通过sys_ call这个函数和内核沟通,说我想用一下你的sys_ xxx功能,请你把这个功能执行的结果告诉我。内核很快就去自己的内部,执行sys_ xxx的功能,执行完了之后,内核告诉了系统调用,这个函数的执行结果。最后系统调用就通过iret指令将结果信息反馈给了用户。这样,用户就完美的在请求系统调用帮助后,轻松的解决了问题。
20135201李辰希 《Linux内核分析》第五周 扒开系统调用的“三层皮”(下)
标签:
原文地址:http://www.cnblogs.com/20135201lcx2/p/5323198.html