首页
论坛
课程
招聘
[原创]【Windows内核探索】[保护模式篇]6.段描述符
2022-7-2 19:26 3596

[原创]【Windows内核探索】[保护模式篇]6.段描述符

2022-7-2 19:26
3596

上一节我们说到,需要划分权限,让操作系统和应用处在不同的权限中,以保证系统安全;
并且决定基于段机制进行延展。

 

相较于实模式的1MB寻址(2^20),保护模式下的寻址范围已经达到了4GB(2^32),在汇编指令上可以直接书写4字节的内存地址。

段寄存器

此时,段寄存器的16位宽度已经显得有些相形见绌了。
为了扩展,段寄存器在保护模式下,不再直接存放段的基址,而是存放了索引

全局描述符表 (Global Descriptor Table)

具体是索引什么呢?
这里引入了一张表,叫做全局描述符表,其实就是在内存中存放的数组。
其元素为描述符,在内存中顺序组织起来,也就是一张表。

 

描述符有数种类型,其中一种名为段描述符,描述段的信息。

  • 简称GDT

段选择子

段寄存器由于有了新的用途,因此也有了新的名字,叫做段选择子

大概是意为用于选择段的寄存器吧

段描述符

那么说回段描述符,它究竟有什么作用呢?为什么会有这么一个东西呢?

段描述符是GDT或LDT(暂时忽略)中的元素;
它为处理器提供诸如段基址,段大小,访问权限及状态等信息。

  • 先来看英特尔白皮书上对段描述符的图示
    • 图片描述

每个段描述符是8字节,由多个字段组成。
我们发现,字段的排列有些混乱,基址(Base)、界限(Limit)甚至需要跨几个字段组合。

据说是英特尔为了兼容,这里也不做探究。

 

字段这么多,咱们先来看最熟悉的基址字段。
还记得 4.段寄存器 小节中的 CPU对内存的访问 那部分吗?
在实模式下,cpu访问任何在汇编指令中显式书写的地址,都会将地址视作偏移(逻辑地址),加上段基地址形成真正的物理地址。

 

在这里也不例外,只不过段寄存器并不直接存放段基址了,而是存放用于了在GDT中选择段描述符的索引值。

访问内存

至此,我们也能初步设想在保护模式下,CPU是如何基于段访问内存的:

1
mov eax, dword ptr ds:[0x12345678]
  1. 汇编指令中的内存地址(偏移,offset)是0x12345678
  2. 汇编指令中指定使用的段寄存器是 ds
  3. 访问ds段寄存器,得到索引(index)
  4. 访问GDT[index],得到段描述符;
  5. 解析段描述符中的Base字段;
  6. ds.Base + offset = 最终的物理地址
  7. 通过物理地址访问内存。

当然,实际过程并非只有列出来的这些部分,留待后边再做讨论。


看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

最后于 2022-7-11 09:46 被yuyuaqwq编辑 ,原因:
收藏
点赞3
打赏
分享
最新回复 (3)
雪    币: 13
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
我skyddr 活跃值 2022-7-3 10:28
2
0
感谢楼主,给力
雪    币: 46
活跃值: 活跃值 (659)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NutCracker 活跃值 2022-7-3 11:11
3
0
明明是抄书,还好意思叫原创
雪    币: 238
活跃值: 活跃值 (1569)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yuyuaqwq 活跃值 2022-7-3 15:18
4
0
NutCracker 明明是抄书,还好意思叫原创
游客
登录 | 注册 方可回帖
返回