From 9555043dbcf39ee5aa1c301f9c34e50de5e6e8f2 Mon Sep 17 00:00:00 2001 From: hailin cai Date: Tue, 1 Mar 2016 09:08:18 -0800 Subject: [PATCH] Update Booting/linux-bootstrap-1.md --- Booting/linux-bootstrap-1.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Booting/linux-bootstrap-1.md b/Booting/linux-bootstrap-1.md index 44115e0..29e8531 100644 --- a/Booting/linux-bootstrap-1.md +++ b/Booting/linux-bootstrap-1.md @@ -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`。 我们知道实模式和内存地址。回到复位后的寄存器值。