Window内核学习之保护模式基础
段寄存器#
段寄存器有6个分别是 cs,ss,ds,es,fs,gs。这些段寄存器包含16位的可见部分和80位的隐藏部分,共90位。
16位的可见部分就是我们知道的cs等段寄存器的值,我们可以在od中查看。
这16位可见部分也称为是段选择子,其16位的结构的最低两位是RPL即此段访问的请求权限级别,再往前一位是TI位,当TI位为0时表示查询GDT表,如果TI位为1表示查询LDT表。剩余13位为索引值,用来在GDT表或LDT表中索引对应的段描述符。
而剩余80位的不可见部分压缩存储在全局描述符表GDT或局部描述符表LDT的段描述符中,这80位的结构32位为段的Base,32位为段的范围大小,16位为段的属性。
struct Hidden Part
{
Base Address; //32位段基地址
Limit; //32位段范围
Access Information; //16位段属性
}
例如:mov eax,ds:[0x123456], 0x123456是虚拟地址,ds.base + 0x123456 是线性地址,最后利用分页机制再将其映射到对应的物理地址上。(一般除了fs段寄存器之外,其他的段寄存器的基地址都为0)
读写段寄存器#
读寄存器通过mov指令,mov ax,cs
读寄存器指令只是将cs段寄存器的16位可见值放到了ax中。
写寄存器通过mov指令或les,lds等指令,mov ds,ax
此指令将ax的值传送到ds中,因为ds段选择子的索引值发生变化了所以其指向的段描述符也变化了,实际是相当于将隐藏的80位的值进行了复制,一共传输了96位。
GDT全局描述符表与段描述符#
GDTR,LDTR,TR,IDTR#
GDTR是全局描述符表寄存器有48位,其中32位为全局描述符表的基地址,16位为全局描述符表的范围大小。在windbg中可以查看对应gdtr的基地址与大小。
LDTR是局部描述符表寄存器也是16位,IDTR是中断描述符表寄存器有48位,TR是任务寄存器有16位。
段描述符#
x86中段描述符是8个字节,也就是段描述符表中每8个字节为1个段描述符。
段描述符的结构如下:
P位#
当P位为1时表示此段描述符有效,P位为0表示此段描述符无效。
G位#
我们知道段寄存器不可见的80位压缩存储在64位的段描述符中,我们看到基地址的32位分布在段描述符中,而16位的段属性Access Information就是段描述符中的8-23位,但是段大小只有0-19位直接存储到段描述符中了(0xFFFFF)。
当G位为0时,段描述符中存储的段的大小的单位为字节,所以其能表示的段的大小为0 - 0xFFFFF。
当G为为1时,段描述符中存储的段的大小的单位为4kb,所以其能表示的段的大小为0xfff - 0xffffffff。(也就是当G为1时,如果段描述符中存的段的大小值为0,那么其实际段的大小为0xfff,这也解释了fs段寄存器一般大小都为0xfff)
S位#
当S位为1时表示此段描述符表示的是代码段或数据段
当S位为0时表示此段描述符表示的是系统段
Type位#
当此段描述符表示的是数据段时,第11位为0,A位表示是否已经被访问,W表示是否可写,E位为扩展方向位。
当此段描述符表示的是代码段时,第11位为1,A位表示是否已经被访问,R表示是否可读,C位为一致位(1为一致,0为非一致)
当此段描述符表示的是系统段时,其表示是中断门还是陷阱门,或者是TSS。
D/B位#
对cs段的影响:当D/B位为1时采用32位寻址方式,当为0时采用16位寻址方式。(硬编码前缀67可以修改寻址方式为16位的)
对ss段的影响:当D/B位为1时隐式堆栈访问指令改变ESP,当为0时改变SP。
对向下扩展数据段的影响:当D/B位为1时段上限为4GB,当为0时段上限为0。
RPL,CPL与DPL#
RPL:段选择子的低两位就是RPL,其为此段访问的请求权限级别。(一个段描述符可以由多个段选择子索引,这些段选择子可以有不同的请求权限级别)
CPL:cs段选择子的低两位就是CPL,其指定了当前代码位于哪一环。
DPL:其规定当前段的需要的访问请求级别,位于段描述符中。
-
对于数据段而言(s位为1,type位的最高位为0),访问此段描述符时需要 CPL <= DPL,RPL <= DPL
-
对于代码段而言(s位为1,type位的最高位为1),访问此段描述符时如果此代码段为非一致代码段则需要CPL == DPL,RPL <= DPL。如果此代码段为一致代码段则需要CPL >= DPL。
例如:如果gdtr中第9项段描述符为一个DPL == 0的一致代码段。
假如此时cs == 0x1B,所以CPL == 3,段选择子为0x4b,所以RPL == 3,因为其是一致代码段,而CPL > DPL,所以可以访问此段描述符。
mov eax,0x4B
mov ds,ax
参考:滴水中级课程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】