【发布时间】:2017-10-19 11:49:54
【问题描述】:
引导过程有点混乱,希望我理解正确。我将尝试描述我的理解,希望可以得到纠正。因为这非常重要,所以我想深入了解一些小细节。
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
.
.
.
我的问题:
引导加载程序如何知道内核在哪里找到?
据我所知,ELF标头包含装船机应加载的扇区数。但是它如何找到这个ELF标头? 它使用什么结构来查找这些详细信息?Bios 位于
EEPROM芯片上,但有些书喜欢显示 BIOS 位于硬盘的第一个扇区,而引导加载程序位于第二个扇区。这让我有点困惑。内核是否总是被带入主内存中的相同地址?如果是,谁/什么决定了这个地址?
引导加载程序是否总是被带到
0x0000 - 0x7c00内存块?
欢迎提供有关流程的任何其他信息。而且我确信我错过了这 3 个中的一些责任。
【问题讨论】:
标签: linux ubuntu linux-kernel operating-system