linux内核分析第六次实验

使用gdb跟踪创建新进程的过程

rm menu -rf git clone https://github.com/mengning/menu.git 

mv test_fork.c test.c  
执行fork,可以看到父进程子进程都输出了信息。

enter description here

使用gdb进行调试

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

gdb
file linux-3.18.6/vmlinux
target remote:1234

开始设置断点

enter description here

 enter description here

enter description here

新进程是从哪里开始执行的?为什么从哪里能顺利执行下去?即执行起点与内核堆栈如何保证一致。

ret_ from_ fork决定了新进程的第一条指令地址。子进程从ret_ from_ fork处开始执行。因为在ret_ from_ fork之前,也就是在copy_ thread()函数中* childregs = * current_ pt_ regs();该句将父进程的regs参数赋值到子进程的内核堆栈。* childregs的类型为pt_ regs,里面存放了SAVE_ ALL中压入栈的参数,因此在之后的RESTORE ALL中能顺利执行下去。

posted on 2016-04-03 12:40  20135118  阅读(109)  评论(0编辑  收藏  举报