2019-2020-1 20199321《Linux内核原理与分析》第六周作业

给MenuOS增加命令

  • 首先要强制删除当前的menu目录,然后重新克隆一个新版本的menu。
  • 进入menu,运行rootf方式脚本,自动编译生成根文件系统,运行MenuOs系统。
cd LinuxKernel
rm -rf menu
git clone https://github.com/mengning/menu.git
cd menu
make rootfs

2019-2020-1 20199321《Linux内核原理与分析》第六周作业_第1张图片

  • 打开test.c,main函数中的MenuConfig就是对应的系统调用的功能增加,在上面给出具体实现。
    2019-2020-1 20199321《Linux内核原理与分析》第六周作业_第2张图片

使用gdb跟踪内核函数sys_time

  • 调试内核,并启动gdb,加载3.18.6的内核,连接到target remote:1234
cd..
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
file linux-3.18.6/vmlinux
target remote:1234

2019-2020-1 20199321《Linux内核原理与分析》第六周作业_第3张图片

  • 在start_kernelF和sys_time处设置断点
b start_kernel
b sys_time

2019-2020-1 20199321《Linux内核原理与分析》第六周作业_第4张图片
2019-2020-1 20199321《Linux内核原理与分析》第六周作业_第5张图片

系统调用在内核代码中的处理过程

中断向量0x80和system_call中断服务程序入口的关系

2019-2020-1 20199321《Linux内核原理与分析》第六周作业_第6张图片

- 在用户态中有一个系统调用xyz(),xyz()调用了SYSCALL来触发系统调用。
- 中断向量0x80对应system_call中断服务程序入口


tart_kernel函数执行内核启动的初始化工作,其中会调用trap_init函数。通过set_sysytem_trap_gate函数将中断向量0x80和入口函数system_call绑定.执行0x80直接跳转到system_call。

在system_call汇编代码中的系统调用内核处理函数

1.系统调用户态接口和系统调用的内核处理函数是通过系统调用号匹配起来的。
2.使用EAX寄存器传递系统调用号。
3.现场保护SAVE_ALL和和恢复现场restore_all。
4.syscall_exit中判断当前的任务是否需要进程调度,如果需要进程调度进入syscall_exit_work,执行进程调度,结束后恢复现场返回用户态。syscall_exit_work里有一个进程调度时机。

2019-2020-1 20199321《Linux内核原理与分析》第六周作业_第7张图片
2019-2020-1 20199321《Linux内核原理与分析》第六周作业_第8张图片
总结:

你可能感兴趣的:(2019-2020-1 20199321《Linux内核原理与分析》第六周作业)