一、实验过程
1、打开实验楼,进入LinuxKernel,从github中克隆menu
2、在menuos中添加函数
(1)在test.c中添加getpid和 getpid-asm函数,并在main函数中添加
(2)make rootfs自动编译脚本
3、进行调试
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函数
二、实验流程图
三、使用chatgpt
四、实验总结
用户态进程通过 int 0x80 或 system_call 进行系统调用的过程:
1. 用户态进程通过 int 0x80 这个中断指令(或者 system_call)发起系统调用请求。中断号 0x80 是预留给系统调用的中断向量号。
2. 当进程发起系统调用请求时,CPU会从用户态切换到内核态,进入特权模式,并执行相应的中断处理程序。
3. 中断处理程序会保护当前进程的现场。它会保存进程被中断时的状态,如程序计数器 PC、寄存器内容以及其他重要的进程信息,通常保存在内核栈中。
4. 然后,中断处理程序会进行一系列的检查和调度,根据系统调用的类型和参数,选择相应的系统调用处理子程序进行处理。
5. 在系统调用处理子程序中,内核会执行与系统调用相关的任务。这可能包括文件操作、进程管理、内存管理、网络通信等。
6. 处理子程序完成后,中断处理程序会恢复被中断进程的现场,将先前保存的状态信息加载回寄存器和程序计数器,并使用 iret 指令返回到用户态。
7. 用户态进程再次恢复执行,继续执行系统调用之后的指令。
总结来说,用户态进程通过 int 0x80 或 system_call 中断指令切换到内核态,触发中断处理程序来处理系统调用请求,并在处理完后恢复现场返回到用户态,以实现用户程序与内核之间的协作和资源访问。