mirror of
https://github.com/MintCN/linux-insides-zh.git
synced 2026-04-25 19:20:28 +08:00
Update Booting/linux-bootstrap-2.md
This commit is contained in:
@@ -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. DPL(2-bits, bit 45 和 46) (描述符优先级) 定义了该段的优先级。具体数值是0-3。
|
||||
|
||||
5. P 标志(bit 47) - 说明该内存段是否已经存在于内存中。如果`P` = 0,那么在访问这个内存段的时候将报错。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user