朱荟潼 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课http://mooc.study.163.com/course/USTC 1000029000
一、学习内容
(一)给MenuOS增加time和time-asm命令(详见 :二、实验内容)
四步
1.更新menu代码到最新版;
2.在main函数中增加MenuConfig;
3.增加对应的Time函数和TimeAsm函数;
4.make rootfs。
(二)使用gdb跟踪系统调用内核函数sys_time(详见 :二、实验内容)
(三)系统调用在内核代码中的工作机制和初始化
1.进程调度的时机很重要。
初始化
set_system_trap_gate,设置系统陷阱门,即系统调用。
(四)简化后便于理解system_call伪代码
伪代码
【7、10】宏。SAWV_ALL宏保存现场
【16】调用系统调用号(eax的值)对应的服务程序
【19】判断当前任务是否需要处理 syscall_exit_work(当前进程信号处理、系统需要调度)
【21、23】不执行——>restore_all:irq_return
【32】work_notifysig 处理信号
【33】需要重新调度
【35】调度结束,返回系统调度调度
1.进程调度中会发生中断上下文切换&进程上下文切换。
2.内核抽象理解是许多种中断处理的集合。
(五)简单浏览system_call到iret之间主要代码
ENTRY(system_call)
【494】保护现场
【502】调用了系统调用处理函数(实际是系统调用的服务程序)
【533】至此,系统调用处理过程结束
【595】——>【610】处理信号
【597】决定进程调度的代码schedule
流程图
二、实验内容
1.给MenuOS增加time和time-asm命令
sys_time返回后进入汇编处理,gdb无法继续跟踪.
2.MenuOS中添加了fork,用gdb跟踪fork分析其内核处理函数sys_clone。
单步执行跟踪到ret_from_fork断点处继续执行汇编语句,jmp syscall_exit之后就无法跟踪。
make rootfs:自动编译,生成根文件系统,自动启动.
(gdb)list 查看代码.
(gdb)s 单步调试进入函数体.
(gdb)n 单步调试不进入函数体.