第一篇 x86基础第1章 数与数据类型 21.1 数 21.1.1 数字 21.1.2 二进制数 31.1.3 二进制数的排列 31.1.4 十六进制数 51.1.5 八进制数与十进制数 51.2 数据类型 61.2.1 integer数 61.2.2 floating-point数 91.2.3 real number(实数)与NaN(not anumber) 111.2.4 unsupported编码值 141.2.5 浮点数精度的转换 151.2.6 浮点数的溢出 171.2.7 BCD码 201.2.8 SIMD数据 21第2章 x86/x64编程基础 232.1 选择编译器 232.2 机器语言 242.3 Hello world 252.3.1 使用寄存器传递参数 262.3.2 调用过程 272.3.3 定义变量 272.4 16位编程、32位编程,以及64位编程 282.4.1 通用寄存器 282.4.2 操作数大小 302.4.3 64位模式下的内存地址 302.4.4 内存寻址模式 312.4.5 内存寻址范围 342.4.6 使用的指令限制 342.5 编程基础 342.5.1 操作数寻址 352.5.2 传送数据指令 392.5.3 位操作指令 452.5.4 算术指令 472.5.5 CALL与RET指令 482.5.6 跳转指令 482.6 编辑与编译、运行 48第3章 编写本书的实验例子 503.1 实验的运行环境 503.2 生成空白的映像文件 523.2.1 使用nasm编译器生成 523.2.2 使用bximage工具 523.3 设置bochs配置文件 533.4 源代码的基本结构 543.5 编译源代码 553.6 映像文件内的组织 553.7 使用merge工具 563.7.1 merge的配置文件 573.7.2 执行merge命令 573.8 使用U盘启动真实机器 583.8.1 使用merge工具写U盘 583.8.2 使用hex编辑软件写U盘 593.9 编写boot代码 603.9.1 LBA转换为CHS 623.9.2 测试是否支持int13h扩展功能 633.9.3 使用int13h扩展读磁盘 643.9.4 最后看看load_module() 643.10 总结 66第4章 处理器的身份 674.1 测试是否支持CPUID指令674.2 CPUID指令的术语及表达 684.3 基本信息与扩展信息 684.4 处理器的型号(family,model与stepping) 724.5 最大的物理地址和线性地址 734.6 处理器扩展状态信息 744.6.1 探测Processor ExtendedState子叶 754.6.2 Processor ExtendedState子叶所需内存size 764.6.3 Processor ExtendedState的保存 774.6.4 Processor ExtendedState的恢复 784.7 处理器的特性 784.8 处理器的Cache与TLB信息 804.9 MONITOR/MWAIT信息 834.10 处理器的longmode 84第5章 了解Flags 855.1 Eflags中的状态标志位 865.1.1 signed数的运算 865.1.2 unsigned数的运算 895.2 IOPL标志位 905.3 TF标志与RF标志 935.4 NT标志 955.5 AC标志 965.6 VM标志 985.7 eflags寄存器的其他事项 99第6章 处理器的控制寄存器 1016.1 CR8 1026.2 CR3 1036.3 CR0 1046.3.1 保护模式位PE 1046.3.2 x87 FPU单元的执行环境 1046.3.3 CR0.PG控制位 1086.3.4 CR0.CD与CR0.NW控制位 1086.3.5 CR0.WP控制位 1106.3.6 CR0.AM控制位 1106.4 CR4 1106.4.1 CR4.TSD与CR4.PCE控制位 1106.4.2 CR4.DE与CR4.MCD控制位 1116.4.3 CR4.OSFXSR控制位 1116.4.4 CR4.VMXE与CR4.SMXE控制位 1116.4.5 CR4.PCIDE与CR4.SMEP控制位 1126.4.6 CR4.OSXSAVE控制位 1136.4.7 CR4中关于页的控制位 1136.5 EFER扩展功能寄存器 114第7章 MSR 1167.1 MSR的使用 1167.2 MTRR 1177.2.1 Fixed-range区域的映射 1187.2.2 MTRR的功能寄存器 1207.3 MSR中对特殊指令的支持 1247.3.1 支持sysenter/sysexit指令的MSR 1257.3.2 支持syscall/sysret指令的MSR 1267.3.3 支持swapgs指令的MSR 1277.3.4 支持monitor/mwait指令的MSR 1287.4 提供processorfeature管理 1297.5 其他未列出来的MSR 1297.6 关于MSR一些后续说明 129第二篇 处理器的工作模式第8章 实地址模式 1328.1 真实的地址 1328.2 real mode的编址 1328.3 real mode的状态 1338.4 段基址的计算 1348.5 第1条执行的指令 1348.6 实模式下的执行环境 1358.7 实模式下的IVT 1358.8 突破64K段限 1368.9 A20地址线 137第9章 SMM系统管理模式探索 1389.1 进入SMM 1389.2 SMM的运行环境 1419.2.1 SMRAM区域 1419.2.2 SMM执行环境的初始化 1439.2.3 SMM下的operand与address 1449.2.4 SMM下的CS与EIP 1449.2.5 SMM下的SS与ESP 1459.3 SMM里的中断 1459.4 SMI的Back-to-Back响应 1479.5 SMM里开启保护模式 1479.6 SMM的版本 1489.7 I/O指令的重启及Halt重启 1519.8 SMM的退出 1529.9 SMBASE的重定位 1539.10 SMI处理程序的初始化 1549.11 SMM的安全 1569.11.1 芯片组的控制 1569.11.2 处理器对SMRAM空间的限制 1589.11.3 cache的限制 1609.12 测试SMI处理程序 161第10章 x86/x64保护模式体系(上) 16310.1 x86/x64的权限 16410.2 保护模式下的环境 16410.2.1 段式管理所使用的资源 16510.2.2 paging分页机制所使用的资源 16510.3 物理地址的产生 16610.4 段式管理机制 16710.4.1 段式内存管理 16810.4.2 段式的保护措施 16810.5 段式管理的数据结构 16910.5.1 SegmentSelector(段选择子) 16910.5.2 DescriptorTable(描述符表) 17210.5.3 Segment SelectorRegister(段寄存器) 17410.5.4 SegmentDescriptor(段描述符) 17510.5.5 LDT描述符与LDT 25810.6 开启保护模式 26010.6.1 初始化GDT 26010.6.2 初始化IDT 26210.6.3 切换到保护模式 263第11章 x86/x64保护模式体系(下) 26511.1 物理页面 26511.1.1 处理器的最高物理地址(MAXPHYADDR) 26611.1.2 物理页面的大小 26711.1.3 页转换模式(PagingMode) 26811.2 paging机制下使用的资源 27011.2.1 寄存器 27011.2.2 CPUID查询leaf 27011.2.3 寄存器的控制位 27111.2.4 页转换表资源 27211.3 32位paging模式(non-PAE模式) 27311.3.1 CR3结构 27411.3.2 32位paging模式下的PDE结构 27511.3.3 使用32位paging 27911.4 PAE paging模式 28211.4.1 在Intel64下的CR3与PDPTE寄存器 28311.4.2 在AMD64下的CR3 28511.4.3 PAE paging模式里的PDPTE结构 28611.4.4 PAE paging模式里的PDE结构 28611.4.5 PAE paging模式里的PTE结构 28811.4.6 使用和测试PAEpaging模式 28811.4.7 使用和测试ExecutionDisable功能 29211.5 IA-32e paging模式 29711.5.1 IA-32e paging模式下的CR3 29911.5.2 IA-32e paging模式下的PML4E结构 30211.5.3 IA-32e paging模式下的PDPTE结构 30211.5.4 IA-32e paging模式下的PDE结构 30311.5.5 IA-32e paging模式下的PTE