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
参考:滴水中级课程
Window内核学习之保护模式基础的更多相关文章
- linux内核学习之保护模式(一)
来源:http://blog.csdn.net/yishuige/article/details/50434746 这一章涉及intel8086系列cpu的保护模式编程,应该是学习内核编程,驱动编程及 ...
- ASM:《X86汇编语言-从实模式到保护模式》第13章:保护模式下内核的加载,程序的动态加载和执行
★PART1:32位保护模式下内核简易模型 1. 内核的结构,功能和加载 每个内核的主引导程序都会有所不同,因为内核都会有不同的结构.有时候主引导程序的一些段和内核段是可以共用的(事实上加载完内核以后 ...
- Linux操作系统基础(四)保护模式内存管理(2)【转】
转自:http://blog.csdn.net/rosetta/article/details/8570681 Linux操作系统基础(四)保护模式内存管理(2) 转载请注明出处:http://blo ...
- Linux从头学08:Linux 是如何保护内核代码的?【从实模式到保护模式】
作 者:道哥,10+年的嵌入式开发老兵. 公众号:[IOT物联网小镇],专注于:C/C++.Linux操作系统.应用程序设计.物联网.单片机和嵌入式开发等领域. 公众号回复[书籍],获取 Linux. ...
- MIT 6.828 JOS学习笔记6. Appendix 1: 实模式(real mode)与保护模式(protected mode)
在我们阅读boot loader代码时,遇到了两个非常重要的概念,实模式(real mode)和保护模式(protected mode). 首先我们要知道这两种模式都是CPU的工作模式,实模式是早期C ...
- 基础篇-Windows保护模式
1 一般来说,80x86(80386及其以后的各代CPU)可以在三种模式下运转:实模式,保护模式,V86模式.实模式就是古老的MS-DOS的运行环境.Win95只利用了两种模式:保护模式和V86模式. ...
- 【调试基础】Part 4 保护模式
保护模式.虚拟内存.权限
- 《linux 内核全然剖析》 chapter 4 80x86 保护模式极其编程
80x86 保护模式极其编程 首先我不得不说.看这章真的非常纠结...看了半天.不知道这个东西能干嘛.我感觉唯一有点用的就是对于内存映射的理解...我假设不在底层给80x86写汇编的话.我 ...
- EPROCESS 进程/线程优先级 句柄表 GDT LDT 页表 《寒江独钓》内核学习笔记(2)
在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB.把它们放到一起是因为这三个数据结构及其外延和w ...
随机推荐
- ssh 免登录配置
引子 近日海淘了一个 mini-PC:Gigabyte GB-BSRE-1605,此设备虽采用 amd 嵌入式低功耗处理器,性能相比现在自己所用的设备却有不小提升,加上先前升级电脑多余一些 ssd 和 ...
- Android 之 手动创建活动
•活动是什么 活动(Activity)是最容易吸引用户的地方,它是一种可以包含用户界面的组件: 主要用于和用户进行交互: 一个应用程序可以包含零个或多个活动. 接下来,我们来学习一下活动的基本用法. ...
- 七大php主流框架,你用过几个?
在php中,我们最常用的框架有七个,分别是Yii2.Laravel.Yaf.Thinkphp.Code Igniter.Zend Framework以及CakePHP,今天我们就来详细介绍一下他们.一 ...
- 翻译:《实用的Python编程》07_05_Decorated_methods
目录 | 上一节 (7.4 装饰器) | 下一节 (8 测试和调试) 7.5 装饰方法 本节讨论一些与方法定义结合使用的内置装饰器. 预定义的装饰器 在类定义中,有许多预定义的装饰器用于指定特殊类型的 ...
- 测开新手:从0到1,自动化测试接入Jenkins学习
大家好,我叫董鑫,一个在测试开发道路上的新手,之前一直从事手工功能测试,前段时间抽空又温习了一遍老师全栈测开训练营中自动化测试.CICD的知识,最近公司正好有一个项目可以实践练手,趁热打铁,将自动化测 ...
- 使用 EPPlus 封装的 excel 表格导入功能 (二) delegate 委托 --永远滴神
使用 EPPlus 封装的 excel 表格导入功能 (二) delegate 委托 --永远滴神 前言 接上一篇 使用 EPPlus 封装的 excel 表格导入功能 (一) 前一篇的是大概能用但是 ...
- 工作区和GOPATH
工作区和GOPATH 1.特性: 1.1.5版本的自举(即用 Go 语言编写程序来实现 Go 语言自身) 2.1.7版本的垃圾回收器 2.GOROOT.GOPATH 和 GOBIN GOROOT:Go ...
- 网络编程Netty IoT百万长连接优化
目录 IoT推送系统 IoT是什么 IoT推送系统的设计 心跳检测机制 简述心跳检测 心跳检测机制代码示例 百万长连接优化 连接优化代码示例 TCP连接四元组 配置优化 IoT推送系统 IoT是什么 ...
- WPF之小米Logo超圆角的实现
某些新闻:小米logo换新,程序员一行代码(border-radius:19px)实现,目前此行代码价值200万 某程序员内心:所以还是因为我代码写太少了,所以这200万才没有我的份吗? 这事儿也成功 ...
- 【Mybatis源码解析】- JDBC连接数据库的原理和操作
JDBC连接数据库的原理和操作 JDBC即Java DataBase Connectivity,java数据库连接:JDBC 提供的API可以让JAVA通过API方式访问关系型数据库,执行SQL语句, ...