以前没接触过,看那篇patchGuard的文章之后翻了翻手册和wiki,整理的东西放上来
概述
一、寄存器
通用寄存器扩展到64位,通用寄存器数目由原有8个扩展到16个
• Sixteen 8-bit low-byte registers (A L,BL, CL, DL, SIL, DIL, BPL, SPL, R8B, R9B, R10B, R11B,
R12B, R13B, R14B, R15B).
• Four 8-bit high-byte registers (A H,BH, CH, DH), addressable only when no REX prefix is used.
• Sixteen 16-bit registers (AX, BX, CX,DX, DI, SI, BP, SP, R8W, R9W, R10W, R11W, R12W,
R13W, R14W, R15W).
• Sixteen 32-bit registers (EAX, EB X,ECX, EDX, EDI, ESI, EBP, ESP, R8D, R9D, R10D, R11D,
R12D, R13D, R14D, R15D).
• Sixteen 64-bit registers (RAX, RBX,RCX, RDX, RDI, RSI, RBP, RSP, R8, R9, R10, R11, R12,
R13, R14, R15).
rip可以用来寻址: mov,rax,qwordptr [rip+100]
具体情况就是这样了……
二、寻址模式
Long Mode (保护模式扩展,包括64位模式和x86兼用模式两种子模式,不支持实模式和虚拟8086模式,不支持硬任务切换)
-虚拟地址扩展到64位
- 64位的rip – 相对于x86的eip
- Instruction-pointer-relati ve data-addressing mode. – rip来做数据寻址基址?
- 依然是平坦地址空间
64-Bit Mode
寄存器增加、64位地址、rip相对寻址
Compatibility Mode
兼用模式,对于win32程序,一切如旧;对于系统而言,地址转译 中断 异常处理以及数据结构则是64位模式下的了。
Legacy Mode
让amd64运行在x86的模式下,也就是可以运行x86的系统
内存模型
一、内存组织
64位模式下是平坦模式,Compatibility mode下是分段的(当然x86 windows也没分段)
64位下是只支持平坦模式了
二、内存转译
64位模式下,没有用到64位寻址那么大的空间(2^64 = 16EB)。只有虚拟地址的最低48位才会在地址转换(页表查询)时被使用。但是,任何虚拟地址的48位至63位必须与47位一致(按照符号位扩展的方式),否则处理器将会报告一个general-protection 异常。符合这一规则的地址被称作“canonical address form”。传统格式将从0至00007FFF`FFFFFFFF,以及从FFFF8000`00000000至FFFFFFFF`FFFFFFFF总计256TB的地址范围作为可以使用的虚拟地址空间。
操作系统通常以此来划分ring0和ring3的界限。【1】
寻址方式上除了多出rip方式:Instruction-RelativeAddresses 以外,其他和以往一样。
关于内存分页,采用了4级寻址。
一口气搞懂amd64是不太现实。。。手册好长。。。
另:这哥们的书单不错,mark 有空看看 http://blog.youkuaiyun.com/cndvdc/article/details/5084747
参考:amd64手册,wiki,http://hi.baidu.com/andimeo/item/5978216aee06f236ad3e830b
【1】PatchGuard2利用了这个技巧向常规DPC历程中传递非法指针。这个指针不是canonical address,从而通过#GP异常将patchGuard请求捕获。
这个指针只能在非canonical address区 。否则会引发PAGEFAULT_IN_NONPAGED_AREA or IRQL_NOT_LESS_OR_EQUAL而直接BSOD。