Linux内核分析实验五:分析system_call中断处理过程

陈琛+ 原创作品转载请注明出处《Linux内核分析》MOOC课

实验过程

1.代码修改
//修改test.c文件,添加PPIdAsm函数
151 int PPId(int argc, char *argv[])
152 {
153     long ppid;
154     ppid = getppid();
155 
156     printf("the parent pid is:%ld\n",ppid);
157     return 0;                                                                                                            
158 }

修改test.c文件,添加PPIdAsm函数
60 int PPIdAsm(int argc, char *argv[])
161 {
162     long ppid;
163 
164     asm volatile(
165         "mov $64,%%eax\n\t"
166         "int $0x80\n\t"
167         "mov %%eax,%0\n\t"
168         :"=m"(ppid)
169     );
170 
171     printf("the parent pid is:%ld\n",ppid);
172 
173     return 0;
174 }  

//修改test.c文件,修改主函数,添加命令
MenuConfig("ppid","Get Parent Process's ID",PPId);
MenuConfig("ppid-asm","Get Parent Process's ID(asm)",PPIdAsm);
2.编译
gcc -o init linktable.c menu.c test.c -m32 -static –lpthread
cd ../rootfs
cp ../menu/init ./
find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img
 
# 启动MenuOS系统
cd ~/LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
3.运行过程

image

4.调试过程
// 使用qemu和gdb调试内核
 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
 
 $ gdb
(gdb) file linux-3.18.6/vmlinux
Reading symbols from linux-3.18.6/vmlinux...done.
(gdb) target remote:1234
Remote debugging using :1234
0x0000fff0 in ?? ()

image

image

image

5.流程图

从sys_call开始到iret结束过程的流程图

image

实验总结

虽然在老师的视频指导下,参考网络资源,大致调试了一次系统调用过程,但是还是有很多疑惑。

转载于:https://www.cnblogs.com/tb1over/p/6624376.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值