linux启动流程——initrd和initramfs

 2023-09-24 阅读 11 评论 0

摘要:Linux内核启动 (system startup)当系统首次引导时,或系统被重置时,处理器会执行一个位于已知位置处的代码。在个人计算机(PC)中,这个位置在基本输入/输出系统(BIOS)中,它保存在主板上的闪存中。 (stage 1 bootloader

Linux内核启动

在这里插入图片描述
(system startup)当系统首次引导时,或系统被重置时,处理器会执行一个位于已知位置处的代码。在个人计算机(PC)中,这个位置在基本输入/输出系统(BIOS)中,它保存在主板上的闪存中。
在这里插入图片描述

(stage 1 bootloader)当找到一个引导设备之后,第一阶段的引导加载程序就被装入 RAM并执行。这个引导加载程序在大小上小于 512字节(一个扇区),其作用是加载第二阶段的引导加载程序(比如grub2)。

(stage2 bootloader)当第二阶段的引导加载程序被装入 RAM 并执行时,通常会显示一个动画屏幕,供你选择内核。

(kernel)选择了一个内核之后,bootloader会将
Linux内核镜像 和一个可选的初始 RAM磁盘(临时根文件系统)加载到内存中

(init)完成这些操作之后启动第一个用户空间程序(init),并执行高级系统初始化工作。

initrd

整体来说,通过initrd,可以降低kernel image本身的设计复杂度,把很多开机启动代码从内核转移到用户空间。

initrd 字面上的意思就是"boot loader initialized RAM disk",换言之,这是一块特殊的RAM disk,在载入Linux kernel 前,由boot loader予以初始化,启动过程会优先执行initrd的init程序,initrd完成阶段性目标后,kernel 会挂载真正的root file system ,并执行/sbin/init 程式。

首先,由kernel在内核空间完成与硬件相关的初始化工作,在适当的时机点,kernel读取并挂载initrd,切换到用户空间,以执行存放于RAM disk 中的init 程序(这需要完整的c运行时)。

第一阶段的initrd 步入尾声后,再回到kernel mode,initrd 所在的内存空间会被释放,之后就是执行真正的rootfs 中的init 程式。

initramfs

initrd对kernel来说,本身是个真实的block device。而block device需要在某个文件系统下工作,如ext2。ext2系统对于initrd来说过于复杂了。

基于这些想法,Linus Torvalds 做了ramfs,随后在其他核心开发者的改进下,成为tmpfs,而initramfs 就是建构于tmpfs的基础上。

initrd在执行结束后,会释放内存空间。而在Linux 2.6引入initramfs的设计后,一开机,kernel就执行位于initramfs中的/init,作为PID=1的init process,之后通过通过chroot重定位根文件系统。

参考:

https://en.wikipedia.org/wiki/Linux_startup_process

https://www.ibm.com/developerworks/cn/linux/l-linuxboot/index.html

http://blog.linux.org.tw/~jserv/archives/001954.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/92942.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息