ucore-project5: mm(2)

32 篇文章 0 订阅
6 篇文章 0 订阅

看内核刚进入时加载临时gdt的代码:

lgdt __gdtdesc - KERNBASE

.data
gdt:
...
__gdtdesc:
    .word 0x17
    .long gdt-KERNBASE

 

其中KERNBASE = 0xC0000000。在lgdt指令中,使用了__gdtdesc的真实物理地址,而在__gdtdesc中,使用了gdt的真实物理地址。其中lgdt指令中的__gdtdesc真实地址,应该是要经过段式处理的,而__gdtdesc中的gdt地址呢?是否也需要经过段式处理才能访问呢?

 

查看intel的文档,GDTR/IDTR中的基地址,都是线性地址,LDTR/TR/CS/DS/ES/FS/GS/SS中不可见部分保存的基地址,也都是线性地址。在intel文档中有逻辑地址、线性地址和物理地址三种地址概念,其中逻辑地址包括段选择子和偏移值,逻辑地址经过运算(就是段选择子指定的段描述符中的基地址加上偏移值),将生成一个线性地址,而在启用了分页的情况下,线性地址经过页式转换,最终才生成物理地址。所以只有逻辑地址才需要经过段式处理,而GDTR/IDTR以及一系列存放选择子的段寄存器的不可见部分中保存的是线性地址,也就是无需再次进行段式处理的地址。

 

而CR3中保存的是当前页目录表的“物理地址”,就是说,可以直接拿来用的地址,无需进行段式处理,也无视进行页式处理,直接放到外部总线上就可以访问内存了。

 

可以看出,GDTR、IDTR等寄存器中的线性地址都可以分页,但CR3中的物理地址却不可再分段。这也很好理解,在x86 cpu中,地址都是先经过分段,然后再分页的,分页处理后的地址已经是物理地址了,不能再次进行处理了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值