Linux 系统调用初探(二)

原创作品转载请注明出处 ,《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”

一、为MenuOS添加命令

1、clone一下最新的menuos代码

 2、编辑test.c,增加自定义函数

3、编译生成新的rootfs

1

图1. 虚拟机启动

二、GDB跟踪调试系统调用

1、启动内核,打开调试端口

 2、打开一个新的终端,启动gdb

 3、调试过程

因为选择了read() 和 write()两个系统调用,所以调试过程简直要命。看图吧。

2图2. GDB跟踪调试

启动的时候就是一堆输出,然后进入MenuOS之后又是不停的read、write,所以几乎是一直不停地在敲回车。。。

和老师视频中一样,进入system_call之后是无法进行单步调试的。

3图3. 无法进行单步调试

 三、系统调用过程分析

下面按照系统调用的过程逐步给出代码以及简单分析

1、系统调用的定义:

 2、系统调用号对应服务例程的入口向量

 3、中断处理程序以及0x80定义

下面是SYSCALL的值的定义:

4、中断的入口

5、sys_read()和sys_write()服务例程的实现:

从上面的代码可以看到,服务例程真正的实现使用的是SYSCALL_DEFINE[X]这样的宏定义,[X] 代表了要传递的参数个数。

附上粗糙的流程图一张。。。

flow3

图4. 流程图

 

四、小小的总结

在整个系统调用过程中,首先触发INT 0x80系统中断,进入内核空间。然后根据%eax里保存的调用号跳转至对应的中断服务例程。中断服务例程完工之后,检测是否需要进程调度以及收尾工作,然后就是恢复寄存器,恢复现场,退回到用户空间。

 Linux内核毕竟是很复杂的,以上只是个人理解,如有错误欢迎指正。

 

参考文献:

http://www.linuxidc.com/Linux/2012-07/65758p2.htm

http://www.cnblogs.com/zhuyp1015/archive/2012/05/29/2524936.html

http://blog.chinaunix.net/uid-20672257-id-2831192.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注