实验五 分析 system_call 中断处理过程
一、实验要求
- 使用 gdb 跟踪分析一个系统调用内核函数(上周选择的那一个系统调用),系统调用列表参见 torvalds/linux。推荐在实验楼
Linux 虚拟机环境下完成实验。 - 根据本周所学知识分析系统调用的过程,从 system_call 开始到 iret 结束之间的整个过程,并画出简要准确的流程图。
二、实验过程
1.打开实验楼的终端,进行如下操作
1)更新menu代码至最新版
2)使用gedit指令打开test.c并在其中添加上次实验使用的getpid的c函数以及汇编代码
gedit test.c
然后添加Getpid和GetpidAsm函数
在main函数中加入两条MenuConfig语句
3)在命令行输入如下语句
make rootfs
4)在QEMU对话框中输入help,可以看到qemu中增加了先前我们添加的命令
5)执行新增加的命令getpid和getpid_asm
6)使用gdb跟踪分析一个系统调用内核函数,并在start_kernel处设置断点,输入命令c继续执行,终端和qemu的执行结果如下图:
7)继续在sys_getpid处设置断点,发现执行命令getpid时并没有停下,却在执行getpid_asm时停下了
8)进行若干次单步执行,发现出现了进程调度函数,并返回了进程调度函数中的一个当前进程任务的值
9)在system_call处设置断点,程序执行到system_call时会停止,当继续执行时,刚才停下的getpid_asm返回值
2.使用AI工具辅助学习
三、实验原理
1、系统调用在内核代码中的工作机制和初始化
a、main.c中的start_kernel函数调用trap_init函数,trap_init函数调用set_system_trap_gate函数,set_system_trap_gate(SYSCALL_VECTOR,&system_call)函数绑定了中断向量0x80和system_call中断服务程序入口之后,一旦执行int 0x80,cpu就直接跳转到system_call这个位置来执行。
b、SYSCALL_VECTOR:系统调用的中断向量。
2、system_call到iret过程流程图
四、实验总结
系统调用是 Linux 内核中用于处理用户空间程序请求的关键部分之一,通常使用 int 0x80 指令或 syscall 指令触发系统调用。总的来说,通过这次实验,我对系统调用函数的调用过程更加熟悉,对system_call函数的流程也理解地更加透彻,更好的提高了对于Linux内核机制的理解。