x86/x64体系探索及编程txt,chm,pdf,epub,mobi下载 作者:邓志 出版社: 电子工业出版社 出版年: 2012-10-1 页数: 813 定价: 119.00元 装帧: 平装 ISBN: 9787121181764 内容简介 · · · · · ·本书是对Intel手册所述处理器架构的探索和论证。全书共五大部分,从多个方面对处理器架构相关的知识进行了梳理介绍。书中每个章节都有相应的测试实验,所运行的实验例子都可以在真实的机器上执行。 通过阅读本书,读者应能培养自己动手实验的能力。如果再有一些OS方面的相关知识,基本上就可以写出自己简易的OS核心。 本书适合有一定的x86基础知识,且对了解处理器架构及编程感兴趣的读者阅读。 作者简介 · · · · · ·邓志,1977年生于广东,在银行工作十余年,现自由职业者。对计算机有一股热情和蛮劲,善于思考,特别喜欢琢磨底层架构。熟悉C语言,并且精通x86/x64平台的汇编语言与机器指令系统,能用汇编写简易的OS核心。 目录 · · · · · ·第一篇 x86基础第1章 数与数据类型 2 1.1 数 2 1.1.1 数字 2 1.1.2 二进制数 3 1.1.3 二进制数的排列 3 · · · · · ·() 第一篇 x86基础 第1章 数与数据类型 2 1.1 数 2 1.1.1 数字 2 1.1.2 二进制数 3 1.1.3 二进制数的排列 3 1.1.4 十六进制数 5 1.1.5 八进制数与十进制数 5 1.2 数据类型 6 1.2.1 integer数 6 1.2.2 floating-point数 9 1.2.3 real number(实数)与NaN(not a number) 11 1.2.4 unsupported编码值 14 1.2.5 浮点数精度的转换 15 1.2.6 浮点数的溢出 17 1.2.7 BCD码 20 1.2.8 SIMD数据 21 第2章 x86/x64编程基础 23 2.1 选择编译器 23 2.2 机器语言 24 2.3 Hello world 25 2.3.1 使用寄存器传递参数 26 2.3.2 调用过程 27 2.3.3 定义变量 27 2.4 16位编程、32位编程,以及64位编程 28 2.4.1 通用寄存器 28 2.4.2 操作数大小 30 2.4.3 64位模式下的内存地址 30 2.4.4 内存寻址模式 31 2.4.5 内存寻址范围 34 2.4.6 使用的指令限制 34 2.5 编程基础 34 2.5.1 操作数寻址 35 2.5.2 传送数据指令 39 2.5.3 位操作指令 45 2.5.4 算术指令 47 2.5.5 CALL与RET指令 48 2.5.6 跳转指令 48 2.6 编辑与编译、运行 48 第3章 编写本书的实验例子 50 3.1 实验的运行环境 50 3.2 生成空白的映像文件 52 3.2.1 使用nasm编译器生成 52 3.2.2 使用bximage工具 52 3.3 设置bochs配置文件 53 3.4 源代码的基本结构 54 3.5 编译源代码 55 3.6 映像文件内的组织 55 3.7 使用merge工具 56 3.7.1 merge的配置文件 57 3.7.2 执行merge命令 57 3.8 使用U盘启动真实机器 58 3.8.1 使用merge工具写U盘 58 3.8.2 使用hex编辑软件写U盘 59 3.9 编写boot代码 60 3.9.1 LBA转换为CHS 62 3.9.2 测试是否支持int 13h扩展功能 63 3.9.3 使用int 13h扩展读磁盘 64 3.9.4 最后看看load_module() 64 3.10 总结 66 第4章 处理器的身份 67 4.1 测试是否支持CPUID指令 67 4.2 CPUID指令的术语及表达 68 4.3 基本信息与扩展信息 68 4.4 处理器的型号(family,model与stepping) 72 4.5 最大的物理地址和线性地址 73 4.6 处理器扩展状态信息 74 4.6.1 探测Processor Extended State子叶 75 4.6.2 Processor Extended State子叶所需内存size 76 4.6.3 Processor Extended State的保存 77 4.6.4 Processor Extended State的恢复 78 4.7 处理器的特性 78 4.8 处理器的Cache与TLB信息 80 4.9 MONITOR/MWAIT信息 83 4.10 处理器的long mode 84 第5章 了解Flags 85 5.1 Eflags中的状态标志位 86 5.1.1 signed数的运算 86 5.1.2 unsigned数的运算 89 5.2 IOPL标志位 90 5.3 TF标志与RF标志 93 5.4 NT标志 95 5.5 AC标志 96 5.6 VM标志 98 5.7 eflags寄存器的其他事项 99 第6章 处理器的控制寄存器 101 6.1 CR8 102 6.2 CR3 103 6.3 CR0 104 6.3.1 保护模式位PE 104 6.3.2 x87 FPU单元的执行环境 104 6.3.3 CR0.PG控制位 108 6.3.4 CR0.CD与CR0.NW控制位 108 6.3.5 CR0.WP控制位 110 6.3.6 CR0.AM控制位 110 6.4 CR4 110 6.4.1 CR4.TSD与CR4.PCE控制位 110 6.4.2 CR4.DE与CR4.MCD控制位 111 6.4.3 CR4.OSFXSR控制位 111 6.4.4 CR4.VMXE与CR4.SMXE控制位 111 6.4.5 CR4.PCIDE与CR4.SMEP控制位 112 6.4.6 CR4.OSXSAVE控制位 113 6.4.7 CR4中关于页的控制位 113 6.5 EFER扩展功能寄存器 114 第7章 MSR 116 7.1 MSR的使用 116 7.2 MTRR 117 7.2.1 Fixed-range区域的映射 118 7.2.2 MTRR的功能寄存器 120 7.3 MSR中对特殊指令的支持 124 7.3.1 支持sysenter/sysexit指令的MSR 125 7.3.2 支持syscall/sysret指令的MSR 126 7.3.3 支持swapgs指令的MSR 127 7.3.4 支持monitor/mwait指令的MSR 128 7.4 提供processor feature管理 129 7.5 其他未列出来的MSR 129 7.6 关于MSR一些后续说明 129 第二篇 处理器的工作模式 第8章 实地址模式 132 8.1 真实的地址 132 8.2 real mode的编址 132 8.3 real mode的状态 133 8.4 段基址的计算 134 8.5 第1条执行的指令 134 8.6 实模式下的执行环境 135 8.7 实模式下的IVT 135 8.8 突破64K段限 136 8.9 A20地址线 137 第9章 SMM系统管理模式探索 138 9.1 进入SMM 138 9.2 SMM的运行环境 141 9.2.1 SMRAM区域 141 9.2.2 SMM执行环境的初始化 143 9.2.3 SMM下的operand与address 144 9.2.4 SMM下的CS与EIP 144 9.2.5 SMM下的SS与ESP 145 9.3 SMM里的中断 145 9.4 SMI的Back-to-Back响应 147 9.5 SMM里开启保护模式 147 9.6 SMM的版本 148 9.7 I/O指令的重启及Halt重启 151 9.8 SMM的退出 152 9.9 SMBASE的重定位 153 9.10 SMI处理程序的初始化 154 9.11 SMM的安全 156 9.11.1 芯片组的控制 156 9.11.2 处理器对SMRAM空间的限制 158 9.11.3 cache的限制 160 9.12 测试SMI处理程序 161 第10章 x86/x64保护模式体系(上) 163 10.1 x86/x64的权限 164 10.2 保护模式下的环境 164 10.2.1 段式管理所使用的资源 165 10.2.2 paging分页机制所使用的资源 165 10.3 物理地址的产生 166 10.4 段式管理机制 167 10.4.1 段式内存管理 168 10.4.2 段式的保护措施 168 10.5 段式管理的数据结构 169 10.5.1 Segment Selector(段选择子) 169 10.5.2 Descriptor Table(描述符表) 172 10.5.3 Segment Selector Register(段寄存器) 174 10.5.4 Segment Descriptor(段描述符) 175 10.5.5 LDT描述符与LDT 258 10.6 开启保护模式 260 10.6.1 初始化GDT 260 10.6.2 初始化IDT 262 10.6.3 切换到保护模式 263 第11章 x86/x64保护模式体系(下) 265 11.1 物理页面 265 11.1.1 处理器的最高物理地址(MAXPHYADDR) 266 11.1.2 物理页面的大小 267 11.1.3 页转换模式(Paging Mode) 268 11.2 paging机制下使用的资源 270 11.2.1 寄存器 270 11.2.2 CPUID查询leaf 270 11.2.3 寄存器的控制位 271 11.2.4 页转换表资源 272 11.3 32位paging模式(non-PAE模式) 273 11.3.1 CR3结构 274 11.3.2 32位paging模式下的PDE结构 275 11.3.3 使用32位paging 279 11.4 PAE paging模式 282 11.4.1 在Intel64下的CR3与PDPTE寄存器 283 11.4.2 在AMD64下的CR3 285 11.4.3 PAE paging模式里的PDPTE结构 286 11.4.4 PAE paging模式里的PDE结构 286 11.4.5 PAE paging模式里的PTE结构 288 11.4.6 使用和测试PAE paging模式 288 11.4.7 使用和测试Execution Disable功能 292 11.5 IA-32e paging模式 297 11.5.1 IA-32e paging模式下的CR3 299 11.5.2 IA-32e paging模式下的PML4E结构 302 11.5.3 IA-32e paging模式下的PDPTE结构 302 11.5.4 IA-32e paging模式下的PDE结构 303 11.5.5 IA-32e paging模式下的PTE结构 304 11.5.6 SMEP机制 304 11.5.7 使用IA-32e paging模式 308 11.6 TLB与Cache 314 11.6.1 TLB 315 11.6.2 Paging-Structure Cache 328 11.7 page的内存cache类型 335 11.7.1 PAT(Page Attribute Table) 335 11.7.2 PAT MSR 337 11.7.3 各级table entry的PCD及PWT标志 337 11.8 页的保护措施 338 11.8.1 访问权限位U/S的检查 338 11.8.2 读/写权限位R/W的检查 339 11.8.3 执行权限位XD的检查 339 11.8.4 缺页保护P标志位的检查 340 11.8.5 保留位的检查 341 第12章 Long-mode 342 12.1 x64体系的设计原则 343 12.2 开启long-mode 344 12.2.1 检测处理器是否支持long-mode 344 12.2.2 EFER寄存器 345 12.2.3 进入long-mode的必要条件 346 12.3 退出long-mode 350 12.4 long-mode的执行环境 352 12.4.1 处理器模式的判断 352 12.4.2 64位模式下的段描述符 353 12.4.3 Long-mode的gate描述符 353 12.4.4 Long-mode的描述符表结构 355 12.4.5 Long-mode模式的段寄存器 356 12.4.6 Long-mode的paging机制 357 12.5 long-mode的指令环境 358 12.5.1 64位模式的操作数 358 12.5.2 64位模式下的无效指令 360 12.5.3 64位模式下的寻址模式 361 12.6 64位模式与compatibility模式编程 363 12.6.1 64位模式切换到compatibility模式 363 12.6.2 compatibility模式切换到64位模式 363 12.6.3 利用compatibility模式执行legacy的库函数 364 第三篇 调试与性能监控 第13章 断点调试 370 13.1 Single-Step单步调试模式 370 13.2 Breakpoint调试模式 371 13.3 Memory和I/O地址调试模式 372 13.3.1 断点寄存器DR0~DR3 372 13.3.2 状态寄存器DR6 372 13.3.3 控制寄存器DR7 373 13.3.4 Fault与Trap类型的debug异常 375 13.3.5 General Detect产生的#DB异常 375 13.3.6 执行断点指令产生的#DB异常 377 13.3.7 访问数据断点产生的#DB异常 386 13.3.8 访问I/O断点产生的#DB异常 390 13.3.9 任务切换时产生的Trap调试异常 392 第14章 分支记录 394 14.1 检测处理器的家族和型号 395 14.2 初识Branch Record 395 14.2.1 记录存放的地方 395 14.2.2 记录的形式 396 14.2.3 何时进行记录 396 14.3 IA32_DEBUGCTL寄存器 396 14.3.1 配置Branch trace record的存放 398 14.3.2 CPL-qualified branch record(受CPL限制的BTS) 399 14.3.3 冻结监控 400 14.4 LBR stack 402 14.4.1 FROM_IP与TO_IP寄存器 402 14.4.2 IA32_LASTBRANCH_TOS寄存器 404 14.4.3 LBR stack的使用 405 14.5 使用LBR捕捉branch trace 405 14.6 #DB异常下的LBR 419 14.7 IA-32e模式下的LBR stack 421 14.8 使用Single-step on branch功能 428 14.9 BTS(Branch Trace Store)机制 429 14.9.1 检测DS(Debug Store)是否支持 430 14.9.2 Debug store 64位格式 431 14.9.3 检测BTS(Branch Trace Store)机制是否可用 431 14.9.4 检测PEBS(Precise Event Based Sampling)机制是否可用 432 14.9.5 Debug Store存储区域 432 14.9.6 设置DS存储区域 439 14.9.7 使用环形回路BTS buffer 443 14.9.8 使BTS buffer产生DS中断 447 14.9.9 过滤BTS记录 459 14.9.10 64位模式下的BTS机制 463 第15章 性能监控 469 15.1 性能监控机制 469 15.2 Performance monitoring机制的版本 470 15.2.1 确定处理器所支持的功能 471 15.2.2 IA32_PMCx寄存器在各版本中的数量 472 15.2.3 IA32_PMCx寄存器的宽度 472 15.2.4 预定义的event 473 15.3 Nehalem架构下的性能监控机制 474 15.3.1 物理资源 474 15.3.2 counter(计数器) 475 15.3.3 开启计数器 476 15.3.4 全局控制器 476 15.3.5 通用计数控制器 477 15.3.6 固定用途计数控制器 478 15.3.7 全局状态寄存器 480 15.3.8 全局溢出控制器 481 15.3.9 使用Performance monitoring的例子 481 15.3.10 在PMI中冻结计数器 486 15.4 PEBS(Precise Event Based Sampling)机制 489 15.4.1 PEBS buffer 490 15.4.2 PEBS中断 493 15.4.3 PEBS事件 496 15.4.4 PEBS的触发 497 15.4.5 PEBS记录的报告 498 15.4.6 PEBS buffer满时中断 504 15.4.7 多个PMI触发 510 15.4.8 Load latency监控机制 521 15.5 使用Fixed计数器 525 15.6 Time-stamp counter与clock 528 15.6.1 Invariant TSC 529 15.6.2 读取TSC值 530 15.6.3 Clock per instruction 531 第四篇 中断体系 第16章 中断与异常处理 538 16.1 Interrupt Source(中断源) 539 16.1.1 硬件中断 539 16.1.2 软件中断 540 16.2 Exception Source(异常源) 540 16.3 Exception的恢复 541 16.4 中断vector 544 16.5 中断的屏蔽 545 16.5.1 可屏蔽的中断 545 16.5.2 不可屏蔽的中断 547 16.6 IDTR寄存器 548 16.7 IVT(Interrupt Vector Table) 549 16.8 IDT(Interrupt Descriptor Table) 550 16.9 gate描述符 551 16.9.1 legacy保护模式下的Interrupt-gate与Trap-gate描述符 551 16.9.2 IA-32e模式下的Interrupt-gate与Trap-gate描述符 552 16.9.3 Task-gate描述符 552 16.10 软件上的中断/异常处理流程 553 16.10.1 处理器对gate描述符和code描述符的检查 553 16.10.2 权限的检查 556 16.10.3 权限处理的三种情形 557 16.10.4 第1种情形:同级调用 558 16.10.5 第2种情形:权限及stack的切换 559 16.10.6 第3种情形:conforming代码段 566 16.10.7 Eflags标志位的处理 567 16.10.8 执行中断/异常处理程序 567 16.11 中断/异常调用中的任务切换 567 16.12 中断/异常调用返回 568 16.12.1 返回时的任务切换 568 16.12.2 IRET指令的operand size 568 16.12.3 IRET指令返回前的检查 571 16.12.4 返回到低权限级别时 573 16.12.5 同级返回 578 16.13 错误码 579 第17章 8259中断控制器 582 17.1 8259结构 583 17.1.1 IRQ的优先级 584 17.1.2 中断请求状态 584 17.1.3 中断服务状态 584 17.1.4 中断屏蔽状态 585 17.1.5 中断响应过程 586 17.2 8259编程 587 17.2.1 8259寄存器I/O地址 587 17.2.2 8259初始化 588 17.2.3 8259的操作字 592 17.2.4 设置edge和level触发模式 596 第18章 Local APIC体系 597 18.1 APIC体系概述 597 18.1.1 local APIC接收到的中断源 598 18.1.2 APIC体系的版本 600 18.2 使用local APIC 600 18.2.1 检测local APIC版本 600 18.2.2 开启和关闭local APIC 601 18.3 local APIC寄存器 604 18.3.1 local APIC寄存器地址 604 18.3.2 local APIC寄存器列表 606 18.4 local APIC ID 609 18.4.1 local APIC ID寄存器 609 18.4.2 APIC ID在multi-threading处理器下 610 18.4.3 multi-threading技术的使用 617 18.4.4 multi-threading处理器编程 627 18.5 local APIC版本寄存器 633 18.6 LVT寄存器 634 18.7 ICR(Interrupt Command Register) 635 18.8 LVT寄存器及ICR的设置 636 18.8.1 delivery mode的设置 636 18.8.2 trigger模式的设置 637 18.9 中断vector及priority 637 18.9.1 local interrupt的vector设置 637 18.9.2 有效的vector值 638 18.9.3 local interrupt的优先级 638 18.9.4 在64位模式下的优先级 640 18.10 处理器的IPI机制 641 18.10.1 IPI消息对象 641 18.10.2 使用physical目标模式 641 18.10.3 使用logical目标模式 645 18.10.4 多处理器的初始化与编程 648 18.11 local APIC的中断处理 659 18.11.1 检查目标 660 18.11.2 IRR和ISR仲裁 661 18.11.3 发送EOI命令 663 18.12 APIC timer 663 18.13 错误处理 666 18.14 LINT0与LINT1 669 18.14.1 LINT0与LINT1寄存器 670 18.14.2 从LINT0屏蔽外部中断请求 672 18.14.3 从LINT1屏蔽NMI 673 18.15 Performance Monitoring 675 第19章 I/O APIC 679 19.1 I/O APIC寄存器 680 19.1.1 direct register(直接寄存器) 680 19.1.2 indirect register(间接寄存器) 682 19.1.3 I/O APIC的IRQ 684 19.1.4 I/O APIC的中断处理 685 19.2 使用HPET(高精度定时器) 688 19.2.1 HPET寄存器基址 688 19.2.2 HPET的工作原理 689 第五篇 浮点与SIMD指令环境 第20章 x87 FPU单元与MMX技术 698 20.1 x87 FPU执行环境 699 20.1.1 x87 FPU 数据寄存器 700 20.1.2 x87 FPU的stack结构 701 20.1.3 x87 FPU状态寄存器 710 20.2 x87 FPU的异常 718 20.2.1 status寄存器的异常标志位 719 20.2.2 异常的屏蔽 720 20.2.3 #IS与#IA异常 720 20.2.4 #D异常 722 20.2.5 #Z异常 723 20.2.6 #O与#U异常 723 20.2.7 舍入 727 20.3 x87 FPU的异常处理机制 729 20.3.1 默认处理方法 730 20.3.2 unmasked下的异常 732 20.3.3 使用native模式 732 20.3.4 使用DOS compatibility模式 739 20.4 MMX指令环境 742 20.4.1 MMX寄存器 742 20.4.2 64位SIMD整数运算 743 20.4.3 MMX指令的比较操作 746 20.4.4 MMX指令的unpack操作 746 20.4.5 x87 FPU与MMX混合编程 747 20.5 x87 FPU与MMX的状态 748 20.5.1 x87 FPU环境信息的保存 748 20.5.2 使用FSAVE/FNSAVE指令 749 20.5.3 MMX寄存器的保存 750 20.6 x87 FPU与MMX环境的设置 750 20.6.1 为任务切换设置环境 751 20.6.2 x87 FPU与MMX环境的推荐设置 758 第21章 SSE系列指令环境 759 21.1 处理器的资源 760 21.1.1 处理器对SSE指令的支持 761 21.1.2 128位的XMM寄存器 762 21.1.3 MXCSR 762 21.1.4 SIMD数据类型 765 21.2 SSE系列指令的异常 765 21.2.1 异常的屏蔽 766 21.2.2 numeric异常的处理 769 21.3 SSE系列指令的操作 771 21.3.1 packed数据的运算 772 21.3.2 scalar数据的运算 772 21.3.3 Horizontal的运算 773 21.3.4 MOV与load/store操作 773 21.3.5 shuffle操作 774 21.3.6 unpack操作 777 21.3.7 blend操作 777 21.3.8 insert操作 778 21.3.9 extract操作 780 21.3.10 compare操作 781 21.3.11 logical操作 783 21.3.12 convert操作 785 21.3.13 string处理指令 788 21.4 SSE系列指令操作环境 800 21.4.1 SSE系列指令支持 800 21.4.2 SSE系列指令State信息 801 21.4.3 SSE系列指令环境的设置 805 21.4.4 x87 FPU/MMX与SSE环境的延时切换 807 附录A 参考资料 808 附录B 实验清单 809 · · · · · · () "x86/x64体系探索及编程"试读 · · · · · · |
推荐给了朋友
大爱,好好看
还行。。。
一种全新的角度切入