为了努力的理解操作系统,学习过程中的一个看法:能不能控制笔记本启动后加载的第一个程序。
事实上,笔记本启动到出现桌面,这个过程并不简单。先不讨论bootloader阶段,只说linuxkernel,即一个看法:控制kernel启动后加载的第一个程序。kernel启动后加载的程序都置于储存介质里,即储存介质里的东西不须要这么多,目录足够简单。
linux通常仅指kernel,根目录下的所有东西为根文件系统。建立最小Linux系统的完整说法:建立根文件系统最小的linux系统。
假如查看pstree,可以看见进程之间的关系
QEMU下模拟
希望在给定的linux内核初始化完成后,直接执行我自己编撰的静态链接的init二补码文件红旗linux,我该如何做。
查看指南获知,kernelinit函数中,会尝试按次序执行一些东西
if (!try_to_run_init_process("/sbin/init") ||
!try_to_run_init_process("/etc/init") ||
!try_to_run_init_process("/bin/init") ||
!try_to_run_init_process("/bin/sh"))
return 0;
这便是启动的第一个进程,假如一个都没找到,这么都会kernelpanic。
QEMU中可以用参数指定启动的系统镜像,因而不须要考虑bootloader的事情最小的linux桌面系统最小的linux桌面系统,因而先在x86平台做这个事情。因此我们须要打算内核镜像与根文件系统里的东西。
内核镜像可拿一个现成的来用/boot/vmlinuz,
根据linux约定的方法,把我们自己的可执行文件放在bin里
打算好了所有东西,把那些东西打包上去
cd rootfs
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz
在QEMU里启动,指定一些启动参数
qemu-system-x86_64
-serial mon:stdio
-kernel ./vmlinuz
-initrd ./rootfs.cpio.gz
-machine accel=kvm:tcg
-append "console=ttyS0 rdinit=/bin/init"
嵌入式linux
交叉编译busybox,打算好rootfs如何安装LINUX,通过nfs形式网路挂载文件系统。使用上去甚至比QEMU还要好用。
kernel直接找到了/bin/init,并运行上去。