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

作业信息

这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第六周作业>
这个作业的目标 <深入学习内核系统调用处理过程,用gdb跟踪系统调用内核函数>
作业正文 https://www.cnblogs.com/houyunzhe/p/13971550.html

实验过程

往MenuOS中添加命令

1.进入LinuxKernel目录下,输入如下命令,先删除之前的menu目录,再下载更新了版本之后的menu目录;

-rm -rf menu
-git clone http://github.com/mengning/menu.git

2.进入menu目录之后,生成根目录系统,使用make rootf进入MenuOS;

-make rootfs
-MenuOS>>help


使用help命令查看现有的命令

3.将getpid()函数加入test.c

4.使用getpid()函数查看pid

gdb调用内核函数sys_time()

1.先用如下命令启动内核:

cd LinuxKernel   //返回LinuxKernel目录
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S  //启动内核

2.启动gdb,然后按如下命令先加载3.18.6的内核,然后建立连接,最后在start_kernel函数处设置断点:

(gdb)file linux-3.18.6/vmlinux
(gdb)target remote:1234 //建立连接
(gdb)b start_kernel //在start函数中设置断点


使用list命令查看前后代码:

3.输入b sys_time设置一个断点,执行后程序停止在sys_time函数处,按s即可继续单步执行。

system_call流程

大致来说,system_call()函数首先将系统调用号或中断处理程序需要用到的所有的CPU寄存器保存到相应的栈中,然后进行服务的处理;
当系统调用服务例程结束时,system_call()函数从eax处获得它的返回值,然后进行一系列的检查,最后恢复用户态进程的执行。

posted @ 2020-11-15 14:42  侯蕴哲  阅读(109)  评论(0编辑  收藏  举报