1. 在menu/test.c中添加fork()调用源码:
int MyFork(int argc, char* argv[]) {// fork a new processint pid &#61; 0;do {pid &#61; fork();} while(pid <0);if(pid &#61;&#61; 0) {puts("This is the child process!");exit(0);} else {wait(NULL);puts("This is the parent process!");}return 0;
}
2. 在MenuOS中加入该命令(menu/test.c):
int main() {// ...MenuConfig(fork, "Fork a new process", MyFork);// ...
}
3. 创建根文件系统:
make rootfs
4. 启动qemu跟踪fork()创建进程过程:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
5. 在另起一个终端中启动gdb:
gdb
加载符号表、调试目标、设置断点、继续执行:
gdb> file linux-3.18.6/vmlinux
gdb> target remote:1234
gdb> b sys_clone
gdb> c
6. 在MenuOS命令行下输入fork执行MyFork函数:
MenuOS>> fork
在gdb命令行下添加断点:
gdb> do_fork
gdb> copy_process
gdb> trace_sched_process_fork
gdb> dup_task_struct
gdb> alloc_task_struct_node
gdb> arch_dup_task_struct
gdb> sched_fork
gdb> copy_files
gdb> copy_fs
gdb> copy_sighand
gdb> copy_mm
gdb> copy_io
gdb> copy_thread
gdb> ret_from_fork
7. 输出结果:
MenuOs>> fork
This is the child process!
This is the parent process!
8. 总结:
通过对fork()系统调用创建一个新进程过程的跟踪, 了解到Linux系统下进程是如何创建的。