第二章 CPU基础
1 CPU支持的指令集:RISC (Reduced Instruction Set Computer, 精简指令集计算机) 和 CISC (Complex Instruction Set Computer, 复杂指令集计算机)
比较:
2 寻址方式
3 平坦内存模型 (Flat memory model)
每个程序使用地址 0 - 2^32 索引 4GB 的平坦内存空间。
好处:可以把程序所有代码放入一个段中,跳转时都是段内跳转。
4 分页机制 (Paging)
以页为单位 (4K) 组织内存,通过页表管理,实现虚拟内存的基础。
5 CPU操作模式
保护模式 (Protected Mode):多任务的基础
实模式 (Real-Address Mode):直接访问内存
虚拟8086模式 (Virtual-8086 Mode):保护模式下模拟8086实模式
6 寄存器中
EBP, ESP 用于维护堆栈,EBP 指向栈底(或叫起始位置),ESP指向栈顶,向下生长(X86系统)
ECX, ESI, EDI 用于串操作中的 计数器,源地址,目的地址
CS,DS,ES,FS,GS,SS 为16位段寄存器,
CPU工作在实模式时为段地址的高16位,例如 MOV AL, ES:[100H] 源地址为 ES * 10H + 100H
在保护模式时,存放的是段选择子
EIP 指向 CPU 要执行的下一条指令(指令的第一个字节)
7 保护模式
保护多任务(可看作线程)环境中的各个任务的安全,包括
任务间保护 (内存映射机制,包括 段映射,页映射) 和
任务内保护 (特权级别检查)
8 任务内保护
保护操作系统。
权限控制, 给 代码/数据 指定特权级别 (0,1,2,3, 0最高,内核模式为0,3最低,为用户模式),高特权级代码可 访问/执行 低优先权级 数据/代码。
9 任务间保护,段机制,段选择子
段选择子 (15-3 : 描述表中索引; 2 : 全局(0)/局部(1); 1-0 : 权限)
例如 WinDbg 下 使用 r 察看
0:002> r
eax=7ffdf000 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004 edi=00000005
eip=7c90120e esp=00adffcc ebp=00adfff4 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000246
其中 fs=0038 = 111,0,00b,代表 索引为7,全局,权限为0
使用dg 察看详细
0:002> dg 0 50
P Si Gr Pr Lo
Sel Base Limit Type l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
0000 00000000 00000000 0 Nb By Np Nl 00000000
0008 00000000 ffffffff Code RE Ac 0 Bg Pg P Nl 00000c9b
0010 00000000 ffffffff Data RW Ac 0 Bg Pg P Nl 00000c93
0018 00000000 ffffffff Code RE Ac 3 Bg Pg P Nl 00000cfb
0020 00000000 ffffffff Data RW Ac 3 Bg Pg P Nl 00000cf3
0028 80042000 000020ab TSS32 Busy 0 Nb By P Nl 0000008b
0030 ffdff000 00001fff Data RW Ac 0 Bg Pg P Nl 00000c93
0038 7ffdc000 00000fff Data RW Ac 3 Bg By P Nl 000004f3
0040 00000400 0000ffff Data RW Ac 3 Nb By P Nl 000000f3
0048 00000000 00000000 0 Nb By Np Nl 00000000
0050 Unable to get descriptor
对fs来说,这个段起始于 7ffd,c000,大小为 0000,0fff。
fs 存放当前线程的线程环境块 (TEB),察看下内容
0:002> dd 7ffdc000
7ffdc000 00adffe4 00ae0000 00adf000 00000000
7ffdc010 00001e00 00000000 7ffdc000 00000000
7ffdc020 00000918 00000594 00000000 00000000
7ffdc030 7ffdf000 00000000 00000000 00000000
7ffdc040 00000000 00000000 00000000 00000000
7ffdc050 00000000 00000000 00000000 00000000
7ffdc060 00000000 00000000 00000000 00000000
7ffdc070 00000000 00000000 00000000 00000000
其中第一个字节为该线程的 异常处理链表头,为 00ad,ffe4
第二第三字节代表线程栈范围:00ad,f000 - 00ae,0000;大小为0x1000 (4K)
10 分页机制
目的:高效率用内存,把暂时不用的数据放入外部存储器
CR3(页目录基地址寄存器) ==> 页目录(Page Directory, PDE) ==> 页表(Page Table, PTE) ==> 物理内存页基地址
地址翻译:
0x0012,0034 (0000000000,0100100000,000000110100b)
1. CR3 得到目录页
2. 目录页 + 高10位(22-32) (0000000000) 得到页表
3. 页表 + 12-21位 (0100100000)得到内存页基地址
4. 内存页基地址 + 0-11位 (000000110100b)
1 CPU支持的指令集:RISC (Reduced Instruction Set Computer, 精简指令集计算机) 和 CISC (Complex Instruction Set Computer, 复杂指令集计算机)
比较:
RISC | CISC | |
代表 | PowerPC, Alpha, ARM... | X86, AMD |
指令长度 | 等长(4字节) 利于反汇编和代码断点 | 不定(1 - *) P6系列使用微操作:将X86指令翻译成等长的微操作后再执行 |
寻址方式 | 不支持间接寻址 | 丰富 间接寻址方便处理表格,字符串等数据结构 但是指令格式复杂,解码和优化难度加大 |
通用寄存器 | 多 32个 | 少 8个:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP |
指令数量 | 少 例如:跳转指令:2个(BLNV,BLEQ) | 多 例如:跳转指令:32个 方便编程 对流水线不利 |
函数调用 | 可用寄存器存放参数 速度快 | |
适用范围 | 简单 低成本的嵌入式系统 |
2 寻址方式
直接方式 | 间接方式 | |
常数 | 立即寻址 (immediate addressing) mov al, 1 | 寄存器寻址 (register addressing) mov al, bl |
寄存器 | 直接寻址 (direct addressing) mov ax, [120000h] | 寄存器间接寻址 (register indirect addressing) mov ax, [bx] |
3 平坦内存模型 (Flat memory model)
每个程序使用地址 0 - 2^32 索引 4GB 的平坦内存空间。
好处:可以把程序所有代码放入一个段中,跳转时都是段内跳转。
4 分页机制 (Paging)
以页为单位 (4K) 组织内存,通过页表管理,实现虚拟内存的基础。
5 CPU操作模式
保护模式 (Protected Mode):多任务的基础
实模式 (Real-Address Mode):直接访问内存
虚拟8086模式 (Virtual-8086 Mode):保护模式下模拟8086实模式
6 寄存器中
EBP, ESP 用于维护堆栈,EBP 指向栈底(或叫起始位置),ESP指向栈顶,向下生长(X86系统)
ECX, ESI, EDI 用于串操作中的 计数器,源地址,目的地址
CS,DS,ES,FS,GS,SS 为16位段寄存器,
CPU工作在实模式时为段地址的高16位,例如 MOV AL, ES:[100H] 源地址为 ES * 10H + 100H
在保护模式时,存放的是段选择子
EIP 指向 CPU 要执行的下一条指令(指令的第一个字节)
7 保护模式
保护多任务(可看作线程)环境中的各个任务的安全,包括
任务间保护 (内存映射机制,包括 段映射,页映射) 和
任务内保护 (特权级别检查)
8 任务内保护
保护操作系统。
权限控制, 给 代码/数据 指定特权级别 (0,1,2,3, 0最高,内核模式为0,3最低,为用户模式),高特权级代码可 访问/执行 低优先权级 数据/代码。
9 任务间保护,段机制,段选择子
段选择子 (15-3 : 描述表中索引; 2 : 全局(0)/局部(1); 1-0 : 权限)
例如 WinDbg 下 使用 r 察看
0:002> r
eax=7ffdf000 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004 edi=00000005
eip=7c90120e esp=00adffcc ebp=00adfff4 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000246
其中 fs=0038 = 111,0,00b,代表 索引为7,全局,权限为0
使用dg 察看详细
0:002> dg 0 50
P Si Gr Pr Lo
Sel Base Limit Type l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
0000 00000000 00000000 0 Nb By Np Nl 00000000
0008 00000000 ffffffff Code RE Ac 0 Bg Pg P Nl 00000c9b
0010 00000000 ffffffff Data RW Ac 0 Bg Pg P Nl 00000c93
0018 00000000 ffffffff Code RE Ac 3 Bg Pg P Nl 00000cfb
0020 00000000 ffffffff Data RW Ac 3 Bg Pg P Nl 00000cf3
0028 80042000 000020ab TSS32 Busy 0 Nb By P Nl 0000008b
0030 ffdff000 00001fff Data RW Ac 0 Bg Pg P Nl 00000c93
0038 7ffdc000 00000fff Data RW Ac 3 Bg By P Nl 000004f3
0040 00000400 0000ffff Data RW Ac 3 Nb By P Nl 000000f3
0048 00000000 00000000 0 Nb By Np Nl 00000000
0050 Unable to get descriptor
对fs来说,这个段起始于 7ffd,c000,大小为 0000,0fff。
fs 存放当前线程的线程环境块 (TEB),察看下内容
0:002> dd 7ffdc000
7ffdc000 00adffe4 00ae0000 00adf000 00000000
7ffdc010 00001e00 00000000 7ffdc000 00000000
7ffdc020 00000918 00000594 00000000 00000000
7ffdc030 7ffdf000 00000000 00000000 00000000
7ffdc040 00000000 00000000 00000000 00000000
7ffdc050 00000000 00000000 00000000 00000000
7ffdc060 00000000 00000000 00000000 00000000
7ffdc070 00000000 00000000 00000000 00000000
其中第一个字节为该线程的 异常处理链表头,为 00ad,ffe4
第二第三字节代表线程栈范围:00ad,f000 - 00ae,0000;大小为0x1000 (4K)
10 分页机制
目的:高效率用内存,把暂时不用的数据放入外部存储器
CR3(页目录基地址寄存器) ==> 页目录(Page Directory, PDE) ==> 页表(Page Table, PTE) ==> 物理内存页基地址
地址翻译:
0x0012,0034 (0000000000,0100100000,000000110100b)
1. CR3 得到目录页
2. 目录页 + 高10位(22-32) (0000000000) 得到页表
3. 页表 + 12-21位 (0100100000)得到内存页基地址
4. 内存页基地址 + 0-11位 (000000110100b)