PC引导程序一步一步

时间:2017-05-19 11:08:45

标签: linux ubuntu linux-kernel operating-system

引导过程有点令人困惑,我希望我理解正确。我将尝试描述我的理解,并希望可以纠正。因为这是非常重要的,我想深入了解细节。

BIOS:
它设置中断描述符表初始化各种设备。在初始化BIOS知道的所有重要设备后,它会搜索bootable设备,例如软盘,硬盘驱动器或CD-ROM。 硬盘分为512个字节区域,称为sectors,第一个扇区称为boot-sector。一旦BIOS找到可引导的软盘或硬盘,它就会将512字节的引导扇区加载到内存中,然后将控制权传递给引导加载程序。

引导装载
 1.引导加载程序将处理器从实模式切换到32位保护模式,因为只有在这种模式下,软件才能访问处理器物理地址空间中1MB以上的所有内存。  2.引导加载程序从硬盘读取内核

内核:
内核从一些汇编语言代码开始,这些代码设置正确,以便C语言代码可以正确执行。并启用paging

Memory layout

|---------|
|         |
|   boat  | Sector 0
|  loader |
|         |
|---------|
|         |
|         |
|         | Sector 1
     .
     .
     .

我的问题:

  1. boot-loader如何知道内核的位置?
    根据我的记忆,ELF标题包含了装载者应加载的扇区数。但它如何找到这个ELF标题? 它用什么结构来查找这些细节?

  2. Bios位于EEPROM芯片上,但有些书籍表明BIOS位于硬盘的第一个扇区,而引导程序位于第二个扇区。这让我感到困惑。

  3. 内核是否总是被带到主内存中的相同地址?若然,是谁/什么决定了这个地址?

  4. 引导加载程序是否总是被带到0x0000 - 0x7c00内存块?

  5. 欢迎任何有关该流程的其他信息。我相信我错过了这些3的一些责任。

2 个答案:

答案 0 :(得分:2)

  

boot-loader如何知道内核的位置?

实际上,512字节的boot-loader不会加载OS内核本身,而是加载第二个boot-loader阶段。第二阶段通常称为引导加载程序。它可能是Windows bootmgtgrublilo或其他一些。这个引导加载程序通常位于磁盘的固定位置,有时是第二扇区,有时是第二个扇区...

然后,细节会有所不同,但通常更大的引导加载程序会加载一个配置文件,告诉它们真实内核的位置。有时甚至包括读取完整文件系统的代码。

  

Bios位于EEPROM芯片上,但有些书籍表明BIOS是第一个扇区。

也许他们将第一个扇区的第一阶段引导扇区与下一个扇区中的第二阶段引导加载器混合在一起?

  

内核是否总是被带入主内存中的相同地址?   引导加载程序是否总是被带到0x0000 - 0x7c00内存块?

在标准的32位PC中,引导扇区始终在地址0000:7C00加载,仍处于实模式。这是IBM-PC时代的标准PC惯例。 然后,它将在第二阶段加载它将决定并传递的任何内存。这就是为什么每次安装启动加载程序时都必须重写启动扇区。 一些启动加载器将切换到保护模式并直接加载操作系统,而其他启动加载器将在实模式下工作,操作系统内核将切换到保护模式并将其自身移至高端内存。

答案 1 :(得分:1)

  1. 据我所知The Bootloader(至少grub)使用文件系统和配置文件中设置的路径来确定要加载的文件
  2. Bios位于EEPROM芯片上,这本书可能只是令人困惑。

  3. 据我所知,它不是Context的地址相同(不确定)

  4. 据我所知Master Boot Record是在Harddrive的开头,它通常包含引导加载程序的第一个阶段。