接触一点amd64

来源:互联网 发布:苹果软件下载排行 编辑:程序博客网 时间:2024/06/06 02:05

以前没接触过,看那篇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.csdn.net/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。