From 7a02d63cc3df4371e19c2ec2877daf5c7ec7cccb Mon Sep 17 00:00:00 2001 From: hailin cai Date: Tue, 2 Feb 2016 15:28:53 -0500 Subject: [PATCH] Update Booting/linux-bootstrap-2md.md --- Booting/linux-bootstrap-2md.md | 35 +++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/Booting/linux-bootstrap-2md.md b/Booting/linux-bootstrap-2md.md index e9093cb..b21dbe3 100644 --- a/Booting/linux-bootstrap-2md.md +++ b/Booting/linux-bootstrap-2md.md @@ -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: \ No newline at end of file +`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)。 \ No newline at end of file