诡异的cs段描述符
Windows内核调试
诡异的cs段描述符
dbger
2014-05-21, 21:01 下午
Target: Windows 7 Professional 64bit
1: kd> r
rax=0000000000002501 rbx=fffff880009e8180 rcx=0000000000000001
rdx=000000000000008a rsi=0000000000002626 rdi=000000000000208a
rip=fffff80002ad6490 rsp=fffff88002f1ba88 rbp=0000000000000000
r8=fffffa8001745000 r9=0000000000000089 r10=000000000250ab20
r11=fffff88002f1b970 r12=fffff88002f1bac0 r13=fffffa8002c27500
r14=fffffa8002c1e100 r15=0000000000000000
iopl=0 nv up ei pl nz na pe nc
cs=0010 ss=0018 ds=002b es=002b fs=0053 gs=002b efl=00000202
nt!RtlpBreakWithStatusInstruction:
fffff800`02ad6490 cc int 3
1: kd> rgdtr
gdtr=fffff880009f34c0
1: kd> dd fffff880009f34c0
fffff880`009f34c0 00000000 00000000 00000000 00000000
fffff880`009f34d0 00000000 00209b00 0000ffff 00cf9300
fffff880`009f34e0 0000ffff 00cffb00 0000ffff 00cff300
fffff880`009f34f0 00000000 0020fb00 00000000 00000000
fffff880`009f3500 cec00067 00008b9e fffff880 00000000
fffff880`009f3510 b0007c00 ff40f3fd 00000000 00000000
fffff880`009f3520 0000ffff 00cf9a00 00000000 00000000
fffff880`009f3530 00000000 00000000 00000000 00000000
1: kd> dg 10
P Si Gr Pr Lo
Sel Base Limit Type l ze an es ng Flags
---- ----------------- ----------------- ---------- - -- -- -- -- --------
0010 00000000`00000000 00000000`00000000 Code RE Ac 0 Nb By P Lo 0000029b
Limit值为何为0, 一些段属性也很奇怪?
求调友指教!
Re: 诡异的cs段描述符
格蠹老雷
2014-05-22, 20:13 下午
要理解这个问题,首先需要了解“淡化段机制”的基本思想,在今天的软硬件设计中,已经普遍接受页机制作为主流的内存管理技术,对x86架构来说,因为段机制不可禁止,所以只能淡化它。
因为这个原因,32位到64位扩展时,根本没有加长段描述符,本来8个字节还是8个字节,于是就放不下0xffffffffffffffff这么长的边界值,怎么办呢,就约定下,用本来的一个保留位代表是是不是Long的段(64位段),用0代表无限边界,就是段这一关检验时,看到0边界,就全通过,有点像“节假日高速公路免费” :-)
Re: 诡异的cs段描述符
dbger
2014-05-22, 21:40 下午
谢谢指点,以前在32bit Windows时都是有个0xFFFFFFFF的段限;一下到64bit有点怪。Hoho~
张老师的《软件调试》里以32bit Windows为环境,
《格蠹汇编》里虽然涉及到了一些64bit下的变化(如FS的角色由GS扮演),但比较少。
期待第二版能加入更多关于64bit的下CPU和OS的整块内容。:)