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

时间:2022-10-01 16:54:12

 

姓名:何伟钦

学号:20135223

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

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

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

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

一、给MenuOS增加time和time-asm命令

(一) 克隆并自动编译MenuOS

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

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

  3. cd menu   //进入menu目录

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

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

 

    1.更新menu代码到最新版

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

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

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

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

    4。make rootfs

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

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

二、使用gdb跟踪调试内核

1.运行MenuOS系统

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

cd LinuxKernel/  

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

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

2.调试运行

1)使用带参数命令启动MenuOS

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

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

输入help,可以看到当前的系统调用:
《Linux内核分析》课程第五周学习总结

2)启动gdb,设置断点,运行

(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 // 将这个函数执行完

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

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

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

list可以查看内部的函数,直到sys_time返回后进入汇编代码处理,gdb无法继续进行追踪《Linux内核分析》课程第五周学习总结

扩展知识:

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

 

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

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

main.c中start_kernel函数:trap_init()

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

SYSCALL_VECTOR:系统调用的中断向量

&system_call:汇编代码入口

 

(二)system_call到iret之间的主要代码

     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,系统调用到此结束

 

流程图如下:

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