详解linux系统启动原理

linux系统启动过程

1、首先读入boot下的内核文件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BB0wI14u-1615525326660)(en-resource://database/9240:1)]

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文件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vWBQgGse-1615525326667)(en-resource://database/9250:1)]

写一个简单的hello,编译成32位程序,如果64位不能编译32位运行命令:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G9rpJ2Zs-1615525326669)(en-resource://database/9254:1)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pbsGC1dN-1615525326670)(en-resource://database/9252:1)]

可以看到成功输出了hello world并在用户态挺住

GRUB详解

GNU GRUB是多操作系统启动程序,多重操作系统启动管理器,
可以选择操作系统的内核,也可以向内核传递参数

猜你喜欢

转载自blog.csdn.net/qq_42882717/article/details/114693288
今日推荐