实验六-分析Linux内核创建一个新进程的过程
实验过程
1.删除原menu,下载新menu
cd ~/LinuxKernel
rm menu -rf
git clone https://github.com/mengning/menu.git
2.向MenuOS中增加fork命令,使用help查看现有命令
cd menu
mv test_fork.c test.c
make rootfs
MenuOS>>help
MenuOS>>fork
3.gdb调试
shell1:
cd LinuxKernel //返回LinuxKernel目录
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S //启动内核
shell2:
(gdb)file linux-3.18.6/vmlinux
(gdb)target remote:1234
设置断点
(gdb)b sys_clone
(gdb)b do_fork
(gdb)b dup_task_struct
(gdb)b copy_process
(gdb)b copy_thread
(gdb)b ret_from_fork
总结
1、操作系统内核三大功能是进程管理,内存管理,文件系统,最核心的是进程管理。
2、fork系统调用会创建一个当前进程的子进程。C语言库函数中的fork()在父进程中的返回值为子进程的pid,在子进程中的返回值为0。我们可以根据返回值的不同令父进程和子进程分别执行各自的任务。
3、fork系统调用与其它系统调用相似,都要利用int 0x80指令产生中断,然后由操作系统进行关闭中断和保护现场的工作,通过查询系统调用表找到fork系统调用的入口地址。这个入口一直一般为sys_clone, sys_fork, sys_vfork中的一个,这三个入口最终都会调用do_fork()函数。C库函数中的fork()函数会调用sys_clone。
遇到的问题
git clone https://github.com/mengning/menu.git
报错【Failed to connect to github.com port 443: Operation timed out】