mirror of
https://github.com/MintCN/linux-insides-zh.git
synced 2026-04-25 11:11:20 +08:00
Update Booting/linux-bootstrap-2md.md
This commit is contained in:
@@ -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)。
|
||||
Reference in New Issue
Block a user