- 论坛徽章:
- 0
|
下面是我翻译的中文译文,有两个问题,有点想不通,请大家帮忙。
1,如果我系统为win和Linux,并且grub装在MBR(磁盘的第一个扇区),上,那么原来的win的启动时程序被grub覆盖了,怎么还能启动win呢?
2,如果我系统为win和Linux,并且grub装在Linux分区的BootSector上,那么grub是如何启动的?因为上电后,bios会读入MBR(磁盘的第一个扇区),而不是Linux分区的grub所在的扇区。我猜想是不是和活动分区表有关呢?
附录A 系统启动过程这部分附录内容解释了在用户接通计算机电源之后,具体发生了什么事情 也就是Linux内核映像如何被拷贝到内存并执行的。 简而言之,我们将讨论内核也就是整个系统,如何启动的。如何[bootstrapped]
传统上来说,[bootstrap]的意思为一个人打算穿上鞋站起来。在操作系统术语中,这个词代表着至少 要把操作系统的一部分(或者全部)载入到内存,并且使处理器开始执行它。 它也代表着对内核数据结构的初始化和一些用户进程的创建过程,并且将控制权转移到其中的某一个用户进程。
计算机的[bootstrap]是一个冗长乏味的工作,因为在初期(系统上电),几乎每个硬件设备,包块RAM,都处在随机的不可预知的状态。而且[bootstrap]过程十分依赖计算机的体系结构。就像本书中通常一样。我们介绍80X86的启动过程。
A.1.史前时代:BIOS 刚刚上电之后,计算机实际上是无用的,因为RAM芯片中的值是随机的并且没有操作系统在运行。为了开始 boot。一种特殊的硬件电路(RESET电路),向CPU的RESET引脚发出RESET信号。CPU接收到RESET信号,会将一些寄存器设定固定值(包括CS 和EIP),然后从物理地址0xfffffff0开始执行。这个地址被映射到ROM。存储在ROM中0xfffffff0地址的程序通常被称为Basic Input/Output System (BIOS)。在X86体系结构中,因为BIOS包含了几个中断驱动的低级的过程,这个过程可以被任何的操作系统用于在boot阶段来控制硬件设备。一些操作系统例如MS-DOS,依赖BIOS实现所有的系统调用。
一旦进入了保护模式,Linux就不再使用BIOS了,而是为每个硬件提供自己的设备驱动程序。事实上,BIOS程序必须执行在实模式下,因此无法共享一些功能(函数),即使共享会带来好处。(这里不太理解)
BIOS使用实模式的地址空间,因为在计算机开机之后,只有他们才是可用的。实模式地址由段地质和段内的偏移组成对应的物理地址为段地址*16 +段内偏移,因此CPU的寻址单元将逻辑地址转换位物理地址的时候,不需要全局描述符表。局部描述符表,页表。很明显,初始化全局描述符表,局部描述符表和页表的代码必须在实模式下。
Linux在[bootstrap]阶段需要使用BIOS,来找到内核映像在磁盘中(或者其他外部设备)的位置。BIOS bootstrap 实际上完成了下面四项的工作: 1,执行一系列检测硬件的命令,目的是确定哪些设备安装在了计算机上,它们是否工作正常。这个阶段通常被称为Power-On Self-Test (POST) 在这个阶段中,一些信息,如BIOS的版本号,被通过显示器显示出来。
2,初始化应建设备。这个阶段对于现代基于PCI体系的系统非常关键,因为其 允许所有的硬件设备在没有配置之前使用中断请求和输入/输出端口。在这个阶段结束之后,会表示出来已经安装的PCI设备。
3,查找一个操作系统来启动,实际上依赖BIOS的设定。BIOS也许尝试(预定义的顺序,或者通过用户定制)软盘的第一个扇区,硬盘的第一个扇区,光盘的第一个扇区。 4,只要找到一个有效的设备,bios就把第一个扇区的内容拷贝到内存0x7c00。并且挑砖到该地址开始执行。
本附录的其他内容将带你领略Linux系统的基本的启动状态到系统的完全运行的过程。
A.2远古时代:BootLoader(启动程序)启动程序由BIOS调用,它将操作系统的内核映像载入内存。让我们来简要勾勒一下在IBM的PC上,BootLoader是如何工作的为了使用软盘启动,存储在软盘第一个扇区的内容被拷贝到内存并且执行。这些指令将内核映像的其它扇区拷贝到内存。
而从硬盘启动就会有一些不同。硬盘的第一个扇区被称为MBR,MBR包含分区表和一个小程序。这个小程序将把包含用户想要启动操作系统的分区的第一个扇区拷贝到内存。例如WIN98,通过在分区表中的活动标志来选择哪个分区是活动的。也就是说,只有操作系统的内核映像载活动分区中,那个它才有可能被启动。
Linux使用更加灵活的方式,因为它替换了原来MBR中的原始程序,而是用成熟的BootLoader程序。BootLoader允许用户选择想要启动哪个操作系统。 2.4版本以前的内核,一如既往的包含了一个小的BootLoader程序,在第一个512字节中。因此把从软盘把内核拷贝到内存,从而可以启动系统。然而,从2.6版本开始,内核不再包含此BootLoader,因此如果想要从一个软盘启动,那么就需要把合适的BootLoader存储在软盘的第一个分区。现在,从软盘启动和从硬盘启动。光盘启动基本都一致了。
A2.1从硬盘启动为了从硬盘启动,需要一个two-stage的BootLoader. 如LILO ,GRUB要比LILO先进,因为它可以识别几种文件系统,因此可以从文件中读取部分启动程序。当然,存在一些特殊的BootLoader可以支持Linux支持的所有的体系结构。
LILO或者被安装在MBR,或者被安装在任何活动分区的BootSector,两种情况的最终结果都是一样的。当Loader执行的时候,用户必须选择启动哪个系统。
实际上。LILO BootLoader程序超过了一个扇区(512字节)因此它分为两部分,安装在MBR或者某个分区的BootSector中的小启动程序。这个小启动程序由BIOS拷贝到内存0X7C00。然后它将自己搬运到0X96A00。设置实模式的栈(0X98000 --0X969FF) 然后再把另外一部分的LILO BootLoader程序拷贝到0X96C00,并调转到0X96C00开始执行。后面的这个程序从硬盘读取可以启动的 的操作系统,并由用户选择。 最终,LILLO BootLoadre或者把对应的某个分区的BootSector拷贝到内存,或者把内核映像拷贝到内存。 LILO实际上做了下面的工作: 1,调用BIOS的例程,表示Loading 信息。 2,调用BIOS例程,把内核映像前512字节拷贝到0X90000地址。而setup()函数的地址为0X90200。 3,调用BIOS例程,将内核映像的其他部分从硬盘 拷贝到内存0X10000(或者0X10000,对于大内核)。 4,跳转到setup()函数 |
|