Chinaunix首页 | 论坛 | 博客
  • 博客访问: 10775
  • 博文数量: 6
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-28 15:46
文章分类
文章存档

2015年(6)

我的朋友

分类: LINUX

2015-04-05 19:32:01

前言:
本周的内容实验部分比较简单,但是理论部分有点难度,清明回了趟家网速各种卡死,实验楼各种卡顿,到后来直接连接不上了,代码就眼睁睁地挂在了网上,自己却动不了,实在是不敢再爱了。

署名部分:
作者:彭家进
原创作品转载请注明出处 
《Linux内核分析》MOOC课程 ”

实验部分:
1,使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见 ,推荐在实验楼Linux虚拟机环境下完成实验。

上周使用的函数是sys_write,传送门:
http://blog.chinaunix.net/uid-30180970-id-4922728.html

第一步,老规矩,登录实验楼,进入LinuxKernel文件夹,修改test.c文件,插入自己所写的函数。
从图中可以看出,第150行到第154行是C语言写的printf()函数。
第155行到第166行是嵌入式汇编代码。



第二步,编译时提示printa(ASM嵌入式汇编函数)代码部分没有写返回值(即是返回void),闹了一点小情绪,但还是让过了。


第三步,分别使用printc和printa来调用sys_write函数,均正常运行。


第四步:开启gdb对qemu进行调试,设置了两个断点,一个是start_kernel,另一个便是sys_write。


第五步:系统启动过程中居然调用了很多次的sys_write(),赶紧把断点删除掉了,打算等系统启动完再开断点。

第六步:继续设置断点。


第七步:按c继续运行,到了breakpoint可以使用list查看调用函数的代码。(这个时候我的好友实验楼掉线了………………)


折腾了大半个小时后还是连接不上,罢了,实验部分也大概如此。下面进入理论部分。

2,博客内容中需要仔细分析system_call对应的汇编代码的工作过程,特别注意系统调用返回iret之前的进程调度时机等。

    首先我要吐槽老师给的系统调用表()一点都不齐全,自己在后来寻找资料的时候,找到了一个非常棒的调用表全注释。()分享给大家,希望对各位同学有帮助。
    
    
    1,系统调用的概览:
    


2,系统调用的起点,应用层程序的调用(在精简的Linux操作系统,通常是main.c):


3,通过trap_init()函数,系统进入内核态,并且调动中断处理程序set_system_trap_gate()。



4,通过读取预先放到寄存器eax中的系统调用号,中断处理程序将会调用相应的系统函数。


5,如下是int 0x0x80中断执行后发生的事情。图下代码的功能是将CPU当前寄存器中的所有数据保存到堆栈中去。(怎么感觉和第四周的作业那么像)




6,当内核函数执行完后,系统将会执行iert,退出内核状态,返回用户态。


7,将原来堆栈中的数据弹回寄存器:




8,如此,一个(最精简)详细的系统调用便到此结束了。

这就是本周的作业,这次又赶Deadline了,真可耻啊~(逃~

参阅过的资料:
1,~aeb/linux/lk/lk-4.html
2,http://blog.csdn.net/dianhuiren/article/details/7472380
3,^6419038


另外感谢全体在讨论区里活跃的小伙伴~


    

阅读(515) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~