2018-2019-1 20189213《Linux内核原理与分析》第六周作业

本文详细介绍了在MenuOS中增加time和time_asm命令的过程,包括系统调用的实现和调试,以及解决C库函数与内核处理函数冲突的方法。

系统调用的三层机制(下)

给MenuOS增加time和time_asm命令

首先是删除menu目录,并用git clone重新克隆一个新版本的menu:
1508946-20181118174653413-1171700514.png
进入menu,由于已经提供了一个脚本rootfs,运行make rootfs脚本就可以自动编译并自动生成根文件系统,并同时运行MenuOS系统:
1508946-20181118174716459-2030700423.png
在MenuOS系统中执行已经添加过的time和time-asm命令:
1508946-20181118174806291-1995784660.png
然后我们打开menu目录下的test.c文件,找打定义的time函数和time-asm函数:
1508946-20181118175254593-111288010.png
在main函数中对这两个函数进行调用:
1508946-20181118175325819-1024039879.png

使用gdb跟踪系统调用内核函数sys_getpid

由于上周做了三个系统调用的C语言实现方法,分别是getuid、getpid、rename,这里我们进行对getpid的跟踪调试:
首先是在test.c中加入getpid:
1508946-20181118192404691-1713126182.png
1508946-20181118192423623-665341512.png
然后保存test.c,重新make rootfs,发现多了一个getpid的命令:
1508946-20181118192335442-1709718201.png
1508946-20181118192601039-1040025234.png
下面开始进行gdb调试:
先返回LinuxKernel目录,将内核加载进来:
1508946-20181118192900241-1471621185.png
首先在start_kernel函数处设置第一个断点,然后继续执行,到断点处停:
1508946-20181118193459291-1939030057.png
由于getpid是20号系统调用,对应内核处理函数是sys_pid,于是我们在此处也设置断点,然后执行结束:
1508946-20181118204157897-1334666593.png
但此时出现了问题,无法运行到sys_getpid断点处停下。
原因应该是:C库函数getpid()与内核处理函数sys_getpid存在冲突,导致无法运行到sys_getpid!

system_call的代码注释:

1508946-20181118205146468-136322510.png
注:
(1)sys_call_table(,%eax,4)的理解:因为分派表中的每个表项占4个字节,所以先把系统调用号(eax)乘以4,再加上 sys_call_table 分派表的起始地址,即是所调用的服务例程。
(2)GET_THREAD_INFO 宏用于获得当前进程的thread_info结构的地址,即获取当前进程的信息。
(3)syscall_exit_work 执行了一些进程调度、消息传递的工作,如果进行了进程切换,可能要继续触发新的中断,执行新的系统调用。

system_call流程示意图:

1508946-20181118205432805-603200080.png

总结

写pid函数时一开始定义函数名为getpid,后来编译发现出错,然后改名为pid,编译成功,估计是函数名getpid与20号系统调用getpid()存在冲突;

转载于:https://www.cnblogs.com/aiYY/p/9979153.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值