Refined chapter 1.1 before Bootloader

This commit is contained in:
ye11ow
2017-05-28 19:34:03 +08:00
parent a73bf199e4
commit 2fdaaf4d99

View File

@@ -20,7 +20,7 @@
神奇的电源按钮,接下来会发生什么?
--------------------------------------------------------------------------------
尽管这一系列文章关于 Linux 内核,我们在第一章并不会从内核代码开始。电脑在你按下电源开关的时候,就开始工作。主板发送信号给[电源](https://en.wikipedia.org/wiki/Power_supply),而电源收到信号后会给电脑供应合适的电量。一旦主板收到了[电源备妥信号](https://en.wikipedia.org/wiki/Power_good_signal),它会尝试启动 CPU 。CPU 则复位寄存器的所有数据,并设置每个寄存器的预定值。
尽管这一系列关于 Linux 内核的文章,我们在第一章并不会从内核代码开始。电脑在你按下电源开关的时候,就开始工作。主板发送信号给[电源](https://en.wikipedia.org/wiki/Power_supply),而电源收到信号后会给电脑供应合适的电量。一旦主板收到了[电源备妥信号](https://en.wikipedia.org/wiki/Power_good_signal)它会尝试启动 CPU 。CPU 则复位寄存器的所有数据,并设置每个寄存器的预定值。
[80386](https://en.wikipedia.org/wiki/Intel_80386)
@@ -32,13 +32,13 @@ CS selector 0xf000
CS base 0xffff0000
```
处理器开始在[实模式](https://en.wikipedia.org/wiki/Real_mode)工作我们需要退回一点去理解在这种模式下的内存分割。所有 x86兼容处理器都支持实模式从 [8086](https://en.wikipedia.org/wiki/Intel_8086)到现在的 Intel 64 位 CPU。8086 处理器有一个20位寻址总线这意味着它可以对0到 2^20 位地址空间进行操作 1Mb .不过它只有16位的寄存器通过这个16位寄存器最大寻址是 2^16 即 0xffff 64 Kb)。实模式使用[段式内存管理](http://en.wikipedia.org/wiki/Memory_segmentation) 来管理整个内存空间。所有内存被分成固定的 64KB 大小的小块。由于我们不能用16位寄存器寻址大于 64KB 的内存一种替代的方法被设计出来了。一个地址包括两个部分数据段起始地址和从该数据段起的偏移量。为了得到内存中的物理地址我们要让数据段乘16并加上偏移量
处理器开始在[实模式](https://en.wikipedia.org/wiki/Real_mode)工作我们需要退回一点去理解在这种模式下的内存分段机制。从 [8086](https://en.wikipedia.org/wiki/Intel_8086)到现在的 Intel 64 位 CPU,所有 x86兼容处理器都支持实模式。8086 处理器有一个20位寻址总线这意味着它可以对0到 2^20 位地址空间( 1MB 进行操作。不过它只有16位的寄存器所以最大寻址空间是 2^16 即 0xffff 64 KB)。实模式使用[段式内存管理](http://en.wikipedia.org/wiki/Memory_segmentation) 来管理整个内存空间。所有内存被分成固定的65536字节64 KB 大小的小块。由于我们不能用16位寄存器寻址大于 64KB 的内存一种替代的方法被设计出来了。一个地址包括两个部分数据段起始地址和从该数据段起的偏移量。为了得到内存中的物理地址我们要让数据段乘16并加上偏移量
```
PhysicalAddress = Segment * 16 + Offset
```
举个例子,如果 `CS:IP``0x2000:0x0010`, 相关的物理地址将会是:
举个例子,如果 `CS:IP``0x2000:0x0010`, 则对应的物理地址将会是:
```python
>>> hex((0x2000 << 4) + 0x0010)
@@ -96,7 +96,7 @@ SECTIONS {
}
```
现在BIOS已经开始工作了。在初始化和检查硬件之后需要寻找到一个可引导设备。可引导设备列表存储在在 BIOS 配置中, BIOS 将根据其中配置的顺序尝试从不同的设备上寻找引导程序。对于硬盘BIOS 将尝试寻找引导扇区。如果在硬盘上存在一个MBR分区那么引导扇区储存在第一个扇区(512字节)的头446字节引导扇区的最后必须是 `0x55``0xaa` 这2个字节称为魔术字节如果 BIOS 看到这2个字节就知道这个设备是一个可引导设备。举个例子
现在BIOS已经开始工作了。在初始化和检查硬件之后需要寻找到一个可引导设备。可引导设备列表存储在在 BIOS 配置中, BIOS 将根据其中配置的顺序尝试从不同的设备上寻找引导程序。对于硬盘BIOS 将尝试寻找引导扇区。如果在硬盘上存在一个MBR分区那么引导扇区储存在第一个扇区(512字节)的头446字节引导扇区的最后必须是 `0x55``0xaa` 这2个字节称为魔术字节Magic Bytes),如果 BIOS 看到这2个字节就知道这个设备是一个可引导设备。举个例子
```assembly
;