2022年linux内核启动流程总结doc资料 .pdf
《2022年linux内核启动流程总结doc资料 .pdf》由会员分享,可在线阅读,更多相关《2022年linux内核启动流程总结doc资料 .pdf(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、X86体系结构内核启动分析一、硬件检测当机器加电后它首先执行BIOS( 基本输入输出系统)中的代码, BIOS 首先执行加电自检程序 (POST) ,当自检通过程便完成了硬件的启动。当自检完成后BIOS 按照系统 COMS 中设置的启动顺序搜寻有效的启动驱动器(这里我们以硬盘为例),并读入系统引导扇区,并将系统控制权交给引导程序。二、加载和执行引导程序系统引导程序主要是把系统内核装载到内存,启动盘必须在第一个逻辑磁道上包含引导记录。这 512 个字节的扇区又被称作是引导扇区,在系统完成加电自检后,BIOS从启动盘中将引导扇区读入到内存中。一旦引导记录加载完毕,BIOS 就交出系统的执行控制权,
2、跳转到引导程序的头部执行。有关 linux pc的引导程序 lilo 和grub , lilo 和grub 可以引导多个系统,嵌入式系统上,最常见的 bootloader是UBOOT ,如果机器上要装多系统的话一般都会用到它们,这一引导程序也储存在引导扇区中或者存放在主引导记录中(MBR) ,lilo 和grub 都许允用户自己配置,它们在系统安装时建立了关于系统内核占用磁盘数据块的位置对照表。比如, grub 程序就非常强大。Gurb 运行后,将初始化设置内核运行所需的环境。然后加载内核镜像。grub 磁盘引导全过程:stage1: grub读取磁盘第一个512字节(硬盘的0道0面1扇区,被
3、称为MBR (主引导记录) ,也称为 bootsect)。 MBR 由一部分 bootloader的引导代码、分区表和魔数三部分组成。stage1_5: 识别各种不同的文件系统格式。这使得grub 识别到文件系统。stage2: 加载系统引导菜单(/boot/grub/menu.lst或grub.lst 根据 grub 版本不同文件位置会有所不同),加载内核 vmlinuz 和RAM 磁盘 initrd 。有时候基本引导装载程序(stage1) 不能识别 stage2 所在的文件系统分区,那么这时候就需要stage1.5 来连接 stage1 和stage2 了假设有如下 grub 配置代码r
4、oot (hd0,0)/grub分区kernel /vmlinuz 2.6.35.10 74.fc14.i686 ro root=/dev/ram0 /linux分区initrd /initramfs 2.6.35.10 74.fc14.i686.img 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 1 页,共 7 页 - - - - - - - - - - 要搞清楚上面两个root 的关系 ,root (hd0,0)中的 root 是grub 命令 ,它用来指定 boot 所在的分区作为 grub 的
5、根目录 .而root=/dev/ram0是kernel 的参数 ,它告诉操作系统内核加载完毕之后 ,真实的文件系统所在的设备.要注意 grub 的根目录和文件系统的根目录的区别。kernel 命令用来指定内核所在的位置,/ 代表 (hd0,0), 也就是 grub 的根目录 initrd 命令用来指定初始化 ram 的img 文件所在位置。三、内核启动内核映像文件vmlinuz :包含有 linux 内核的静态链接的可执行文件,传统上,vmlinux被称为可引导的内核镜像。vmlinuz是vmlinux的压缩文件。其构成如下:(1)第一个 512 字节(以前是在arch/i386/boot/b
6、ootsect.S)?(2)第二个,一段代码,若干个不多于512 字节的段(以前是在arch/i386/boot/setup.S)?(3)保护模式下的内核代码(在arch/x86/boot/main.c)。bzImage 文件:使用 make bzImage命令编译内核源代码,可以得到采用zlib 算法压缩的 zImage 文件,即 bigzImage文件。老的 zImage 解压缩内核到低端内存,bzImage则解压缩内核到高端内存(1M (0 x100000)以上),在保护模式下执行。bzImage文件一般包含有 vmlinuz 、bootsect.o、setup.o 、解压缩程序misc
7、.o 、以及其他一些相关文件(如 piggy.o)。注意,在 Linux 2.6 内核中, bootsect.S和setup.S 被整合为 header.S 。initramfs(或initrd) 文件: initrd 是initialized ram disk的意思。主要用于加载硬件驱动模块,辅助内核的启动,挂载真正的根文件系统。装载 Linux 内核的第一步应该是加载实模式代码(boot sector和setup 代码), grub 就会把实模式代码 setup 加载到 0 x07C00 之上的某个地址上,其中setup 的前 512 个字节是 boot sector (引导扇区),现在这
8、个引导扇区的作用并不是用来引导系统,而是为了兼容及传递一些参数。之后grub 跳转到 setup 的入口点,入口点为_start 例程 (根据arch/x86/boot/setup.ld可知 )。然后 setup 最后跳到 arch/x86/boot/main.c再经过一系列的跳转,跳到 start_kernel()函数,这是 Linux 内核的启动函数。main.c 文件是整个 Linux 内核的中央联结点。每种体系结构都会执行一些底层设置函数,然后执行名为start_kernel的函数(在 init/main.c中可以找到这个函数)。可以认为main.c 是内核的 “ 粘合剂( glue
9、) ” ,之前执行的代码都是各种体系结构相关的代码,一旦到达start_kernel(),就与体系结构无关了。 start_kernel()会调用一系列初始化函数来设置中断,执行进一步的内存配置,解析内核命令行参数。然后调用fs/dcache.c:vfs_caches_init()-精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 2 页,共 7 页 - - - - - - - - - - -fs/namespace.c:mnt_init()创建基于内存的rootfs 文件系统(是一个虚拟的内存文件系统,称
10、为 VFS),这是系统初始化时的根结点,即/ 结点,后面 VFS会指向真实的文件系统。 fs/namespace.c:mnt_init()会调用 fs/ramfs/inode.c:init_rootfs()会调用fs/filesystems.c:register_filesystem()注册 rootfs 。然后fs/namespace.c:init_mount_tree()调用 fs/super.c:do_kern_mount()在内核中挂载rootfs ,调用 fs/fs_struct.c:set_fs_root()将当前的 rootfs 文件系统配置为根文件系统。此时rootfs 里只有
11、根目录。为什么不直接把真实的文件系统配置为根文件系统?答案很简单,内核中没有真实根文件系统设备(如硬盘,USB)的驱动,而且即便你将根文件系统的设备驱动编译到内核中,此时它们还尚未加载,实际上所有内核中的驱动是由后面的kernel_init线程进行加载。另外,我们的root 设备都是以设备文件的方式指定的,如果没有根文件系统,设备文件怎么可能存在呢?start_kernel()在最后会调用 rest_init(),这个函数会启动一个内核线程来运行kernel_init(),自己则调用cpu_idle() 进入空闲循环,让调度器接管控制权。抢占式的调度器就可以周期性地接管控制权,从而提供多任务处
12、理能力。kernel_init()用于完成初始化rootfs 、加载内核模块、挂载真正的根文件系统。(因为已经初始化了 rootfs ,而且还加载了内核模块,所以可以找到设备如硬盘、内存,然后就可以把分区设置为根设备,并在根设备上挂载文件系统)挂载完真正的根文件系统后,goto 到out ,将挂载点从当前目录移到/ ,并把 / 作为系统的根目录,至此虚拟文件系统切换到了实际的根文件系统。目前 2.6 的kernel 支持三方式来挂载最终的根文件系统:(1)所有需要的设备和文件系统驱动被编译进内核,没有initrd 。通过 “root= 参数指定的根设备, init/main.c:kernel_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年linux内核启动流程总结doc资料 2022 linux 内核 启动 流程 总结 doc 资料
限制150内