2019-2020-1 20209324《Linux内核原理与分析》第四周作业
1.先在自己的电脑上配置环境,采用以下代码。
mkdir LinuxKernel
cd LinuxKernel
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz
xz -d linux-3.18.6.tar.xz
tar -xvf linux-3.18.6.tar
cd linux-3.18.6
make i386_defcongig
make
结果如图所示:
2.然后制作根文件系统,采用的代码如下:
mkdir rootfs
git clone https://github.com/mengning/menu.git
cd menu
gcc -pthread -o init linktable.c menu.c test.c -m32 -static
cd ../rootfs
cp ../menu/init ./
find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img
结果如下:
3.启动qemu
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
4.加载符号表以及采用1234端口进行连接,同时在start_kernel处设置断点
file linux-3.18.6/vmlinux
target remote:1234
break start_kernel
5.查看start_kernel函数的代码(运行至rest_init()为止)
小结:
1.观察代码得,Linux在三个特殊进程,0号进程(idle),1号进程(init)和2号进程(hthreadd),其中idle进程由系统自动创建,运行在内核态;init进程由idle通过kernel_thread创建,在内核空间完成初始化后, 加载init程序, 并最终用户空间 ;kthreadd进程由idle通过kernel_thread创建,并始终运行在内核空间, 负责所有内核线程的调度和管理