站长 发表于 2024-5-20 16:41:36

《x86汇编语言:编写64位多处理器多线程操作系统》图书介绍和资源下载


站长 发表于 2024-5-20 16:42:46

前   言
      十年前,我写了一本书,名字叫《x86汇编语言:从实模式到保护模式》(已于2023年再版)。记得当时我在书里说还要写一本64位的下册,但图书出版之后发现学汇编语言的人并没有当初想象中的那么多,以至于心灰意冷,这个下册也就没了下文。非但如此,按原来的计划,在图书出版之后我会提供一份习题答案。但由于我这个人比较懒散,过了没几天,出书的新鲜劲儿一过,对此事的热情大减,习题答案也就没有了下文,所以大家会注意到《x86汇编语言:从实模式到保护模式》至今没有一套官方的习题答案。
      过去十年,我观察到了个人计算机市场上的两个变化。一是64位计算成为个人计算机市场的主流。仿佛一夜之间,市面上的32位计算机系统都消失了,64位处理器、64位操作系统开始在市场上占据统治地位,应用程序也都变成了64位,至少会提供32位和64位两种版本。二是多处理器和并行计算开始在桌面(个人)计算机系统上兴起,几乎所有计算机语言和编译器都添加了对多线程和并行计算的支持,甚至连C这种古老的语言都在2011年添加了多线程和并发的支持,并推出了ISO/IEC 9899:2011标准。
      那么,在最接近硬件的层面上,以汇编语言的视角来看,64位的处理器都具有什么样的特点、如何创建多个线程、如何把线程指派到不同的处理器上同时并行执行等这一切又重新激发了我好为人师的兴致,以至于决定重启《x86汇编语言:从实模式到保护模式》传说中的下册。
      决定写这本书的时候我正从事视频创作,所以决定先将它制作成视频,然后整理成书。视频制作花了一年多,接下来就是整理成书了。但这个时候我的新鲜劲儿又过了,又开始变得懒散,去年一年才整理出两章。也就是今年,在出版社编辑缪晓红的催促和鼓励下,我又快马加鞭,仅用两个多月就完成了全部书稿。
      一本书,它的名字很重要,得让人一看到书的名字就知道它都讲了些什么内容。如果可能的话,我希望本书的名字叫《x86汇编语言:编写一个简单的、简易的操作系统雏形,用来演示64位环境下的多处理器管理、动态内存分配、多处理器多任务的调度和切换、多处理器多线程的调度和切换、数据竞争和锁,但它不包括文件管理、设备管理等内容》。但诚如你所见,本书的名字并不太长,太长就不成体统了。
      本书一开始介绍64位x86处理器的硬件架构,接着介绍与操作系统相关的内容,包括单处理器的多任务切换、多处理器的多任务切换和多线程切换、数据竞争、原子操作、自旋锁和互斥锁等。
      传统上,大家都是在流行的操作系统,比如Windows和Linux上编写并发程序的,而且只能使用高级语言。这使得多处理器环境下的多任务和多线程调度、原子操作、锁、线程同步等内容对很多人来说是笼统的、抽象的,像隔了层纱一样,看不见本质。相反,如果用汇编语言实现一个简单的操作系统内核,并演示多处理器环境下的多任务、多线程、锁和线程同步,这是可能的吗?我相信没有人会觉得这是简单的事情。但事实上,如果你想来一个简单的,其实也很容易,这本书就能告诉你如何实现它。
      这本书并不是零基础可读的,你必须具有保护模式的知识基础,且我强烈建议你先读懂它的上册,即《x86汇编语言:从实模式到保护模式》一书。
      为方便阅读,我把代码都印在书里了。这样做自然会增加书的厚度及成本,但相对于给你带来的便利和时间上的节省来说,还是值得的。
      请关注我的个人网站www.lizhongc.com以了解我的最新动态或者获取相关的资源,也可以给我发送电子邮件,我的邮箱是leechung@126.com。二〇二四年五月

站长 发表于 2024-5-20 16:42:57

目   录

第1章基本要求和相关说明      11.1配书代码和工具      11.2NASM的下载和安装      11.3NASMIDE的下载和使用      31.4下载和安装VirtualBox      61.5使用FixVhdWr将程序写入虚拟硬盘      81.6本书的代码组织      10
第2章x64架构的基本执行环境      372.1x64架构的由来      372.2物理地址、有效地址和线性地址      392.3x64架构的工作模式      402.3.1x86处理器的工作模式      402.3.2IA-32e模式及其子模式      412.4x64架构的寄存器      432.4.1x64架构对通用寄存器的扩展      432.4.2x64架构的通用寄存器访问规则      452.5x86处理器的物理地址空间      462.6传统模式的内存访问      472.6.1传统模式下的线性地址和物理地址      472.6.2传统模式下的32位4KB分页技术      482.6.3传统模式下如何利用超过4GB的物理内存      492.6.4传统模式下的32位4MB分页技术      502.6.5传统模式下的32位PAE分页技术      512.6.6传统模式下的32位PAE-4KB分页技术      522.6.7传统模式下的32位PAE-2MB分页技术      542.7IA-32e模式的内存访问      552.7.1x64架构的线性地址空间      552.7.2扩高(Canonical)地址      562.7.3扩高地址的特点和处理器检查      572.7.4兼容模式的内存访问      592.7.564位模式的内存访问      592.7.6x64架构的段寄存器      602.7.7x64架构的代码段描述符      612.7.8x64架构的数据段描述符      622.7.9x64架构的4级和5级分页      622.8x64架构的系统表和系统描述符      642.8.1x64架构的GDTR      652.8.2x64架构的IDTR      662.8.3x64架构的LDT描述符和LDTR      662.8.4x64架构的TSS描述符和TR      672.9x64架构的标志寄存器和指令指针寄存器      682.10x64架构的寻址方式      702.10.1x64架构下传统模式的寻址方式      702.10.2x64架构下IA-32e模式的寻址方式      722.10.364位模式的RIP相对寻址方式      722.10.464位模式下的指令变化情况      742.11IA-32e模式下的中断和异常处理概述      76
第3章进入IA-32e模式      783.1如何进入IA-32e模式      783.2本章代码清单      803.3执行主引导程序      1003.3.1NASM的文件包含      1003.3.2主引导程序的说明      1013.3.3用BIOS硬盘扩展读加载内核加载器      1023.3.4通过数据段访问栈中的数据结构      1053.3.5读取内核加载器程序的剩余部分      1063.3.6转入内核加载器执行      1083.4执行内核加载器      1083.4.1检测处理器是否支持IA-32e模式      1093.4.2位测试指令BT      1093.4.3获取处理器的商标和地址尺寸      1103.5进入保护模式      1133.6加载内核程序      1163.7为进入IA-32e模式准备4级分页      1193.7.12MB和1GB页面的4级分页方式      1213.7.24级头表的格式      1223.7.3页目录指针项的格式      1243.7.4页目录项和页表项的格式      1253.7.54级头表的创建和初始化      1273.7.6创建指向4级头表自身的4级头表项      1283.7.7准备映射物理内存的低端2MB空间      1283.7.8创建与低端2MB物理内存对应的分页系统表项      1313.7.9将物理内存低端的2MB映射到线性地址空间的高端      1323.7.10为多任务环境准备必要的4级头表项      1343.7.11为多任务环境预分配254个页目录指针表      1353.7.12进程上下文标识PCID      1373.7.13控制寄存器CR3的内容格式      1383.7.14设置控制寄存器CR3并开启物理地址扩展功能      1393.7.15型号专属寄存器IA32_EFER的设置和分页的开启      1403.8进入IA-32e的兼容模式执行      1413.9进入64位模式的内核执行      1423.10让内核工作在线性地址空间的高端      1433.10.1启用GDT和栈区的高端线性地址      1443.10.2使用RIP相对寻址方式计算内核的高端线性地址      1453.10.3让处理器转到内核程序对应的高端位置继续执行      1463.11初始化IA-32e模式下的中断系统      1473.11.1IA-32e模式下的中断门和陷阱门      1473.11.2IA-32e模式下的中断处理过程      1483.11.3通用的中断和异常处理策略      1493.11.4通用异常服务例程的工作过程      1503.11.5加载有效地址指令LEA      1523.11.6创建通用异常处理过程的中断门      1543.11.7安装通用异常处理过程的中断门      1553.11.8安装通用中断处理过程的中断门      1563.11.9初始化8259中断控制器      1573.11.10打印64位模式下的第一条信息      1583.12本章代码的编译和运行      159
第4章单处理器环境下的多任务管理和调度      1614.1本章代码清单      1624.2初始化快速系统调用环境      1794.2.1快速系统调用的原理      1794.2.2为快速系统调用安装段描述符      1814.2.3为快速系统调用准备段选择子      1834.2.4设置快速系统调用的入口点      1844.2.5快速系统调用时的RFLAGS和栈切换      1844.3动态内存分配      1854.3.1内核空间的分配策略      1864.3.2内核可用线性地址的获取和更新      1874.3.3立即数在64位模式下的长度限制      1884.3.4计算本次内存分配涉及的线性地址范围      1894.3.5获取与指定线性地址对应的4级头表项的线性地址      1904.3.6页面分配与页映射位串      1924.3.7页映射位串的定义和空闲页的查找      1934.3.8获取与指定线性地址对应的页目录指针项的线性地址      1954.3.9检查与指定线性地址对应的页目录指针项是否存在      1974.3.10分配页目录表并安装与线性地址对应的页目录指针项      1984.3.11安装与指定线性地址对应的页目录项、页表项和页面      1984.4创建并安装TSS描述符      1994.4.1LDT和TSS描述符的格式      2004.4.2创建和安装64位的TSS描述符并加载任务寄存器TR      2014.5初始化实时时钟中断      2024.6创建外壳任务      2034.6.1准备创建外壳任务      2034.6.2为新任务创建任务控制块PCB      2044.6.3为新任务创建4级头表      2054.6.4将指定的线性地址映射到指定的物理页      2074.6.5复制当前活动4级头表的内容给新任务的4级头表      2074.6.6切换到新任务的地址空间并清空4级头表的前半部分      2084.6.7为新任务分配0特权级使用的栈空间      2094.6.8为新任务分配3特权级使用的栈空间      2104.6.9从硬盘上加载用户程序      2114.6.10生成任务标识      2124.6.11将新任务的PCB添加到PCB链表      2134.6.12设置外壳任务的状态      2154.7设置任务状态段TSS      2164.8转到外壳任务的局部空间执行      2164.9快速系统调用的进入和返回      2184.9.1为快速系统调用指定功能号      2194.9.2根据功能号计算内核例程的线性地址      2194.9.3快速系统调用的返回和指令前缀REX      2204.10利用实时时钟中断执行任务切换      2214.10.1查找处于就绪状态的任务      2224.10.2任务切换的执行过程      2234.11外壳任务的执行过程      2244.11.1通过系统调用获取屏幕上可用的显示行坐标      2244.11.2通过系统调用获取当前时间      2254.11.3在外壳任务中显示当前时间      2264.12用户任务的创建和执行      2274.12.1当前任务标识的获取      2284.12.2用户程序例程库的介绍      2284.12.3将64位二进制数转换为十进制字符串      2294.12.4在每轮相加中将结果和加数转换为字符串      2304.12.5字符串的连接和显示      2314.12.6用户任务的终止      2324.13本章程序的编译和执行      233
第5章多处理器和APIC的初始化      2355.1多处理器环境概述      2355.2同时多线程和INTEL超线程技术      2365.3高级可编程中断控制器APIC      2385.3.1中断引脚、中断类型和中断源      2405.3.2本地中断源和本地向量表      2415.3.3APIC的工作模式和APIC ID      2425.3.4组成Local APIC ID的处理器拓扑      2435.3.5Local APIC的地址映射      2445.3.6I/O APIC的地址映射      2455.3.7多处理器的初始化过程和MP规范      2455.3.8高级的配置和电源接口(ACPI)规范      2465.4本章代码清单      2475.5获取ACPI申领的物理内存地址范围      2665.5.1ACPI的数据结构和表      2665.5.2E820功能调用和内存地址范围结构      2675.5.3查询和保存物理地址映射数据      2675.5.4准备映射ACPI申领的内存      2695.5.5映射ACPI申领的内存      2695.6访问ACPI的数据结构和表      2715.6.1根系统描述指针结构      2725.6.2搜索根系统描述指针结构      2735.6.3系统描述表的层次结构和表头格式      2735.6.4扩展的系统描述表XSDT      2745.6.5通过XSDT搜索多APIC描述表MADT      2765.6.6根系统描述表RSDT      2765.6.7通过RSDT搜索多APIC描述表MADT      2775.6.8多APIC描述表MADT的格式      2785.6.9准备遍历中断控制器结构列表      2815.6.10从中断控制器结构内提取处理器和APIC信息      2815.7映射APIC地址      2835.8测量Local APIC定时器      2845.8.1Local APIC定时器      2845.8.2Local APIC定时器的精度      2855.8.3APIC定时器的本地向量表寄存器及其设置      2865.8.4设置CMOS RTC以测量Local APIC定时器      2875.8.5测量Local APIC定时器在1ms内经历的时钟周期数      2885.9使用Local APIC定时器中断切换任务      2895.9.1多处理器系统的虚拟线模式      2905.9.2中断输入引脚LINT0的本地向量表寄存器      2905.9.3设置Local APIC定时器      2925.10使用经由I/O APIC的中断执行任务切换      2945.10.1I/O APIC概述      2955.10.2I/O APIC的I/O重定向表寄存器      2965.10.3用I/O APIC投递的中断实施任务切换      2975.11逻辑目标模式下的中断目标判别机制      2985.12APIC中断的优先级及其相关的寄存器      2995.13APIC中断的接受机制      3005.14最低优先级模式的中断处理      301
第6章多处理器环境下的多任务管理和调度      3026.1本章代码清单      3036.2高速缓存      3326.3数据竞争和锁      3336.3.1单处理器环境下的数据竞争      3346.3.2多处理器环境下的数据竞争      3366.3.3原子操作      3376.3.4锁和自旋锁      3396.3.5分支预测和PAUSE指令      3416.3.6多行宏定义      3426.3.7锁在内核例程中的应用      3446.3.8互斥锁的一般原理      3466.4内核的初始化      3476.4.1处理器专属存储区(每CPU数据区)      3476.4.2为自举处理器BSP分配专属存储区      3496.4.3处理器专属存储区的访问      3506.5多处理器系统的初始化      3516.5.1多处理器系统的初始化协议算法      3526.5.2本章的多处理器多任务调度方案      3536.5.3中断命令寄存器ICR      3556.5.4本章的AP初始化代码简介      3576.5.5将AP初始化代码传送到指定位置      3576.5.6向所有应用处理器广播SIPI消息      3586.6应用处理器AP的初始化过程      3596.6.1进入保护模式      3606.6.2进入64位模式      3606.6.3为每个应用处理器创建必要的数据结构      3626.6.4对称多处理器系统的实现      3636.6.5用SWAPGS指令访问专属存储区      3656.6.6开启Local APIC并进入停机待命状态      3666.7由自举处理器BSP继续完成剩余的内核初始化工作      3676.7.1等待所有应用处理器完成初始化      3676.7.2创建系统外壳任务并为其指定时间片      3686.7.3广播新任务认领消息并进入预定状态      3696.8多处理器多任务的管理和调度      3706.8.1新任务认领中断的处理过程      3706.8.2在任务链表中查找就绪任务      3726.8.3用CMPXCHG指令以无锁方式操作链表节点      3736.8.4为新任务指定时间片      3756.8.5恢复任务的状态并开始执行      3766.8.6时间片到期中断的处理过程      3776.8.7处理器专属存储区的必要性      3786.8.8外壳任务的执行流程      3796.8.9用户任务的执行流程      3806.8.10任务的终止      3816.9程序的编译和执行      382
第7章多处理器环境下的多线程管理和调度      3837.1任务(进程)和线程      3837.2本章代码清单      3847.3本章的任务控制块PCB和线程控制块TCB      4187.4任务及其主线程的创建      4217.5线程的调度和切换      4227.5.1新线程认领中断的处理过程      4237.5.2查找处于就绪状态的线程      4247.5.3恢复并执行指定的线程      4257.5.4时间片到期中断的处理过程      4267.6系统外壳任务及其主线程的执行      4277.7将例程创建为线程      4297.7.1将例程创建为线程      4297.7.2创建线程控制块TCB和线程私有的栈      4307.7.3例程返回和结束线程的区别      4307.7.4如何用RET指令结束线程      4317.7.5在栈中构造结束线程的栈帧      4327.7.6将TCB添加到当前任务的TCB链表      4347.8线程的执行      4357.8.1动态内存分配      4357.8.2在栈中保存所有缓冲区的线性地址      4367.8.3字符串的生成、连接和打印      4387.9线程的结束和任务的终止      4387.10程序的编译和执行      439第8章数据竞争和互斥锁      441
8.1本章代码清单      4418.2线程的休眠和唤醒      5018.2.1执行线程休眠的系统调用      5018.2.2保存和修改休眠线程的状态      5038.2.3安装系统管理中断      5058.2.4系统管理中断的处理过程      5058.2.5唤醒休眠的线程      5078.3数据竞争的实例      5078.3.1在两个同时执行的线程内访问共享数据      5088.3.2线程等待      5098.3.3唤醒处于等待状态的线程      5108.3.4打印两个线程操作之后的共享数据      5118.3.5并发线程的数据竞争过程      5138.4使用锁定的原子操作解决数据竞争      5148.5使用互斥锁解决数据竞争      5158.5.1互斥锁的创建和初始化      5158.5.2互斥锁的获取(加锁)      5168.5.3唤醒等待互斥锁的线程      5178.5.4互斥锁的释放      5178.5.5使用互斥锁之后的运行效果      5188.6互斥锁的应用策略      519
代码索引      521

站长 发表于 2024-5-20 16:43:08

相关资源:

编辑和编译工具(Nasmide和Fixvhdwr等工具)下载:
源文件(各章的汇编语言源程序文件)下载:
完整的配书文件包(以上两者的综合)下载:


签名书含邮费共计98元每本,需要签名书的同学请给站长留言。



努力学习的小菜 发表于 2024-5-30 12:45:25

老师新书什么时候能买到

站长 发表于 2024-5-30 12:58:07

努力学习的小菜 发表于 2024-5-30 12:45
老师新书什么时候能买到

昨天编辑说已经开始印刷了。印刷完入库,上架。估计也就十来天吧。

lincolln 发表于 2024-6-1 08:43:16

老师好,windows一直提示 有病毒,是什么原因:

站长 发表于 2024-6-1 10:09:51

lincolln 发表于 2024-6-1 08:43
老师好,windows一直提示 有病毒,是什么原因:

尚不太清楚。我的计算机是Windows 10,我一直用它自带的Windows Defender。
我自己尝试下载,检测,Windows Defender报告说没有发现威胁。
从你发的截图,我看不到X64_Source是怎么报告的。如果也报告威胁,那就不可能了。因为这个文件夹只包含源码,以及生成的二进制文件。

lincolln 发表于 2024-6-2 22:51:38

站长 发表于 2024-6-1 10:09
尚不太清楚。我的计算机是Windows 10,我一直用它自带的Windows Defender。
我自己尝试下载,检测,Windo ...

老师好,sourc没有问题,asm和binary两个系统说有问题。系统是 Microsoft Windows 11 企业版,如图:

站长 发表于 2024-6-3 09:36:46

lincolln 发表于 2024-6-2 22:51
老师好,sourc没有问题,asm和binary两个系统说有问题。系统是 Microsoft Windows 11 企业版,如图: ...

报告的危险来自于文件LEARN.VHD
这是一个虚拟硬盘,能有什么危险呢?这是误报。
页: [1] 2 3
查看完整版本: 《x86汇编语言:编写64位多处理器多线程操作系统》图书介绍和资源下载