javaee论坛

普通会员

225648

帖子

335

回复

349

积分

楼主
发表于 2017-07-20 16:11:49 | 查看: 93 | 回复: 1
Boot Loader 是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。通常,Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户特定的 Boot Loader 设计与实现。


⒈ Boot Loader 所支持的 CPU 和嵌入式板
每种不同的 CPU 体系结构都有不同的Boot Loader。有些 Boot Loader 也支持多种体系结构的 CPU,比如 U-Boot 就同时支持 ARM 体系结构和MIPS 体系结构。除了依赖于 CPU的体系结构外,Boot Loader 实际上也依赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 而构建的,要想让运行在一块板子上的 Boot Loader 程序也能运行在另一块板子上,通常也都需要修改 Boot Loader 的源程序
⒉ Boot Loader 的安装媒介(Installation Medium)
系统加电或复位后,所有的CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令。比如,基于 ARM7TDMI core 的 CPU 在复位时通常都从地址 0x00000000 取它的第一条指令。而基于CPU 构建的嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或 FLASH 等)被映射到这个预先安排的地址上。因此在系统加电后,CPU 将首先执行Boot Loader 程序。
⒊ 用来控制 Boot Loader 的设备或机制
主机和目标机之间一般通过串口建立连接,Boot Loader 软件在执行时通常会通过串口来进行输入、输出,比如:输出打印信息到串口,从串口读取用户控制字符等。
⒋ Boot Loader 的启动过程
BootLoader 的启动过程可分为单阶段(Single-Stage)和多阶段(Multi-Stage)两种。通常多阶段的Boot Loader 具有更复杂的功能,更好的可移植性。从固态存储设备上启动的Boot Loader 大多采用两阶段,即启动过程可以分为 stage1和stage2:stage1完成初始化硬件,为stage2准备内存空间,并将stage2复制到内存中,设置堆栈,然后跳转到stage2。
⒌ Boot Loader 的操作模式 (Operation Mode)
大多数Boot Loader都包含两种不同的操作模式。启动加载模式和下载模式。
(1)启动加载(Boot loading)模式:这种模式也称为“自主”模式,也即Boot Loader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是Boot Loader的正常工作模式。
(2)下载(Down loading)模式:在这种模式下目标机上的Boot Loader将通过串口连接或网络连接等通信手段从主机下载文件。从主机下载的文件通常首先被Boot Loader保存到目标机的RAM中然后再被Boot Loader写到目标机上的固态存储设备中。
⒍ Boot Loader 与主机之间进行文件传输所用的通信设备及协议
分为两种情况。一种是目标机使用串口与主机相连。这时的传输协议通常是xmodem/ymodem/zmodem中的一种。第二种可以用网络连接的方式传输文件,这时使用的协议多为tftp。
Linux-开机流程介绍1-boot loader与kernel 载入

开机不是只要按一下电源钮而关机只要关掉电源钮就可以了吗?有何大学问?话是这样没错啦,但是由于 Linux 是一套多人多工的作业系统,你难保你在关机时没有人在线上,如果你关机的时候碰巧一大群人在线上工作, 那会让当时在线上工作的人马上断线的!那不是害死人了!一些资料可是无价之宝哩!
  另外,与 DOS 环境不同的是, Linux 在执行的时候,虽然你在画面上只会看到黑压压的一片,完全没有任何画面, 但其实他是有很多的程式在背景底下执行的,例如登录档管控程式、前面两章提到的例行性命令, 当然还有一大堆网路服务,如邮件伺服器、WWW伺服器等等。你如果随便关机的话, 是很容易伤害硬碟及资料传输的动作的!所以在 Linux 下关机可是一门大学问喔。
  既然开机是很严肃的一件事,呵呵,那我们来瞭解一下整个开机的过程吧! 好让大家比较容易发现开机过程里面发生错误的地方,与解决之道!不过,由于开机的过程中,那个开机管理程式 ( Boot Loader ) 使用的软体可能不一样,例如目前各大 Linux distributions 的主流为 grub, 但早期 Linux 预设是使用 LILO ,台湾地区则很多朋友喜欢使用 spfdisk 。 但无论如何,我们总是得要瞭解整个 boot loader 的工作情况,才能瞭解为何进行多重开机的设定时, 为何老是听人家讲要先安装 Windows 再安装 Linux 的原因~
  我们先来想一想, Linux 整个开机的程序是怎样呢?还记得我们提过,开机时要载入核心, 让核心来驱动整个硬体,这样才能算是一个最阳春、最基础的作业系统吧?然后才能够执行各种程式的运作。 同样的,开机的流程也是需要先载入核心的。不过,载入核心前,却需要一些前置作业,才能够正确无误的载入核心嘛! 所以,整个开机的程序是这样的:
  1. 载入 BIOS 的硬体资讯,并取得第一个开机装置的代号;
  2. 读取第一个开机装置的 MBR 的 boot Loader (亦即是 lilo, grub, spfdisk 等等) 的开机资讯;
  3. 载入 Kernel 作业系统核心资讯, Kernel 开始解压缩,并且尝试驱动所有硬体装置;
  4. Kernel 执行 init 程式并取得 run-level 资讯;
  5. init 执行 /etc/rc.d/rc.sysinit 档案;
  6. 启动核心的外挂模组 (/etc/modprobe.conf);
  7. init 执行 run-level 的各个批次档( Scripts );
  8. init 执行 /etc/rc.d/rc.local 档案;
  9. 执行 /bin/login 程式,并等待使用者登入;
  10. 登入之后开始以 Shell 控管主机。
(评论:linux开机顺序,第一先读bios,读取硬件信息,然后根据bios的设定读取第一个硬盘的master boot record即MBR。MBR中安装有boot loader,boot loader解释核心的文件系统并且指向系统核心的文件。通过boot loader解压缩系统核心,并将系统核心加载到内存中。总之,系统先读bios,再根据bios读取硬盘的MBR,再根据MBR中的boot loader分析系统核心的文件系统。并指向系统核心。
虽然以上分析很复杂,但是管理员接触就只是grub和lilo等开机程序而已。grub是安装在MBR内一个小程序,这个小程序能够认识核心的文件系统。

  大概的流程就是上面写的那个样子啦,而每一个程序的内容主要是在干嘛呢?底下就分别来谈一谈吧!
  boot loader 与 kernel 载入
  由第一篇里面谈到的一些基础的主机硬体概念当中,我们知道整个主机在开机的时候,第一个被读取的地方, 就是 BIOS ( Basic Input Output System ) 啦,这个 BIOS 里面记录了主机板的晶片组与相关的设定, 例如 CPU 与周边设备的沟通时脉啊、开机装置的搜寻顺序啊、硬碟的大小与类型啊、 系统时间啊、各周边汇流排的是否启动 Plug and Play (PnP, 随插即用装置) 啊、 各周边设备的 I/O 位址啊、以及与 CPU 沟通的 IRQ 岔断等等的资讯都记录在此, 所以啰,系统要顺利的开机,首先就是要去读取 BIOS 的相关设定值了。
  读取了 BIOS 设定值之后,系统会根据 BIOS 的资料,进行开机自我测试 (power on self test, POST), 然后开始执行硬体侦测的初始化,并设定 PnP 装置,之后再定义出可开机的装置, 之后就会开始进行开机装置的资料读取了 (MBR 相关的任务开始)。
  读完了 BIOS 并且瞭解了主要的主机硬体相关资讯后,主机便会开始尝试由储存媒体载入作业系统了。 我们刚刚提到 BIOS 会记录‘可用来开机的装置搜寻顺序’对吧!所以,系统会开始去第一个开机装置上面进行开机程序。 我们在第二篇的 磁碟档案系统(filesystem) 当中提到过整个储存装置的特性, 如果以硬碟来看,那么开机流程读到硬碟的过程中,第一个要读取的就是该硬碟的主要开机磁区 (Master Boot Record, MBR) 了,而系统可以由主要开机区所安装的开机管理程式 (boot loader) 开始执行核心辨识的工作。
  
Tips:
  我们知道每颗硬碟的第一个磁区称为 MBR ,那么如果我的主机上面有两颗硬碟的话, 系统会去哪颗硬碟的 MBR 读取资料呢?这个就得要看 BIOS 的设定了。 基本上,我们常常讲的‘系统的 MBR’其实指的是 第一个开机装置的 MBR 才对! 所以,改天如果您要将开机管理程式安装到某颗硬碟的 MBR 时, 要特别注意当时系统的‘第一个开机装置’是那个,否则会安装到错误的硬碟上面喔!重要重要!     
  那么为什么要在 MBR 安装 boot loader 呢?而这个 boot loader 有什么功能呢? 还记得我们在第二篇提到的 磁碟档案系统 吧? 我们的作业系统核心必须要认识磁碟档案系统才能读取里面的资料啊, 但是整个系统才刚刚到开机起头的地方而已,要如何认识磁碟档案格式呢? 那就得要藉由 boot loader 来辅助啦!所以啰,当然必须要有 boot loader 才有办法载入 Linux 的核心 (kernel) 啊!由于 boot loader 的特殊功能,因此,想要载入 Linux 核心时, 当然得使用支援 Linux filesystem 的 boot loader 了,目前主流的 grub 这套开机管理程式, 不但可以支援 Linux ,同时也支援 Windows 相关的核心系统呢!
  好了,先再来回忆一下,如果你是以 grub 程式开机的话,那么在开机的时候会显示什么资料呢?呵呵! 会显示蛮多的开机选单,没错~就是‘选单’,然后选择了你的选择项目之后, 系统就会跑到该磁区去读取该作业系统的核心啰!呵呵!所以一个好的 boot loader 会具有两个功能,就是:
  * 选单功能 (menu)
  * 指向功能 (pointer)
作业系统的核心在硬盘上,管理员通过grub这个小程序操作核心系统的文件,开启整个操作系统。
一个boot loader引导一个操作系统,如果是windows和linux并存,则是两个boot loader引导两个操作系统,开机管理程式boot loader除了可以安装在MBR之外, 还可以安装在每个分割槽的开机磁区(boot sector),通过MBR内boot loader的选项,管理员可以选择指向另一个分区的boot loader,这另一个boot loader在另一个分区的boot sector内,这就是多重开机原理。
  再来强调一下,因为 Windows 与 Linux 的档案格式不一样?! 为了载入系统核心,所以必须要安装认识我们作业系统的 loader, 而 Linux 的 loader ( lilo 或 grub ) 是可以认识 windows 的核心档案的,但是 Windows 的 loader 却不认识 Linux 的核心档案,因此,作为一个多重开机的设定 loader ,就无法使用 Windows 所提供的 loader 啰!由于需要让系统认识你的 kernel ,因此,就需要 boot loader 啦!这样想就对啦!
安装windows操作系统时,windows操作系统的boot loader会将MBR中的内容全部覆盖掉,所以在安装多重操作系统时,最好先安装windows,再安装linux,如果先安装linux,则 windows会把linux的boot loader覆盖掉,导致linux无法开机。
  好了,当我们藉由 boot loader 的管理而开始读取核心档案后,接下来, Linux 就会将核心解压缩到主记忆体当中, 并且利用核心的功能,开始测试与驱动各个周边装置,包括储存装置、CPU、网路卡、音效卡等等。 那么核心档案在哪里啊?一般来说,他会被放置到 /boot 里面, 并且取名为 /boot/vmlinuz 才对!
  在载入核心的过程当中,我们必须要知道的是,系统只会‘挂载根目录’而已,而且是以唯读的方式挂载的。 此外,有时为了让某些功能可以用档案的方式来读取,因此,有的系统在开机的时候, 会制作所谓的虚拟硬碟 (RAM Disk) 来辅助的,那就是 initrd 以及 linuxrc 的功用了。 利用 boot loader 的功能,可以在载入核心的时候,一起载入 initrd 的映象档 (/boot/initrd-xxxx.img), Linux 系统会主动的以 initrd (man 4 initrd) 来进行虚拟硬碟的建置, 并且利用 linuxrc (包含在 initrd 的映象档内) 这个程式的功能来进行载入模组的动作。 linuxrc 主要的特性是:
  * 必须是 linuxrc 这个档名;
  * 必须放置在 initrd 所建立的虚拟磁碟的最顶层目录;
  * 必须要可以被核心所执行。
  在核心驱动周边硬体的工作完成之后, initrd 所建立的虚拟磁碟就会被移除了! 不过您要注意的是, initrd 并非必要的,是可有可无的,要看您当初建立该核心的时候, 整个编译的角度与过程。一般来说,各大 Linux 



普通会员

0

帖子

308

回复

314

积分
沙发
发表于 2024-03-28 08:38:18

楼主说得对

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017