返回首页
苏宁会员
购物车 0
易付宝
手机苏宁

服务体验

店铺评分与同行业相比

用户评价:----

物流时效:----

售后服务:----

  • 服务承诺: 正品保障
  • 公司名称:
  • 所 在 地:
本店所有商品

  • [正版]x86汇编语言 编写64位多处理器多线程操作系统 64位处理器基本架构 64位模式下的多处理器管理书 电子工
  • 新商品上架
    • 作者: 李忠著 | 无编
    • 出版社: 电子工业出版社
    送至
  • 由""直接销售和发货,并提供售后服务
  • 加入购物车 购买电子书
    服务

    看了又看

    商品预定流程:

    查看大图
    /
    ×

    苏宁商家

    商家:
    句字图书专营店
    联系:
    • 商品

    • 服务

    • 物流

    搜索店内商品

    商品分类

    商品参数
    • 作者: 李忠著| 无编
    • 出版社:电子工业出版社
    • 页数:536页
    • ISBN:9788022258276
    • 版权提供:电子工业出版社

    编辑推荐

    适读人群 :主要面向高级语言程序员,广大计算机专业学生,计算机科学与技术学习者等。

    传统上,大家都是在流行的操作系统(如Windows和Linux)上编写并发程序的,而且只能使用高级语言。这使得多处理器环境下的多任务和多线程调度、原子操作、锁、线程同步等内容对很多人来说是笼统的、抽象的,像隔了层纱一样,看不见本质。相反,如果用汇编语言实现一个简单的操作系统内核,并演示多处理器环境下的多任务、多线程、锁和线程同步,这是可能的吗?我相信没有人会觉得这是简单的事情。但事实上,如果你想来一个简单的,其实也很容易,这本书就能告诉你如何实现它

    内容简介

    编写一个简单的、简易的操作系统雏形,用来演示64位环境下的多处理器管理、动态内存分配、多处理器多任务的调度和切换、多处理器多线程的调度和切换、数据竞争和锁,但它不包括文件管理、设备管理等内容。本书主要聚焦以下问题:1,与IA-32架构进行对比,介绍64位处理器的基本架构,包括寄存器的变化、指令集和工作模式的变化、系统表的变化、内存组织和内存访问模式的变化;2,IA-32e模式的特点及如何进入IA-32e模式,重点介绍其64位子模式;3,IA-32e模式的4级和5级分页;4,IA-32e模式下的中断和异常处理;5,64位模式下的单处理器多任务和任务切换;6,64位模式下的多处理器管理和初始化,包括高级可编程中断控制器APIC;7,64位模式下的多处理器多任务和任务切换;8,64位模式下的多处理器多线程和线程切换;9,高速缓存及与多线程有关的原子操作、锁、线程同步,等等。
    作者简介

    李忠,2000年至今,长春电视台。主要出版著作《穿越计算机的迷雾》(第1、第2版)《x86汇编语言:从实模式到保护模式》(第1、第2版)《C语言非常道》等。
    精彩书评

    米龙评论:过去学习操作系统理论知识,诸多晦涩的概念难以理解,对于虚拟内存、分页、数据竞争、锁、原子操作等机制如同隔雾看花,不得要领。本书首次从汇编语言层面剖析了操作系统的基本原理,深入讲解了时下主流的x64多处理器架构。跟随本书章节,诸多迷雾豁然开朗。

    零叶小舟评价:非常棒的内容,老师对INTEL CPU 和操作系统研究得太透彻啦!这是我学过的操作系统课程中最好的,没有之一。学完之后,知其然,知其所以然。希望老师继续开课,比如 ARM 汇编、手写Linux 操作系统等。

    Hiodis评价:底层,核心,精简,极致,丰富,到位。

    目 录
    第1章 基本要求和相关说明 1
    1.1 配书代码和工具 1
    1.2 NASM的下载和安装 1
    1.3 NASMIDE的下载和使用 3
    1.4 下载和安装VirtualBox 7
    1.5 使用FixVhdWr将程序写入虚拟硬盘 8
    1.6 本书的代码组织 10
    第2章 x64架构的基本执行环境 37
    2.1 x64架构的由来 37
    2.2 物理地址、有效地址和线性地址 39
    2.3 x64架构的工作模式 40
    2.3.1 x86处理器的工作模式 40
    2.3.2 IA-32e模式及其子模式 41
    2.4 x64架构的寄存器 43
    2.4.1 x64架构对通用寄存器的扩展 43
    2.4.2 x64架构的通用寄存器访问规则 45
    2.5 x86处理器的物理地址空间 46
    2.6 传统模式的内存访问 47
    2.6.1 传统模式下的线性地址和物理地址 47
    2.6.2 传统模式下的32位4KB分页技术 48
    2.6.3 传统模式下如何利用超过4GB的物理内存 49
    2.6.4 传统模式下的32位4MB分页技术 50
    2.6.5 传统模式下的32位PAE分页技术 52
    2.6.6 传统模式下的32位PAE-4KB分页技术 52
    2.6.7 传统模式下的32位PAE-2MB分页技术 54
    2.7 IA-32e模式的内存访问 56
    2.7.1 x64架构的线性地址空间 56
    2.7.2 扩高(Canonical)地址 57
    2.7.3 扩高地址的特点和处理器检查 58
    2.7.4 兼容模式的内存访问 59
    2.7.5 64位模式的内存访问 60
    2.7.6 x64架构的段寄存器 60
    2.7.7 x64架构的代码段描述符 61
    2.7.8 x64架构的数据段描述符 62
    2.7.9 x64架构的4级和5级分页 63
    2.8 x64架构的系统表和系统描述符 65
    2.8.1 x64架构的GDTR 65
    2.8.2 x64架构的IDTR 66
    2.8.3 x64架构的LDT描述符和LDTR 67
    2.8.4 x64架构的TSS描述符和TR 68
    2.9 x64架构的标志寄存器和指令指针寄存器 69
    2.10 x64架构的寻址方式 71
    2.10.1 x64架构下传统模式的寻址方式 71
    2.10.2 x64架构下IA-32e模式的寻址方式 72
    2.10.3 64位模式的RIP相对寻址方式 73
    2.10.4 64位模式下的指令变化情况 75
    2.11 IA-32e模式下的中断和异常处理概述 77
    第3章 进入IA-32e模式 79
    3.1 如何进入IA-32e模式 79
    3.2 本章代码清单 81
    3.3 执行主引导程序 101
    3.3.1 NASM的文件包含 101
    3.3.2 主引导程序的说明 102
    3.3.3 用BIOS硬盘扩展读加载内核加载器 103
    3.3.4 通过数据段访问栈中的数据结构 106
    3.3.5 读取内核加载器程序的剩余部分 107
    3.3.6 转入内核加载器执行 109
    3.4 执行内核加载器 110
    3.4.1 检测处理器是否支持IA-32e模式 110
    3.4.2 位测试指令BT 111
    3.4.3 获取处理器的商标和地址尺寸 111
    3.5 进入保护模式 115
    3.6 加载内核程序 118
    3.7 为进入IA-32e模式准备4级分页 121
    3.7.1 2MB和1GB页面的4级分页方式 122
    3.7.2 4级头表的格式 123
    3.7.3 页目录指针项的格式 125
    3.7.4 页目录项和页表项的格式 127
    3.7.5 4级头表的创建和初始化 129
    3.7.6 创建指向4级头表自身的4级头表项 129
    3.7.7 准备映射物理内存的低端2MB空间 130
    3.7.8 创建与低端2MB物理内存对应的分页系统表项 132
    3.7.9 将物理内存低端的2MB映射到线性地址空间的高端 134
    3.7.10 为多任务环境准备必要的4级头表项 136
    3.7.11 为多任务环境预分配254个页目录指针表 137
    3.7.12 进程上下文标识PCID 139
    3.7.13 控制寄存器CR3的内容格式 140
    3.7.14 设置控制寄存器CR3并开启物理地址扩展功能 141
    3.7.15 型号专属寄存器IA32_EFER的设置和分页的开启 142
    3.8 进入IA-32e的兼容模式执行 143
    3.9 进入64位模式的内核执行 144
    3.10 让内核工作在线性地址空间的高端 145
    3.10.1 启用GDT和栈区的高端线性地址 146
    3.10.2 使用RIP相对寻址方式计算内核的高端线性地址 147
    3.10.3 让处理器转到内核程序对应的高端位置继续执行 148
    3.11 初始化IA-32e模式下的中断系统 149
    3.11.1 IA-32e模式下的中断门和陷阱门 149
    3.11.2 IA-32e模式下的中断处理过程 151
    3.11.3 通用的中断和异常处理策略 152
    3.11.4 通用异常服务例程的工作过程 152
    3.11.5 加载有效地址指令LEA 155
    3.11.6 创建通用异常处理过程的中断门 156
    3.11.7 安装通用异常处理过程的中断门 157
    3.11.8 安装通用中断处理过程的中断门 159
    3.11.9 初始化8259中断控制器 159
    3.11.10 打印64位模式下的第一条信息 160
    3.12 本章代码的编译和运行 162
    第4章 单处理器环境下的多任务管理和调度 164
    4.1 本章代码清单 165
    4.2 初始化快速系统调用环境 182
    4.2.1 快速系统调用的原理 182
    4.2.2 为快速系统调用安装段描述符 184
    4.2.3 为快速系统调用准备段选择子 186
    4.2.4 设置快速系统调用的入口点 187
    4.2.5 快速系统调用时的RFLAGS和栈切换 188
    4.3 动态内存分配 189
    4.3.1 内核空间的分配策略 189
    4.3.2 内核可用线性地址的获取和更新 190
    4.3.3 立即数在64位模式下的长度限制 192
    4.3.4 计算本次内存分配涉及的线性地址范围 193
    4.3.5 获取与指定线性地址对应的4级头表项的线性地址 193
    4.3.6 页面分配与页映射位串 196
    4.3.7 页映射位串的定义和空闲页的查找 197
    4.3.8 获取与指定线性地址对应的页目录指针项的线性地址 199
    4.3.9 检查与指定线性地址对应的页目录指针项是否存在 201
    4.3.10 分配页目录表并安装与线性地址对应的页目录指针项 201
    4.3.11 安装与指定线性地址对应的页目录项、页表项和页面 202
    4.4 创建并安装TSS描述符 203
    4.4.1 LDT和TSS描述符的格式 204
    4.4.2 创建和安装64位的TSS描述符并加载任务寄存器TR 205
    4.5 初始化实时时钟中断 206
    4.6 创建外壳任务 207
    4.6.1 准备创建外壳任务 207
    4.6.2 为新任务创建任务控制块PCB 208
    4.6.3 为新任务创建4级头表 209
    4.6.4 将指定的线性地址映射到指定的物理页 211
    4.6.5 复制当前活动4级头表的内容给新任务的4级头表 212
    4.6.6 切换到新任务的地址空间并清空4级头表的前半部分 212
    4.6.7 为新任务分配0特权级使用的栈空间 213
    4.6.8 为新任务分配3特权级使用的栈空间 214
    4.6.9 从硬盘上加载用户程序 215
    4.6.10 生成任务标识 216
    4.6.11 将新任务的PCB添加到PCB链表 217
    4.6.12 设置外壳任务的状态 220
    4.7 设置任务状态段TSS 220
    4.8 转到外壳任务的局部空间执行 221
    4.9 快速系统调用的进入和返回 222
    4.9.1 为快速系统调用指定功能号 223
    4.9.2 根据功能号计算内核例程的线性地址 223
    4.9.3 快速系统调用的返回和指令前缀REX 225
    4.10 利用实时时钟中断执行任务切换 226
    4.10.1 查找处于就绪状态的任务 226
    4.10.2 任务切换的执行过程 227
    4.11 外壳任务的执行过程 229
    4.11.1 通过系统调用获取屏幕上可用的显示行坐标 229
    4.11.2 通过系统调用获取当前时间 230
    4.11.3 在外壳任务中显示当前时间 231
    4.12 用户任务的创建和执行 232
    4.12.1 当前任务标识的获取 233
    4.12.2 用户程序例程库的介绍 233
    4.12.3 将64位二进制数转换为十进制字符串 234
    4.12.4 在每轮相加中将结果和加数转换为字符串 235
    4.12.5 字符串的连接和显示 236
    4.12.6 用户任务的终止 236
    4.13 本章程序的编译和执行 238
    第5章 多处理器和APIC的初始化 240
    5.1 多处理器环境概述 240
    5.2 同时多线程和INTEL超线程技术 241
    5.3 高级可编程中断控制器APIC 243
    5.3.1 中断引脚、中断类型和中断源 245
    5.3.2 本地中断源和本地向量表 246
    5.3.3 APIC的工作模式和APIC ID 247
    5.3.4 组成Local APIC ID的处理器拓扑 248
    5.3.5 Local APIC的地址映射 249
    5.3.6 I/O APIC的地址映射 250
    5.3.7 多处理器的初始化过程和MP规范 251
    5.3.8 高级的配置和电源接口(ACPI)规范 252
    5.4 本章代码清单 252
    5.5 获取ACPI申领的物理内存地址范围 271
    5.5.1 ACPI的数据结构和表 271
    5.5.2 E820功能调用和内存地址范围结构 272
    5.5.3 查询和保存物理地址映射数据 272
    5.5.4 准备映射ACPI申领的内存 274
    5.5.5 映射ACPI申领的内存 275
    5.6 访问ACPI的数据结构和表 277
    5.6.1 根系统描述指针结构 277
    5.6.2 搜索根系统描述指针结构 278
    5.6.3 系统描述表的层次结构和表头格式 278
    5.6.4 扩展的系统描述表XSDT 280
    5.6.5 通过XSDT搜索多APIC描述表MADT 281
    5.6.6 根系统描述表RSDT 282
    5.6.7 通过RSDT搜索多APIC描述表MADT 283
    5.6.8 多APIC描述表MADT的格式 284
    5.6.9 准备遍历中断控制器结构列表 286
    5.6.10 从中断控制器结构内提取处理器和APIC信息 287
    5.7 映射APIC地址 288
    5.8 测量Local APIC定时器 289
    5.8.1 Local APIC定时器 290
    5.8.2 Local APIC定时器的精度 290
    5.8.3 APIC定时器的本地向量表寄存器及其设置 291
    5.8.4 设置CMOS RTC以测量Local APIC定时器 292
    5.8.5 测量Local APIC定时器在1ms内经历的时钟周期数 294
    5.9 使用Local APIC定时器中断切换任务 295
    5.9.1 多处理器系统的虚拟线模式 295
    5.9.2 中断输入引脚LINT0的本地向量表寄存器 296
    5.9.3 设置Local APIC定时器 298
    5.10 使用经由I/O APIC的中断执行任务切换 299
    5.10.1 I/O APIC概述 300
    5.10.2 I/O APIC的I/O重定向表寄存器 302
    5.10.3 用I/O APIC投递的中断实施任务切换 303
    5.11 逻辑目标模式下的中断目标判别机制 304
    5.12 APIC中断的优先级及其相关的寄存器 305
    5.13 APIC中断的接受机制 306
    5.14 最低优先级模式的中断处理 307
    第6章 多处理器环境下的多任务管理和调度 308
    6.1 本章代码清单 309
    6.2 高 速 缓 存 338
    6.3 数据竞争和锁 339
    6.3.1 单处理器环境下的数据竞争 340
    6.3.2 多处理器环境下的数据竞争 342
    6.3.3 原子操作 343
    6.3.4 锁和自旋锁 345
    6.3.5 分支预测和PAUSE指令 347
    6.3.6 多行宏定义 348
    6.3.7 锁在内核例程中的应用 350
    6.3.8 互斥锁的一般原理 352
    6.4 内核的初始化 353
    6.4.1 处理器专属存储区(每CPU数据区) 354
    6.4.2 为自举处理器BSP分配专属存储区 355
    6.4.3 处理器专属存储区的访问 356
    6.5 多处理器系统的初始化 358
    6.5.1 多处理器系统的初始化协议算法 358
    6.5.2 本章的多处理器多任务调度方案 360
    6.5.3 中断命令寄存器ICR 362
    6.5.4 本章的AP初始化代码简介 363
    6.5.5 将AP初始化代码传送到指定位置 364
    6.5.6 向所有应用处理器广播SIPI消息 365
    6.6 应用处理器AP的初始化过程 366
    6.6.1 进入保护模式 366
    6.6.2 进入64位模式 367
    6.6.3 为每个应用处理器创建必要的数据结构 369
    6.6.4 对称多处理器系统的实现 370
    6.6.5 用SWAPGS指令访问专属存储区 371
    6.6.6 开启Local APIC并进入停机待命状态 373
    6.7 由自举处理器BSP继续完成剩余的内核初始化工作 374
    6.7.1 等待所有应用处理器完成初始化 374
    6.7.2 创建系统外壳任务并为其指定时间片 375
    6.7.3 广播新任务认领消息并进入预定状态 376
    6.8 多处理器多任务的管理和调度 377
    6.8.1 新任务认领中断的处理过程 377
    6.8.2 在任务链表中查找就绪任务 379
    6.8.3 用CMPXCHG指令以无锁方式操作链表节点 381
    6.8.4 为新任务指定时间片 382
    6.8.5 恢复任务的状态并开始执行 383
    6.8.6 时间片到期中断的处理过程 384
    6.8.7 处理器专属存储区的必要性 385
    6.8.8 外壳任务的执行流程 387
    6.8.9 用户任务的执行流程 388
    6.8.10 任务的终止 388
    6.9 程序的编译和执行 389
    第7章 多处理器环境下的多线程管理和调度 391
    7.1 任务(进程)和线程 391
    7.2 本章代码清单 392
    7.3 本章的任务控制块PCB和线程控制块TCB 426
    7.4 任务及其主线程的创建 429
    7.5 线程的调度和切换 431
    7.5.1 新线程认领中断的处理过程 431
    7.5.2 查找处于就绪状态的线程 432
    7.5.3 恢复并执行指定的线程 434
    7.5.4 时间片到期中断的处理过程 435
    7.6 系统外壳任务及其主线程的执行 436
    7.7 将例程创建为线程 437
    7.7.1 将例程创建为线程 437
    7.7.2 创建线程控制块TCB和线程私有的栈 438
    7.7.3 例程返回和结束线程的区别 439
    7.7.4 如何用RET指令结束线程 440
    7.7.5 在栈中构造结束线程的栈帧 441
    7.7.6 将TCB添加到当前任务的TCB链表 442
    7.8 线程的执行 443
    7.8.1 动态内存分配 444
    7.8.2 在栈中保存所有缓冲区的线性地址 444
    7.8.3 字符串的生成、连接和打印 446
    7.9 线程的结束和任务的终止 447
    7.10 程序的编译和执行 448
    第8章 数据竞争和互斥锁 450
    8.1 本章代码清单 450
    8.2 线程的休眠和唤醒 510
    8.2.1 执行线程休眠的系统调用 510
    8.2.2 保存和修改休眠线程的状态 512
    8.2.3 安装系统管理中断 514
    8.2.4 系统管理中断的处理过程 515
    8.2.5 唤醒休眠的线程 516
    8.3 数据竞争的实例 516
    8.3.1 在两个同时执行的线程内访问共享数据 517
    8.3.2 线程等待 519
    8.3.3 唤醒处于等待状态的线程 520
    8.3.4 打印两个线程操作之后的共享数据 520
    8.3.5 并发线程的数据竞争过程 522
    8.4 使用锁定的原子操作解决数据竞争 523
    8.5 使用互斥锁解决数据竞争 525
    8.5.1 互斥锁的创建和初始化 525
    8.5.2 互斥锁的获取(加锁) 525
    8.5.3 唤醒等待互斥锁的线程 526
    8.5.4 互斥锁的释放 527
    8.5.5 使用互斥锁之后的运行效果 527
    8.6 互斥锁的应用策略 528
    前言/序言

    十年前,我写了一本书,名字叫《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汇编语言:从实模式到保护模式》一书。

    为方便阅读,我把代码都印在书里了。这样做自然会增加书的厚度及成本,但相对于给你带来的便利和时间上的节省来说,还是值得的。

    1
    • 商品详情
    • 内容简介

    售后保障

    最近浏览

    猜你喜欢

    该商品在当前城市正在进行 促销

    注:参加抢购将不再享受其他优惠活动

    x
    您已成功将商品加入收藏夹

    查看我的收藏夹

    确定

    非常抱歉,您前期未参加预订活动,
    无法支付尾款哦!

    关闭

    抱歉,您暂无任性付资格

    此时为正式期SUPER会员专享抢购期,普通会员暂不可抢购