Update Booting/linux-bootstrap-2.md

This commit is contained in:
hailin cai
2016-02-24 12:25:57 -05:00
parent ab6907664e
commit c6a2a5486a

View File

@@ -73,7 +73,7 @@ lgdt gdt
粗粗一看,上面的结构非常吓人,不过实际上这个结构是非常容易理解的。比如在上图中的 LIMIT 15:0 表示这个数据结构的0到15位保存的是内存段的大小的0到15位。相似的 LIMITE 19:16 表示上述数据结构的16到19位保存的是内存段大小的16到19位。从这个分析中我们可以看出每个内存段的大小是通过20位进行描述的。下面我们将对这个数据结构进行仔细分析
1. Limit[20位]被保存在上述内存结构的0-15和16-19位。根据上述内存结构中`G`位的设置这20位内存定义的内存长度是不一样的。下面是一些具体的例子
1. Limit[20位] 被保存在上述内存结构的0-15和16-19位。根据上述内存结构中`G`位的设置这20位内存定义的内存长度是不一样的。下面是一些具体的例子
* 如果`G` = 0, 并且Limit = 0 那么表示段长度是1 byte
* 如果`G` = 1, 并且Limit = 0, 那么表示段长度是4K bytes
@@ -86,7 +86,7 @@ lgdt gdt
* 如果G = 1, 那么内存段的长度是按照4K bytes进行增长的 ( Limit每增加1段长度增加4K bytes )最大的内存段长度将是4G bytes;
* 段长度的计算公司是 base_seg_length * ( LIMIT + 1)。
2. Base[32-bits]被保存在上述地址结构的0-15 32-39以及56-63位。Base定义了段基址。
2. Base[32-bits] 被保存在上述地址结构的0-15 32-39以及56-63位。Base定义了段基址。
3. Type/Attribute (40-47 bits) 定义了内存段的类型以及支持的操作。
* `S` 标记( 第44位 )定义了段的类型,`S` = 0说明这个内存段是一个系统段`S` = 1说明这个内存段是一个代码段或者是数据段 堆栈段是一种特使类型的数据段,堆栈段必须是可以进行读写的段 )。
@@ -127,7 +127,7 @@ lgdt gdt
* 如果`C` = 1说明这个代码段可以被低优先级的代码访问比如可以被用户态代码访问。反之如果`C` = 0说明只能同优先级的代码段可以访问。
* 如果`R` = 1说明该代码段可读。代码段是永远没有写权限的。
4. DPL[2-bits, bit 45 和 46] (描述符优先级) 定义了该段的优先级。具体数值是0-3。
4. DPL2-bits, bit 45 和 46 (描述符优先级) 定义了该段的优先级。具体数值是0-3。
5. P 标志(bit 47) - 说明该内存段是否已经存在于内存中。如果`P` = 0那么在访问这个内存段的时候将报错。