2023-2024-1 20232827 田紫晴《Linux内核原理与分析》第六周

分析 system_call 中断处理过程

1、阅读学习教材「庖丁解牛Linux 分析 」第6章,有问题优先使用chatgpt等AI工具。或者到蓝墨云班课中提问,24小时内回复,鼓励解答别人问题,提问前请阅读「如何提问」。

2、教材深入学习关注豆列「Linux内核及安全」。

3、学习蓝墨云班课中第六周视频「扒开系统调用的三层皮?(下)」,并完成实验楼上配套实验五。,注意从下往上看。基于树莓派或其他平台完成ARM相关内容。

4、在本周日晚12:00前发学习博客(标题 学号《Linux内核原理与分析》第六周作业),重点是遇到的问题和解决方案内容涵盖教材学习和视频,格式用Markdown。不按时交作业会扣分。

一、实验过程

1. 打开实验楼,进入LinuxKernel,从github中克隆menu

2、修改test.c文件,在test.c中加入getpid(),make rootfs成功后,输入help命令可以看到新增的getpid

 

3.使用cd..回到LinuxKernel目录下输入:

qemu-kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

 

gdb  file linux-3.18.6/vmlinux

gdb  target remote:1234

 

4、在sys_getpid处设置断点,发现在执行getpid_asm时停下了,一直按n进行若干次单步执行进入schedule函数。


二、根据本周所学知识分析系统调用的过程,从 system_call 开始到 iret 结束之间的整个过程,并画出简要准确的流程图

三、总结

       system_call到iret结束的过程:从整体过程来看,系统通过 int 0x80 从用户态进入内核态。在这个过程中系统先保存了中断环境,然后执行系统调用函数。system_call() 函数通过系统调用号查找系统调用表 sys_cal_table 来查找到具体的系统调用服务进程。在执行完系统调用后在执行 iret 之前,内核做了一系列检查,用于检查是否有新的中断产生。如果没有新的中断,则通过已保存的系统中断环境返回用户态。这样就完成了一个系统调用过程。系统调用通过 INT 0x80 进入内核,跳转到 system_call() 函数,然后执行相应服务进程。因为代表了用户进程,所以这个过程并不属于中断上下文,而是属于进程上下文。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值