目录
一、实验楼实验五
1、使用命令cd ./LinuxKernel/menu
进入menu
目录,修改test.c
文件,添加Getuidgid()
和Getuidgid_asm()
两个函数。
2、在main
函数中添加这两个函数的调用命令。
3、使用命令 make rootfs
重新编译,编译完成后在QEMU中使用help
命令查看我们新增的命令。
4、使用以下命令运行QEMU。
$~ cd LinuxKernel
$~ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
5、另打开一个窗口,通过以下命令使用gdb
进行调试。
$~ gdb
(gdb) file linux-3.18.6/vmlinux
(gdb) target remote:1234
(gdb) b start_kernel
(gdb) c
7、因为在start_kernel
处设置了断点,执行后在该处停了下来。
8、在sys_getuid
处设置断点,并继续执行。
9、在MenuOS中输入uidgid
,此时会在sys_getuid
处停下。
10、使用s
进行单步执行。
分析:system_call是Linux中所有系统调用的入口点,每个系统调用都至少需要有一个参数,即由eax传递进入的系统调用号。call *sys_call_table(,%eax,4)函数通过eax传递来的系统调用号,来寻找相应的系统调用处理函数。系统调用本质上是一种特殊的中断,所以它也需要进行现场保存和结束调用后的现场恢复。