郭垚 原创做品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000linux
1. 经过内核的方式(跟踪调试系统调用)来理解并使用系统调用。git
rm menu -rf //强制删除当前menu git clone http://github.com/mengning/menu.git //从新克隆新版本的menu cd menu ls make rootfs //rootfs是事先写好的一个脚本,自动编译自动生成根文件系统,同时自动启动MenuOS
2. 将上周选择的系统调用添加到MenuOS中github
vi test.c //进入test.c文件 MenuConfig("getpid","Show Pid",Getpid); MenuConfig("getpid_asm","Show Pid(asm)",GetpidAsm); //在main函数中增长MenuConfig() int Getpid(int argc,char *argv[]); int GetpidAsm(int argc,char *argv[]); //增长对应的Getpid和GetpidAsm两个函数 make rootfs //编译
3. 给MenuOS增长time和time_asm命令的步骤:函数
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S gdb (gdb)file linux-3.18.6/vmlinux (gdb)target remote:1234 //链接到须要调试的MenuOS (gdb)b start_kernel //设置断点 (gdb)c //执行,可见程序在start_kernel处停下 list //可查看start_kernel的代码 (gdb)b sys_time //sys_time是13号系统调用对应的内核处理函数,在该函数处设置断点 (gdb)c //若是这里一直按n单步执行,会进入schedule函数。sys_time返回后进入汇编代码处理,gdb没法继续进行追踪
执行int 0x80后执行system call对应的代码(system call不是函数,是一段特殊的汇编代码,gdb还不能进行跟踪)。学习
int 0x80——>system call:经过中断向量匹配调试
system call——>sys_xyz():经过系统调用号匹配code
1.1 系统调用机制的初始化blog
一旦执行int 0x80后马上跳转到system_call执行进程
注:system_call到iret之间的处理过程流程图详见总结。rem
老师简化的代码: