Update Booting/linux-bootstrap-2md.md

This commit is contained in:
hailin cai
2016-02-02 15:28:53 -05:00
parent fe37a05558
commit 7a02d63cc3

View File

@@ -51,4 +51,37 @@ PhysicalAddress = Segment * 16 + Offset
lgdt gdt
```
`lgdt`汇编代码将把全局描述符表的基地址和大小保存到`GDTR`寄存器中。`GRTD`是一个48位的寄存器where the `lgdt` instruction loads the base address and limit(size) of global descriptor table to the `GDTR` register. `GDTR` is a 48-bit register and consists of two parts:
`lgdt`汇编代码将把全局描述符表的基地址和大小保存到`GDTR`寄存器中。`GRTD`是一个48位的寄存器这个寄存器中的保存了2部分的内容:
* 全局描述符表的大小 (16位
* 全局描述符表的基址 (32位)
就像前面的段落说的,全局描述符表包含了所有内存段的`段描述符`。每个段描述符长度是64位结构如下图描述
```
31 24 19 16 7 0
------------------------------------------------------------
| | |B| |A| | | | |0|E|W|A| |
| BASE 31:24 |G|/|L|V| LIMIT |P|DPL|S| TYPE | BASE 23:16 | 4
| | |D| |L| 19:16 | | | |1|C|R|A| |
------------------------------------------------------------
| | |
| BASE 15:0 | LIMIT 15:0 | 0
| | |
------------------------------------------------------------
```
粗粗一看上面的结构非常吓人不过实际上这个结构是非常容易理解的。比如在上图中的LIMIT 15:0表示这个数据结构的0到15位保存的内存段的大小的0到15位。相似的LIMITE 19:16表示上述数据结构的16到19位保存的是内存段大小的16到19位。从这个分析中我们可以看出每个内存段的大小是通过20位进行描述的。下面我们将对这个数据结构进行仔细分析
1. 内存段长度[20位]被保存在上述内存结构的0-15和16-19位。根据上述内存结构中`G`位的设置这20位内存定义的内存长度是不一样的。下面是一些具体的例子
* 如果`G`= 0, 并且Limit = 0 那么表示段长度是1 byte
* 如果`G` = 1, 并且Limit = 0, 那么表示段长度是4K bytes
* 如果`G` = 0并且Limit = 0xfffff那么表示段长度是1M bytes
* 如果`G` = 1并且Limit = 0xfffff那么表示段长度是4G bytes
从上面的例子我们可以看出:
* 如果G = 0, 那么内存段的长度是按照1 byte进行增长的 ( Limit每增加1段长度增加1 byte )最大的内存段长度将是1M bytes
* 如果G = 1, 那么内存段的长度是按照4K bytes ( Limit每增加1段长度增加4K bytes )进行增长的最大的内存段长度将是4G bytes;
* 段长度的计算公司是 base_seg_length * ( LIMIT + 1)。