第10章 计算机操作系统——舞台幕后的工作者 1068
10.1 内存布局与管理 1068
10.1.1 实模式与保护模式 1068
10.1.2 分区式内存管理 1070
10.1.3 8086分段+实模式 1071
10.1.4 80286分段+保护模式 1074
10.1.4.1 全局描述符表 1074
10.1.4.2 实现权限检查 1076
10.1.4.3 本地/局部描述符表 1076
10.1.5 80386分段+分页模式 1079
10.1.5.1 页目录/页表/页面 1079
10.1.5.2 比较分页和分段机制 1080
10.1.5.3 Flat分段模式 1081
10.1.5.4 分页的控制参数 1083
10.1.5.5 MMU和TLB 1086
10.1.6 DOS下的内存管理 1087
10.1.6.1 常规内存和上位内存 1088
10.1.6.2 EMS内存扩充卡 1089
10.1.6.3 上位内存块(UMB) 1090
10.1.6.4 高位内存区(HMA) 1090
10.1.6.5 扩展内存(XMS) 1090
10.1.6.6 用XMS顶替EMS 1090
10.1.7 后DOS时代x86内存布局 1091
10.1.7.1 E820表 1091
10.1.7.2 物理地址扩展(PAE) 1092
10.1.7.3 x86物理内存布局 1092
10.1.8 Linux下的内存管理 1094
10.1.8.1 32位Linux内存布局 1094
10.1.8.2 相关模块数据结构 1098
10.1.8.3 brk和mmap系统调用 1100
10.1.8.4 malloc/calloc/realloc函数 1104
10.1.8.5 buddy和slab算法 1105
10.2 任务创建与管理 1109
10.2.1 32位x86处理器任务管理支持 1110
10.2.1.1 用户栈与内核栈 1111
10.2.1.2 线程和中断上下文 1113
10.2.1.3 任务切换机制 1116
10.2.1.4 任务嵌套/任务链 1122
10.2.1.5 小结 1125
10.2.2 32位Linux的任务创建与管理 1126
10.2.2.1 PCB/task_struct{} 1127
10.2.2.2 Linux的任务软切换机制 1130
10.2.2.3 进程0的创建和运行 1132
10.2.2.4 进程1和2的创建和运行 1136
10.2.2.5 在用户态创建和运行任务 1148
10.2.2.6 fork()自测题及深入思考 1153
10.2.2.7 用户空间线程/协程 1155
10.2.2.8 任务状态 1158
10.3 任务间通信与同步 1159
10.3.1 信号及其处理 1159
10.3.2 等待队列与唤醒 1172
10.3.3 进程间通信 1177
10.3.4 锁和同步 1178
10.3.4.1 信号量(Semaphore) 1178
10.3.4.2 互斥量(Mutex) 1181
10.3.4.3 自旋锁(Spinlock) 1181
10.3.4.4 快速互斥量(Futex) 1184
10.3.4.5 条件量(Condition) 1186
10.3.4.6 完成量(Completion) 1187
10.3.4.7 读写锁(RWlock)和RCU锁 1188
10.4 任务调度基本框架 1188
10.4.1 任务的调度时机 1189
10.4.2 用户态和内核态抢占 1190
10.4.3 中期小结 1196
10.4.4 实时与非实时内核 1198
10.4.5 任务调度基本数据结构 1201
10.4.5.1 任务优先级描述 1201
10.4.5.2 三大子调度器 1203
10.4.5.3 运行队列的组织 1204
10.5 任务调度核心方法 1211
10.5.1 简单粗暴的实时任务调度 1211
10.5.2 左右为难的普通任务调度 1213
10.5.3 2.4内核中的O(n)调度器 1214
10.5.4 2.5内核中的O(1)调度器 1215
10.5.5 未被接纳的RSDL普通任务调度器 1216
10.5.6 沿用至今的CFS普通任务调度器 1219
10.5.6.1 指挥棒变为运行时间 1219
10.5.6.2 weight/period/vruntime 1219
10.5.7 多处理器任务负载均衡 1221
10.5.8 任务的Affinity 1224
10.6 中断响应及处理 1224
10.6.1 中断相关基本知识 1224
10.6.1.1 Local和I/O APIC 1224
10.6.1.2 8259A (PIC)中断控制器 1229
10.6.1.3 MSI/MSI-X底层实现 1230
10.6.1.4 IPI处理器间中断 1231
10.6.1.5 可屏蔽/不可屏蔽中断 1232
10.6.1.6 中断的共享和嵌套 1233
10.6.1.7 中断内部/外部优先级 1234
10.6.1.8 中断Affinity及均衡 1234
10.6.2 中断相关数据结构 1238
10.6.2.1 中断描述符表IDT 1240
10.6.2.2 irq_desc[]和vector_irq[] 1243
10.6.2.3 相关数据结构的初始化 1246
10.6.3 中断基本处理流程 1255
10.6.4 80h号中断(系统调用) 1257
10.6.5 中断上半部和下半部 1260
10.6.5.1 softirq 1261
10.6.5.2 ksoftirqd线程 1262
10.6.5.3 softirq与preempt_count 1264
10.6.5.4 tasklet 1265
10.6.5.5 workqueue 1266
10.6.6 中断线程化 1271
10.6.7 系统的驱动力 1272
10.7 时间管理与时钟中断 1272
10.7.1 表哥的收藏 1273
10.7.1.1 RTC 1273
10.7.1.2 PIT 1273
10.7.1.3 HPET 1274
10.7.1.4 Local Timer 1275
10.7.1.5 TSC 1277
10.7.2 表哥的烦恼 1277
10.7.2.1 软计时 1277
10.7.2.2 软Timer 1277
10.7.2.3 软Tick 1278
10.7.2.4 单调时钟源 1278
10.7.2.5 中断广播唤醒 1279
10.7.2.6 强制周期性中断广播 1280
10.7.3 表哥的记忆 1280
10.7.3.1 Clocksource Device 1280
10.7.3.2 Clockevent Device 1281
10.7.3.3 Local/Global Device 1284
10.7.3.4 HZ/Jiffy/NOHZ 1284
10.7.3.5 各种时间种类 1284
10.7.3.6 低精度定时器时间轮 1285
10.7.3.7 高精度定时器红黑树 1287
10.7.4 表哥的思维 1289
10.7.4.1 tickinit() 1289
10.7.4.2 init_timers() 1290
10.7.4.3 hrtimers_init() 1291
10.7.4.4 timekeeping_init() 1291
10.7.4.5 time_init()/late_time_init() 1291
10.7.4.6 APIC_init_uniprocessor() 1299
10.7.4.7 do_basic_setup()/do_initcalls() 1299
10.7.4.8 初始化流程全局图 1299
10.7.5 表哥的行动 1299
10.7.5.1 初始的低精度+HZ模式 1299
10.7.5.2 切换到低精度+NOHZ模式 1302
10.7.5.3 切换到高精度+NOHZ模式 1305
10.7.5.4 idle与NOHZ 1305
10.7.5.5 切换高精度模式流程图 1306
10.8 VFS与本地FS 1310
10.8.1 VFS目录层 1310
10.8.1.1 目录与VFS 1310
10.8.1.2 目录承载者 1311
10.8.2 本地FS相关数据结构 1313
10.8.3 VFS相关数据结构及初始化 1314
10.8.3.1 Mount流程 1315
10.8.3.2 Open流程 1319
10.8.4 从read到Page Cache 1319
10.8.5 从Page Cache到通用块层 1320
10.8.6 Linux下的异步I/O 1322
10.8.6.1 基于glibc的异步I/O 1324
10.8.6.2 基于libaio的异步I/O 1324
10.9 块I/O协议栈 1327
10.9.1 从通用块层到I/O调度层 1327
10.9.1.1 块设备与buffer page 1327
10.9.1.2 bio 1328
10.9.2 从I/O调度层到块设备驱动 1329
10.9.2.1 Request与Request Queue 1329
10.9.2.2 堵盖儿和掀盖儿 1331
10.9.2.3 _make_request主流程 1333
10.9.2.4 I/O Schedule 1335
10.9.3 相关数据结构的初始化 1335
10.9.3.1 request_queue初始化 1336
10.9.3.2 gendisk/scsi_disk/block_device初始化 1337
10.9.4 从块设备驱动到SCSI中间层 1338
10.9.5 从SCSI中间层到通道控制器驱动 1339
10.10 网络I/O协议栈 1339
10.10.1 socket的初始化 1342
10.10.2 socket的创建和绑定 1342
10.10.3 发起TCP连接 1343
10.13 小结 1347
第11章 现代计算机系统——形态与生态 1350
11.1 工业级相关计算机产品 1350
11.1.1 工业控制 1350
11.1.2 军工和航空航天 1351
11.2 企业级相关计算机产品 1352
11.2.1 芯片与板卡 1354
11.2.2 服务器 1356
11.2.2.1 塔式服务器 1356
11.2.2.2 机架式服务器 1357
11.2.2.3 刀片服务器 1359
11.2.2.4 模块化服务器 1362
11.2.2.5 整机柜服务器 1366
11.2.2.6 关键应用主机 1369
11.2.3 网络系统 1369
11.2.3.1 以太网卡 1369
11.2.3.2 以太网交换机和路由器 1370
11.2.4 存储系统 1372
11.2.4.1 机械磁盘 1375
11.2.4.2 固态硬盘 1387
11.2.4.3 SAN存储系统 1393
11.2.4.4 分布式存储系统 1402
11.2.4.5 数据恢复 1404
11.2.5 超融合系统 1407
11.2.6 数据备份和容灾系统 1411
11.2.7 云计算和云存储 1416
11.2.8 自主可控系统 1423
11.3 消费级相关计算机产品 1425
11.3.1 智能手机 1426
11.3.2 电视盒/智能电视 1426
11.3.3 摄像机 1427
11.3.4 玩具 1427
第12章 机器学习与人工智能 1430
12.1 回归分析:愚者千虑必有一得 1430
12.2 逻辑分类:不是什么都能一刀切 1433
12.3 神经网络:竟可万能拟合 1436
12.4 深度神经网络:四两拨千斤 1448
12.5 对象检测:先抠图后识别 1454
12.6 卷积神经网络:图像识别利器 1455
12.7 可视化展现:盲人真的摸出了象 1466
12.8 具体实现:搭台唱戏和硬功夫 1479
12.9 人工智能:本能、智能、超能 1491
尾声 狂想计算机——以创造者的名义 1494
1.狂想计算机 1494
2.狂想组合逻辑电路与通用代码 1495
3.狂想分子逻辑门与光逻辑门计算机 1495
4.狂想生物分子计算机 1497
5.狂想模拟信号计算机 1502
6.狂想空间场计算机 1504
7.狂想计算机世界的时空 1505