您的位置:首页 > 运维架构 > Linux

《Linux内核分析》课程第五周学习总结

2016-03-27 09:09 615 查看
姓名:何伟钦

学号:20135223

( *原创作品转载请注明出处*)

( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

内容:1.使用gdb跟踪分析一个系统调用内核函数

2.根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图

[b]一、给MenuOS增加time和time-asm命令[/b]

(一) 克隆并自动编译MenuOS

rm menu -rf      //强制删除原menu文件


git clone http://github.com/mengning/menu.git //从github中克隆


cd menu   //进入menu目录


make rootfs //运行自动编译脚本,生成根文件系统,启动MenuOS


(二)给MenuOS增加time和time-asm命令

1.更新menu代码到最新版





2.在test.c中main函数里,增加MenuConfig



3.增加对应的两个函数:Time和TimeAsm

4。make rootfs





[b]

[/b]

[b]二、使用gdb跟踪调试内核[/b]

[b]1.运行MenuOS系统[/b]

在实验楼的虚拟机环境里,打击打开shell,使用命令

cd LinuxKernel/

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img



[b]2.调试运行[/b]

[b]1)使用带参数命令启动MenuOS[/b]

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S





输入help,可以看到当前的系统调用:



[b]2)启动gdb,设置断点,运行[/b]

(gdb)file linux-3.18.6/vmlinux //在出现gdb提示符后,加载符号文件

(gdb)target remote:1234 //建立和被调试程序的连接

(gdb)break start_kernel //在start_kernel函数入口处设置断点

(gdb)break sys_time //在系统调用time的位置设置断点

(gdb)c //继续输入c,使得系统运行到start_kernel处停住

(gdb)s //单步执行

(gdb)finish // 将这个函数执行完







list可以查看内部的函数,直到sys_time返回后进入汇编代码处理,gdb无法继续进行追踪



扩展知识:





[b]三、系统调用在内核代码中的处理过程[/b]

(一)系统调用在内核代码中的工作机制和初始化

main.c中start_kernel函数:trap_init()

set_system_trap_gate(SYSCALL_VECTOR,&system_call) 一执行int 0x80,系统直接跳转到system_call。

SYSCALL_VECTOR:系统调用的中断向量

&system_call:汇编代码入口

[b](二)system_call到iret之间的主要代码[/b]

1.SAVE_ALL:保存现场

2.syscall_call:调用了系统调用处理函数call *sys_call_table(,%eax,4)调用了系统调度处理函数,eax存的是系统调用号,是 实际的系统调度程序。 sys_call_table:系统调用分派表)

3.restore all:恢复现场

4.syscall exit work:若有sys_exit_work,则进入sys_exit_work:会有一个进程调度时机。work_pending -> work_notifysig,用来处理信号,可能call schedule:进程调度代码可能跳转到restore_all,恢复现场。

5. INTERRUPT RETURN:宏,也就是iret,系统调用到此结束

流程图如下:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: