linux系统启动过程
1、首先读入boot下的内核文件:
2、init进程读取配置文件:
pid=1,完成了从内核态到用户态的转变
linux内核启动流程:
在1与12之间,linux内核进行启动:
一、1时,利用代码kernel/arch/arm/boot/compressed进行内核的自解压
内核文件被加载到内存中,建立页表数据结构、进行地址映射,
二、之后进入start_kernel函数:
设置体系结构初始化相关的工作(x86等)
创建内核页表、MMU、中断处理函数、核心进程调度器、时钟中断处理机制、串口控制台、cache、内存管理、系统进程间通信机制IPC
之后开始挂载根文件系统
三、挂载根文件系统
包括 etc、bin、sbin、lib、dev等,采用只读的方式进行挂载。
(五大文件系统必须存储在根文件系统中)
之后再文件中找init服务,init服务启动后读取/etc/inittab文件,依据/etc/inittab中的设置进行初始化
(内核镜像就是内核文件,指的是一种内核形式)
initramfs 详解
在三中启动init进程之前,会启动initramfs,作为启动早期的用户态环境,
initram打包时,要求打包成cpio档案,可以嵌入到内核image中,也可以作为独立的文件在启动中被GRUB load。在/boot目录下的initrd.img-xxx (Ubuntu)或者initramfs-xxx.img (CentOS) 文件即为Linux用的initramfs文件。
写一个简单的hello,编译成32位程序,如果64位不能编译32位运行命令:
sudo apt-get install gcc-multilib
gcc -static -o helloworld -m32 helloworld.c
echo helloworld | cpio -o --format=newc > hwinitramfs
qemu -kernel arch/x86/boot/bzImage -initrd hwinitramfs -append "console=ttyS0 rdinit=helloworld" -nographic
可以看到成功输出了hello world并在用户态挺住
GRUB详解
GNU GRUB是多操作系统启动程序,多重操作系统启动管理器,
可以选择操作系统的内核,也可以向内核传递参数