前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >x86保护模式下的内存分段的地址映射

x86保护模式下的内存分段的地址映射

作者头像
lexingsen
发布2022-02-25 08:32:24
6310
发布2022-02-25 08:32:24
举报
文章被收录于专栏:乐行僧的博客

阅读此文,先熟悉x86体系早期的实模式下的内存分段的地址映射

正是由于在实模式下直接对物理内存进行读写,非常不安全,所以诞生了新的内存分段的映射方式,其目的就是对物理内存进行保护,而对内存进行保护需要注意的是一下三点:

1.内存的起始地址。

2.内存的长度。

3.内存的权限信息。

此时CPU的架构已经来到了32位,寻址能力达到了2^32=4G。此前的分段地址映射的模式已经不再适用,但是Intel x86的CPU为了能够保证整个体系向前兼容的能力,所以它并不能删除80386之前已有的CPU内部寄存器,如段寄存器CS,DS,SS。它的解决办法是对已有的段寄存器做出新的定义。

保护模式下内存分段的地址映射的模式:段描述符+段表。

其中段表是由段表项组成的,那么有多少个段表项?,段表项具体描述了什么信息?,每个段表项有多大字节?,段表的起始地址在哪里存放?,带着这些个问题,接下来一一分析。

(1)对段寄存器的重新定义,即段描述符:

从上图可以看到段表的下标的最大值为2^13=8192个,但是由于Linux内核使用了12个,那么剩余了8180个段表项可以被使用。

(2)因为8086中的段寄存器已经被重新定义,所以80386扩充了新的寄存器LDTR,GDTR寄存器,用于存放段表的起始地址。

(3)段表项是如何定义的?接下来看段表项描述符:

可以看到段表项大小为64位,即8字节大小。其中地址信息占用32位,描述段长度信息占用20,2^20=1M,但是具体能够描述多大的段,它的单位是由G位来决定的,G=0表示描述的单位是字节,即描述段大小位1MB。G=1表述描述的单位是一个页面4KB,此时1M*4KB=4GB,刚刚是32位下整个寻址空间大小。

x86保护模式下内存分段和内存分页的地址映射的工作流程:

1.通过段寄存右移三位,获得在段表中的下标。

2.根据段寄存的TI判断使用GTRD或LDTR。

3.从LDTR或GTRD中拿到段描述符表的起始地址。

4.如TI=0使用GDT, GDTRCS>>3.BaseAddress + IP(需要与length做比较,方式越界) = 线性地址,由于此处没有分页的机制,线性地址就是物理地址。可以直接进行访问了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档