1、clone一个menu,并用test_exec.c覆盖test.c
clone
运行
2、回退到LinuxKernel目录,启动调试:
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
打断点
逐步调试
3、总结
1.Linux系统的一般执行过程
一般情况:
1.1正在运行的用户态进程X
1.2发生中断——save cs:eip/esp/eflags(current) to kernel stack,then load cs:eip(entry of a specific ISR) and ss:esp(point to kernel stack).
1.3SAVE_ALL //保存现场
1.4中断处理过程中或中断返回前调用了schedule(),其中的switch_to做了关键的进程上下文切换
1.5标号1之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行)
1.6restore_all //恢复现场
1.7iret - pop cs:eip/ss:esp/eflags from kernel stack
1.8继续运行用户态进程Y
几种特殊情况:
1.1通过中断处理过程中的调度时机,用户态进程与内核线程之间互相切换和内核线程之间互相切换,与最一般的情况非常类似,只是内核线程运行过程中发生中断没有进程用户态和内核态的转换;
1.2内核线程主动调用schedule(),只有进程上下文的切换,没有发生中断上下文的切换,与最一般的情况略简略;
1.3创建子进程的系统调用在子进程中的执行起点及返回用户态,如fork;
1.4加载一个新的可执行程序后返回到用户态的情况,如execve;