2022年Linux_系统引导过程 .pdf

上传人:C****o 文档编号:32526569 上传时间:2022-08-09 格式:PDF 页数:14 大小:307.86KB
返回 下载 相关 举报
2022年Linux_系统引导过程 .pdf_第1页
第1页 / 共14页
2022年Linux_系统引导过程 .pdf_第2页
第2页 / 共14页
点击查看更多>>
资源描述

《2022年Linux_系统引导过程 .pdf》由会员分享,可在线阅读,更多相关《2022年Linux_系统引导过程 .pdf(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、启动流程启动时要加载核心,让核心来驱动整个硬件。整个启动过程:1 加载 BIOS 的硬件信息,并获得第一个启动设备的代号(CMOS 中设定的启动项) 。2 读取第一个启动设备的MBR 的引导加载程序(lilo 、grub、spfdisk)3 加载核心操作系统的核心信息,核心开始解压缩,并且尝试驱动所有硬件设备。4 核心执行init 程序并获取运行信息。5 Init 执行 /etc/rc.d/rc.sysinit 文件6 启动核心的外挂模块(/etc/modprobe.conf )7 Init 执行各个批处理文件(根据运行级别)。8 Init 执行 /etc/rc.d/rc.local 文件9

2、执行 /bin/login 程序,等待用户登录。10登录之后开始以shell 控制主机。引导加载程序与核心的载入主机读取BIOS ,并且了解主要的主机硬件信息后,主机便开始尝试加载操作系统。主机首先读取的就是硬盘的主引导记录(MBR ) ,在 MBR 中装有引导加载程序(比如说grub) 。主机刚启动时是不认识磁盘文件系统的,这就需要引导加载程序帮忙。但我们知道MBR 是整个硬盘的第一个扇区,整个大小为一个扇区的大小(512KB ) ,而我们的加载程序却远远大于这个容量。怎么办?引导加载程序分成两个阶段来执行:1, 执行引导加载程序的主程序,这个主程序放在MBR 或超级块中。2, 载入引导加载

3、程序的所有设置文件与相关的环境参数文件。一般来说,设置文件都放在/boot 目录下。引导加载程序必须能做到:引导加载程序可以直接指定并取用核心文件,并加载到主存储器中。也可以将加载程序的控制权移交给下一个加载程序(超级块中的引导加载程序)。grub 是如何被载入的呢?grub 有几个重要文档,stage1,stage2, 以及 stage1.5,这些文档都在/boot/grub 下, grub 被载入时有以下几个步骤。Stage1阶段装载基本的引导程式(stage1) ,这也是安装在MBR 中的内容,大小为512 字节,但这并不意味着占用的空间为512 字节,这还要看块的大小以及inode 控

4、制的块数。 比如说, 我用 #du b stage1,看到的是512 字节,但用 #du h stage1却看到的是2K。stage1 的主要功能就是装载第二引导程式(stage2)。stage1应该还包括磁盘分区的信息,但这个信息应该只是刚开始装机时的信息了,对于后面又对磁盘进行的分区操作stage1 应该是没有记录的,所以要备份的话,还是备份MBR 为上策。#dd if=/dev/had of=/tmp/mbr.back bs=512 count=1 stage1 只负责做引导的动作,不会有太多的功能,毕竟它也只有512bytes 的大小(真正的stage1 其实只能算446bytes),

5、如果用户在启动时可以看到GRUB Shell,那就是stage1 的真正画面。Stage1.5阶段名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 14 页 - - - - - - - - - 所有文件名是【XXX_stage1_5 】的都属于这阶段的文件,但至于为何会有这么多个文件?是因为其作用就像是连接stage1 到 stage2 的一个通道,里面唯一存放的是该系统文件的格式,所以只要是被支持的格式,就会预先存放一个格式文件在其中。这阶段的过程可以让GRUB 在 st

6、age1启动完成后,stage2 能在被搬移后的情况下,就算不在原本的目录或文件系统中,依然可以被安全地找到。因为stage1.5被加载时,就已经赋予GRUB 读取文件系统目录的能力,所以自然可以在一开始找不到stage2 的情况下,从文件系统目录中,找出stage2的所在位置。不过,通常stage1.5阶段的文件不会放在目录中,因为当stage1还没加载stage1.5时,原则上是不能识别ext2 的,当然也无法找到stage1.5这个文件,所以,其实stage1.5是存在硬盘最前面的32KB 的区段中的(但是要跳过MBR ),当 stage1调用 stage1.5时,就直接去该区域将sta

7、ge1.5 找出来使用,所以即使你在/boot/grub 目录下看不到这几个文件时,系统还是一样能启动。Stage2 阶段装载第二引导程式(stage2),是为了引出更高级的功能,以允许用户装载一个特定的操作系统。在 GRUB 中,这步是给用户显示一个菜单或输入命令。该文件是GRUB 的核心程序,能让用户以菜单方式将操作系统加载、新增参数、修改选项,这些全都是stage2 的功用。对GRUB 来说, stage2 除了不能自己启动外,剩下的事情全都由 stage2 完成。 像是用户在启动时所看到的GRUB 启动倒数画面, 或是紧接着的启动菜单画面,就都是由stage2 所提供的。Stage2

8、文件主要提供的功能如下。提供菜单。读取配置文件。连接下一个boot sector。配置文件device.map 、menu.lst及 grub.conf都属于这类文件。device.map 是直接侦测目前的硬件来假设BIOS所记录的实体磁盘有哪些,默认值是安装系统时就记录好的。menu.lst在此只是一个链接文件,链接到grub.conf文件,但在SuSE中却刚好相反,会以menu.lst为主要文件。grub.conf就是 GRUB 启动程序的主要配置文件,如果此文件丢失,会让GRUB 在启动时失去默认的选项,但要强调的是,此时还可以临时(启动时)通过手动配置方式启动(只要其他文件还在)。sp

9、lash.xpm.gz文件就是启动时的背景图片通过引导加载程序读取核心文件后,接下来, 主机会把核心文件解压缩到主存储器中,并且利用核心的功能,开始测试与驱动各台外部设备(存储设备,CPU,网卡,声卡,等) 。在加载核心的过程中,系统会以只读的方式载入根目录,而且会建立一个虚拟盘(RAM Disk ) ,以协助启动过程。这就需要initrd 的支持了,利用引导加载程序加载核心的时候,一起加载initrd 的映像文件, 他的作用是在没有mount /分区以前,系统要执行一些操作,比如挂载scsi驱动,他就把initrd释放到内存里,作一个虚拟的/ ,然后执行其根目录下的一个脚本“ init”(内

10、核2.4 的为 linuxrc,新内核2.6 为 init) ,运行 insmod 和 nash 命令挂装模块。在核心驱动外部硬件的工作完成之后,initrd 所建立的虚拟盘就会被删除。但注意 initrd并非必要的。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 14 页 - - - - - - - - - initrd文件分为2.4 内核的与2.6 内核的两种2.4 之前的查看initrd的内容只需要mount o loop 就可以了,但新内核2.6 改成 cpio方

11、式了,要mv /boot/initrd-2.6.5.13.58.img /tmp/initrd.gz gzip -d initrd.gz cpio -idv initrd 来查看 initrd的内容。initrd内容最大的不同就是由原先的linuxrc变成了 init。现在说一下init的工作内容。A:nash 指令。B:挂载主要的文件系统。C:建立设备文件所需的文件系统。D:建立最初所需使用的设备文件。E:加载相关模块。F:切入实体操作系统。initrd是 inital ram disk的宿写 . 当存在 initrd的时候 , 机器启动的过程大概是以下几个步骤( 当 initrd这一行用n

12、oinitrd 命令代替后 , 就不存在initrd了 ) 1)boot loader(grub)加载内核和initrd.img 2)内核将压缩的initrd.img解压成正常的ram disk并且释放initrd所占的内存空间3)initrd作为根目录以读写方式被挂载4)initrd里面的文档linuxrc被执行(内核为2.4 之前的为linuxrc,新内核为init)5)linuxrc挂载新的文档系统6)linuxrc使用 pivot_root系统调用指定新的根目录并将现有的根目录place 到指定位置 . 7)在新的文档系统下正式init 8)initrd被卸载 . 解开 initrd文

13、件。mv /boot/initrd-2.6.5.13.58.img /tmp/initrd.gz gzip -d initrd.gz cpio -idv kernel /bzImage-2.6.14.2 Linux-bzImage, setup=0 x1400, size=0 x29672e grub initrd /initrd-2.6.14.2.img Linux-initrd 0 x5f13000, 0 xcc199 bytes grub boot Uncompressing Linux. Ok, booting the kernel. 名师资料总结 - - -精品资料欢迎下载 - -

14、- - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 14 页 - - - - - - - - - 如果您不知道要引导的内核的名称,只需使用斜线(/ )然后按下 Tab 键即可。GRUB 会显示内核和 initrd 映像列表。当内核映像被加载到内存中,并且阶段 2 的引导加载程序释放控制权之后,内核阶段就开始了。 内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。通常它是一个 zImage(压缩映像,小于 512KB)或一个 bzImage(较大的压缩映像,大于 512KB),它是提前使用 zlib 进行压缩过的。在

15、这个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压,然后将其放入高端内存中, 如果有初始 RAM 磁盘映像,就会将它移动到内存中,并标明以后使用。然后该例程会调用内核,并开始启动内核引导的过程。当 bzImage (用于 i386 映像)被调用时,我们从 ./arch/i386/boot/head.S 的start 汇编例程开始执行 (主要流程图请参看图 3 )。这个例程会执行一些基本的硬件设置,并调用 ./arch/i386/boot/compressed/head.S 中的 startup_32 例程。 此例程会设置一个基本的环境 (堆栈等), 并清除 Blo

16、ck Started by Symbol(BSS )。然后调用一个叫做 decompress_kernel 的 C 函数(在 ./arch/i386/boot/compressed/misc.c 中)来解压内核。当内核被解压到内存中之后, 就可以调用它了。 这是另外一个 startup_32 函数,但是这个函数在 ./arch/i386/kernel/head.S 中。在这个新的 startup_32 函数(也称为清除程序或进程 0 )中,会对页表进行初始化,并启用内存分页功能。然后会为任何可选的浮点单元(FPU )检测 CPU 的类型,并将其存储起来供以后使用。然后调用 start_kern

17、el 函数(在init/main.c 中),它会将您带入与体系结构无关的 Linux 内核部分。 实际上,这就是 Linux 内核的 main 函数。图 3. Linux 内核 i386 引导的主要函数流程通过调用 start_kernel,会调用一系列初始化函数来设置中断,执行进一步的内存配置,并加载初始 RAM 磁盘。最后,要调用 kernel_thread(在名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 14 页 - - - - - - - - - arch/i

18、386/kernel/process.c 中)来启动 init 函数,这是第一个用户空间进程(user-space process )。最后,启动空任务,现在调度器就可以接管控制权了(在调用 cpu_idle 之后)。通过启用中断,抢占式的调度器就可以周期性地接管控制权,从而提供多任务处理能力。在内核引导过程中, 初始 RAM 磁盘(initrd)是由阶段 2 引导加载程序加载到内存中的,它会被复制到 RAM 中并挂载到系统上。 这个 initrd 会作为 RAM 中的临时根文件系统使用, 并允许内核在没有挂载任何物理磁盘的情况下完整地实现引导。由于与外围设备进行交互所需要的模块可能是 ini

19、trd 的一部分,因此内核可以非常小, 但是仍然需要支持大量可能的硬件配置。在内核引导之后, 就可以正式装备根文件系统了(通过 pivot_root):此时会将 initrd 根文件系统卸载掉,并挂载真正的根文件系统。decompress_kernel 输出函数 decompress_kernel 就是显示我们通常看到的解压消息的地方:Uncompressing Linux. Ok, booting the kernel. initrd 函数让我们可以创建一个小型的 Linux 内核, 其中包括作为可加载模块编译的驱动程序。这些可加载的模块为内核提供了访问磁盘和磁盘上的文件系统的方法,并为其他

20、硬件提供了驱动程序。 由于根文件系统是磁盘上的一个文件系统,因此 initrd 函数会提供一种启动方法来获得对磁盘的访问,并挂载真正的根文件系统。在一个没有硬盘的嵌入式环境中,initrd 可以是最终的根文件系统,或者也可以通过网络文件系统(NFS )来挂载最终的根文件系统。回页首Init 当内核被引导并进行初始化之后, 内核就可以启动自己的第一个用户空间应用程序了。这是第一个调用的使用标准 C 库编译的程序。在此之前,还没有执行任何标准的 C 应用程序。在桌面 Linux 系统上,第一个启动的程序通常是 /sbin/init。但是这不是一定的。很少有嵌入式系统会需要使用 init 所提供的丰

21、富初始化功能(这是通过/etc/inittab 进行配置的)。 在很多情况下,我们可以调用一个简单的 shell 脚本来启动必需的嵌入式应用程序。回页首名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 14 页 - - - - - - - - - 结束语与 Linux 本身非常类似, Linux 的引导过程也非常灵活,可以支持众多的处理器和硬件平台。 最初,加载引导加载程序提供了一种简单的方法,不用任何花架子就可以引导 Linux 。LILO 引导加载程序对引导能力进行了扩充,但是它却缺少文件系统的感知能力。 最新一代的引导加载程序, 例如 GRUB ,允许 Linux 从一些文件系统(从 Minix 到 Reise )上进行引导。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 14 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁