From 95bce96d7a60523a4169cbed9426b8498a31c4b6 Mon Sep 17 00:00:00 2001 From: hailin cai Date: Fri, 5 Feb 2016 12:21:21 -0500 Subject: [PATCH] Update Booting/linux-bootstrap-2md.md --- Booting/linux-bootstrap-2md.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Booting/linux-bootstrap-2md.md b/Booting/linux-bootstrap-2md.md index 9f22a5b..363945b 100644 --- a/Booting/linux-bootstrap-2md.md +++ b/Booting/linux-bootstrap-2md.md @@ -140,7 +140,7 @@ lgdt gdt * 栈段(由SS寄存器指向的数据段)。此时该标志称为B(Big)标志,用于指明隐含堆栈操作(如PUSH、POP或CALL)时的栈指针大小。如果该标志置位,则使用32位栈指针并存放在ESP寄存器中;如果该标志为0,则使用16位栈指针并存放在SP寄存器中。如果堆栈段被设置成一个下扩数据段,这个B标志也同时指定了堆栈段的上界限。 * 下扩数据段。此时该标志称为B标志,用于指明堆栈段的上界限。如果设置了该标志,则堆栈段的上界限是0xFFFFFFFF(4GB);如果没有设置该标志,则堆栈段的上界限是0xFFFF(64KB)。 -在保护模式下,段寄存器保存的不再是一个内存段的基地址,而是一个称为`段选择器`的结构。每个段描述符都对应一个`段选择器`。`段选择器`是一个16位的数据结构,下图显示了这个数据结构的内容: +在保护模式下,段寄存器保存的不再是一个内存段的基地址,而是一个称为`段选择子`的结构。每个段描述符都对应一个`段选择子`。`段选择子`是一个16位的数据结构,下图显示了这个数据结构的内容: ``` ----------------------------- @@ -152,4 +152,14 @@ lgdt gdt * **Index** 表示在GDT中,对应段描述符的索引号。 * **TI** 表示要在GDT还是LDT中查找对应的段描述符 * **RPL** 表示请求者优先级。这个优先级将和段描述符中的优先级协同工作,共同确定访问是否合法。 - + +在保护模式下,每个段寄存器实际上包含下面2部分内容: +* 可见部分 - 段选择子 +* 隐藏部分 - 段描述符 + +在保护模式中,cpu是通过下面的步骤来找到一个具体的物理地址的: + +* 代码必须将相应的`段选择子`装入某个段寄存器 +* CPU根据`段选择子`从GDT中找到一个匹配的段描述符,然后将段描述符放入段寄存器的隐藏部分 +* 在没有开启分页机制的情况下,并且没有使用向下扩展段,那么内存段的基地址就是`段描述符中的基地址`,段描述符的`limit + 1`就是内存段的长度。 +