VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1074|回复: 2

[原创] 实模式到保护模式!关于段寄存器的实验!

[复制链接]
75_avatar_middle
最佳答案
23 
online_supermod 发表于 2020-3-23 12:08:21 | 显示全部楼层 |阅读模式
本帖最后由 wl1383838438 于 2020-3-23 12:22 编辑

我尽量用简短的描述,尽可能让大部分的人都能理解,请一定要熟记下面的 转换分解,
否则在后面的段选择子实验,你可能会无从下手,甚至看不明白!
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
   0         1      2       3      4       5       6       7       8       9      a        b       c      d        e      f


游客,如果您要查看本帖隐藏内容请回复




这是段描述符的图
实模式到保护模式!关于段寄存器的实验!

先大概理解一下图  后面讲解
我希望在看这片帖子的时候,大家是有汇编基础的起码你要知道如下
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
   0         1      2       3      4       5       6       7       8       9      a        b       c      d        e      f



现在这个是段选择子的图!  在后面我们会拆分!所有先看图,拆分的时候对着图拆
实模式到保护模式!关于段寄存器的实验!
我们看看   他的结构从0到15
RPL特权请求等级 0-1   值是 00 01 10 11,4个等级
TI   的值决定了哪一张表LDT=1,GDT=0;
INDEX 3-15
那么现在我们来拆分一个 0x33
3对着上面的表拆 3等于0011,2个3那就是0011 0 011

现在对照段选择子图来拆分,首先我们拆0-1是2个位        0011 0011的0-1是11那么久表示RPL等于11
RPL=11请求特权级别是4从0开始算 00   01   10  11      --0123其实就是第4个
TI标的位是0,对照表看0表示查GDT表
接着看3-15位=6
我们在多拆机个,测试

2b----0010 1011
RPL=请求特权级别4
TI 0;
index 5;

端选择子拆分需要熟练因为在后期段属性检查的时候还是需要配合扎实的基本功!

再拆一个
0x 53
0101 0 011
RPL=11也就是级别等于4
TI 0
index =a 也就是10


现在我们来看段描述符的属性




现在我们用段选择子来找GDT表中段来拆分一下以我自己的windbg为例子,系统不一样差别不大
看图,

拆分23
0010 0 0 11
RPL=11
TI 0
INDEX=4
也就是查找第5个0-4=5;
打开windbg
1 输入kd> r gdtr
2 gdtr=8003f000
3 kd> dq 8003f000
8003f000  00000000`00000000 00cf9b00`0000ffff
8003f010  00cf9300`0000ffff 00cffb00`0000ffff
8003f020  00cff300`0000ffff 80008b04`200020ab
8003f030  ffc093df`f0000001 0040f300`00000fff
8003f040  0000f200`0400ffff 00000000`00000000
8003f050  80008954`b0000068 80008954`b0680068
8003f060  00009302`2f40ffff 0000920b`80003fff
8003f070  ff0092ff`700003ff 80009a40`0000ffff

00cff300`0000ffff我们来拆分这个!
   
‭‭1 0000 0000 1100 1111 1111       0011 0000 0000‬‬  
我们对着  段描述符来拆分先拆base
base=32-24=1100=c;1111=f;
base 0 -7=0000 0000所以32-24=cf00
再加上‭0000 0000 0000 0000 1111 1111 1111 1111 --0000ffff低4字节的前16-31
‬
          0000 0000 1100 1111 1111 0011 0000 0000-----00cff300高4字节
现在我们看G位   G位是1表示  后面补12个1也是FFFFFFFF   假如为0的话前面补12个0

00cff300  快速查看G位的方法是看高四字节的的第9位也就是说这里
                  9   DB  L   A  SEG     p
0000 0000 1    1    0  0   1111   1  111 0011 0000 0000
这个位置是G位表示为1;
然后接着看DB位  该位置决定了地址里面的模式最大能写多宽16或者32位;
DB位为1时是32位模式,为0是表示16位!
L位,假如为1 则表示在此代码段在64位模式下执行,这里的L位  为0
AVL位暂时还不得而知,

‭0000 0000 0000 0000  1111 1111 1111 1111
SEG的段限长为高字节16-19+低字节的0-15    ==FFFFF也就是5个F
P为决定了数据段的有效性,p=1时表示端在内存中存在,诺P为0时如 00000000中的0<8,段不存在

接着系统段

DPL段我忘记了,嘿嘿
                  9   DB  L   A  SEG     p
0000 0000 1    1    0  0   1111   1  111 0011 0000 0000
S位  可以判断出是系统段或者代码or数据段  这里的S位 是1表示的是代码或者数据段,如果是代码段或者数据段我们知己看TYPE位

TYPE我们可以看出 8-11是type位0011 这是Type位
我们看图    0011 按照下图对照查看

实模式到保护模式!关于段寄存器的实验!

0011 是3
A位是1 W位也是1E位是0表示向下扩展,可读可写并且加载过A=1表示加载过!

  这只是一个临时的手稿,楼主属于自学程序员(各种理解有些出入),该帖子的实践技术来自于海哥,帖子中如有技术性错误,请联系,作者会加以修正,也希望大家能一起交流探讨!更新未完,后期将持续更新,但是时间会慢些!


实模式到保护模式!关于段寄存器的实验!




上一篇:WinDbg常见的命令!转载的
下一篇:deepin系统下C++编程系列(科普,非精通)5.1员工管理系统编写
58_avatar_middle
最佳答案
58 
online_vip 发表于 2020-3-27 09:54:05 | 显示全部楼层
谢谢老铁,我前进的引路人,照明灯。
75_avatar_middle
最佳答案
23 
ico_lz  楼主| 发表于 2020-3-27 11:33:07 | 显示全部楼层
thzzl 发表于 2020-3-27 09:54
谢谢老铁,我前进的引路人,照明灯。

你写到哪里了?  我这几天都在复习 感觉 学习的好慢,学得快理解不了
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-12-3 18:39

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表