Update Booting/linux-bootstrap-1.md

This commit is contained in:
hailin cai
2016-03-01 09:08:18 -08:00
parent 0d57f65eb9
commit 9555043dbc

View File

@@ -18,7 +18,7 @@
不管怎样,如果你才开始学一些,我会在这些文章中尝试去解释一些部分。好了,小的介绍结束,我们开始深入内核和底层。
所有的代码实际上是内核 - 3.18.如果有任何改变,我将会做相应的更新。
我们的文章是基于 Linux 内核 3.18 版本进行的,如果后续的内核版本有任何改变,我将作出相应的更新。
神奇的电源按钮,接下来会发生什么?
--------------------------------------------------------------------------------
@@ -35,7 +35,7 @@ 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)工作,我们需要退回一点去理解在这种模式下的内存分割。所有 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并加上偏移量
```
PhysicalAddress = Segment * 16 + Offset
@@ -48,14 +48,14 @@ PhysicalAddress = Segment * 16 + Offset
'0x20010'
```
不过如果我们最大进行偏移`0xffff:0xffff`,将会是:
不过如果我们使用16位2进制能表示的最大进行寻址`0xffff:0xffff`根据上面的公式,结果将会是:
```python
>>> hex((0xffff << 4) + 0xffff)
'0x10ffef'
```
这超出1MB 65519字节。既然只有1MB在实模式中可以访问`0x10ffef` 变成有[A20](https://en.wikipedia.org/wiki/A20_line)缺陷的 `0x00ffef`
这超出 1MB 65519 字节。既然实模式下, CPU 只能访问 1MB 地址空间`0x10ffef` 变成有 [A20](https://en.wikipedia.org/wiki/A20_line) 缺陷的 `0x00ffef`
我们知道实模式和内存地址。回到复位后的寄存器值。