书籍详情

奔跑吧Linux内核:基础架构+调试与案例分析(套装2册)

奔跑吧Linux内核:基础架构+调试与案例分析(套装2册)

作者:笨叔 著

出版社:人民邮电出版社

出版时间:2022-06-01

ISBN:9787115007452

定价:¥248.90

购买这本书可以去
内容简介
  9787115549990 奔跑吧Linux内核(第2版)卷1:基础架构 139.00 9787115552525 奔跑吧Linux内核(第2版)卷2:调试与案例分析 109.90《奔跑吧Linux内核(第2版)卷1:基础架构》 本书基于Linux 5.0内核的源代码讲述Linux内核中核心模块的实现。本书共9章,主要内容包括处理器架构、ARM64在Linux内核中的实现、内存管理之预备知识、物理内存与虚拟内存、内存管理之高级主题、内存管理之实战案例、进程管理之基本概念、进程管理之调度和负载均衡、进程管理之调试与案例分析。 本书适合Linux系统开发人员、嵌入式系统开发人员及Android开发人员阅读,也可供计算机相关专业的师生阅读。 《奔跑吧Linux内核(第2版)卷2:调试与案例分析》 本书基于Linux 5.0内核的源代码讲述Linux内核的调试技巧和案例。本书共6章。主要内容包括并发与同步,中断管理,内核调试和性能优化,基于x86_64的宕机难题解决方案,基于ARM64的宕机题解决方案,安全漏洞的产生原理与修复方案等。 本书适合从事Linux系统开发人员、嵌入式系统开发人员及Android开发人员阅读,也可供计算机相关专业的师生阅读。
作者简介
  笨叔,Linux内核爱好者,出版过《奔跑吧Linux内核》《奔跑吧 Linux内核 入门篇》。创建了奔跑吧Linux社区。
目录
《奔跑吧Linux内核(第2版)卷1:基础架构》
目  录

第 1章 处理器架构 1

1.1 处理器架构介绍 3

1.1.1 精简指令集和复杂指令集 3

1.1.2 大/小端字节序 3

1.1.3 一条存储读写指令的执行全过程 4

1.1.4 内存屏障产生的原因 8

1.1.5 高速缓存的工作方式 10

1.1.6 高速缓存的映射方式 11

1.1.7 组相联的高速缓存 13

1.1.8 PIPT和VIVT的区别 14

1.1.9 页表的创建和查询过程 17

1.1.10 TLB 21

1.1.11 MESI协议 21

1.1.12 高速缓存伪共享 26

1.1.13 高速缓存在Linux内核中的应用 27

1.1.14 ARM的大/小核架构 28

1.1.15 高速缓存一致性和一致性内存模型 30

1.1.16 高速缓存的回写策略和替换策略 30

1.1.17 NUMA 31

1.1.18 ARM处理器设计 32

1.1.19 最新进展 33

1.2 ARM64架构 34

1.2.1 ARMv8-A架构 34

1.2.2 采用ARMv8架构的常见处理器内核 35

1.2.3 ARMv8架构中的基本概念 35

1.2.4 ARMv8处理器执行状态 36

1.2.5 ARMv8支持的数据宽度 36

1.2.6 不对齐访问 37

1.3 ARMv8寄存器 37

1.3.1 通用寄存器 37

1.3.2 处理器状态 38

1.3.3 特殊寄存器 39

1.3.4 系统寄存器 41

1.4 A64指令集 42

1.4.1 常用的算术和搬移指令 42

1.4.2 乘法和除法指令 43

1.4.3 移位操作指令 45

1.4.4 位操作指令 45

1.4.5 条件操作 47

1.4.6 内存加载指令 48

1.4.7 多字节内存加载和存储指令 50

1.4.8 非特权访问级别的加载和存储指令 50

1.4.9 内存屏障指令简介 51

1.4.10 独占内存访问指令 51

1.4.11 跳转与比较指令 52

1.4.12 异常处理指令 53

1.4.13 系统寄存器访问指令 54

1.5 GCC内联汇编 55

1.6 函数调用标准和栈布局 57

1.7 ARM64异常处理 59

1.7.1 异常类型 59

1.7.2 同步异常和异步异常 60

1.7.3 异常发生后的处理 60

第 2章 ARM64在Linux内核中的实现 62

2.1 ARM64内存管理 63

2.1.1 页表 63

2.1.2 页表映射 64

2.1.3 页表项描述符 65

2.1.4 Linux内核中的页表 68

2.1.5 ARM64内核内存分布 74

2.1.6 案例分析:ARM64的页表映射过程 78

2.2 高速缓存管理 84

2.3 TLB管理 87

2.4 内存属性 90

2.4.1 内存属性 91

2.4.2 高速缓存共享属性 94

2.5 内存屏障 95

2.5.1 内存屏障指令 95

2.5.2 加载-获取屏障原语与存储-释放屏障原语 96

2.6 Linux内核汇编代码分析 97

2.6.1 链接文件基础知识 97

2.6.2 vmlinux.lds.S文件分析 99

2.6.3 启动汇编代码 102

2.6.4 创建恒等映射和内核映像映射 106

2.6.5 __cpu_setup函数分析 114

2.6.6 __primary_switch函数分析 117

2.7 关于页表的常见疑问 120

2.7.1 关于下一级页表基地址 121

2.7.2 软件遍历页表 121

第3章 内存管理之预备知识 124

3.1 从硬件角度看内存管理 126

3.1.1 内存管理的“远古时代” 126

3.1.2 分段机制 127

3.1.3 分页机制 128

3.1.4 虚拟地址到物理地址的转换 128

3.2 从软件角度看内存管理 129

3.2.1 从Linux系统使用者的角度看内存管理 129

3.2.2 从Linux应用程序开发人员的角度看内存管理 130

3.2.3 从内存分布的角度看内存管理 131

3.2.4 从进程的角度看内存管理 131

3.2.5 从Linux内核的角度看内存管理 135

3.3 物理内存管理之预备知识 136

3.3.1 内存架构之UMA和NUMA 136

3.3.2 内存管理之数据结构 138

3.3.3 内存大小 140

3.3.4 物理内存映射 141

3.3.5 zone初始化 143

3.3.6 空间划分 145

3.3.7 物理内存初始化 146

第4章 物理内存与虚拟内存 152

4.1 页面分配之快速路径 153

4.1.1 分配物理页面的接口函数 154

4.1.2 分配掩码 155

4.1.3 alloc_pages()函数 158

4.1.4 get_page_from_freelist()函数 162

4.1.5 zone_watermark_fast()函数 164

4.1.6 rmqueue()函数 165

4.1.7 释放页面 167

4.1.8 小结 170

4.2 slab分配器 170

4.2.1 slab分配器产生的背景 170

4.2.2 创建slab描述符 173

4.2.3 slab分配器的内存布局 176

4.2.4 配置slab描述符 178

4.2.5 分配slab对象 180

4.2.6 释放slab缓存对象 183

4.2.7 slab分配器和伙伴系统的接口函数 185

4.2.8 管理区 185

4.2.9 kmalloc() 188

4.2.10 小结 189

4.3 vmalloc() 190

4.4 虚拟内存管理之进程地址空间 194

4.4.1 进程地址空间 194

4.4.2 mm_struct数据结构 195

4.4.3 VMA数据结构 197

4.4.4 VMA的属性 199

4.4.5 查找VMA 201

4.4.6 插入VMA 203

4.4.7 合并VMA 206

4.4.8 红黑树例子 207

4.4.9 小结 209

4.5 malloc() 210

4.5.1 brk系统调用 210

4.5.2 用户态地址空间划分 212

4.5.3 __do_sys_brk()函数 213

4.5.4 do_brk_flags()函数 213

4.5.5 _mm_populate()函数 215

4.5.6 get_user_pages()函数 216

4.5.7 小结 220

4.6 mmap 223

4.6.1 mmap概述 223

4.6.2 小结 225

4.7 缺页异常处理 227

4.7.1 ARM64缺页异常的底层处理流程 228

4.7.2 do_page_fault()函数 234

4.7.3 handle_mm_fault()函数 237

4.7.4 匿名页面缺页中断 240

4.7.5 系统零页 241

4.7.6 文件映射缺页中断 242

4.7.7 写时复制 245

4.7.8 ARM64硬件DBM机制导致的竞争问题 248

4.7.9 关于pte_offset_map()安全使用的问题 251

4.7.10 关于写时复制的竞争问题 253

4.7.11 为什么要在切换页表项之前刷新TLB 256

4.7.12 缺页异常引发的死锁 257

4.7.13 小结 257

第5章 内存管理之高级主题 259

5.1 page 260

5.2 RMAP 272

5.3 页面回收 285

5.4 匿名页面生命周期 318

5.5 页面迁移 321

5.6 内存规整 329

5.7 KSM 339

5.8 页面分配之慢速路径 362

5.9 内存碎片化管理 368

第6章 内存管理之实战案例分析 375

6.1 内存管理日志信息和调试信息 375

6.2 内存管理调优参数 400

6.3 内存管理实战案例分析 407

第7章 进程管理之基本概念 430

7.1 关于进程的基本概念 431

7.2 与进程创建和终止相关的操作系统原语 441

7.3 代码分析:进程的创建和终止 447

7.4 进程调度原语 461

第8章 进程管理之调度与负载均衡 469

8.1 CFS 470

8.2 负载计算 503

8.3 SMP负载均衡 517

8.4 绿色节能调度器 542

8.5 实时调度 574

第9章 进程管理之调试与案例分析 580

9.1 进程管理之调试 580

9.2 综合案例分析——系统调度 587

9.3 进程管理 589


《奔跑吧Linux内核(第2版)卷2:调试与案例分析》

目  录
第 1章 并发与同步 1

1.1 原子操作 3

1.1.3 比较并交换指令 7

1.2 内存屏障 11

1.3 经典自旋锁 14

1.4 MCS锁 20

1.5 排队自旋锁 27

1.6 信号量 39

1.7 互斥锁 43

1.8 读写锁 52

1.9 读写信号量 53

1.10 RCU 64

1.11 案例分析:内存管理中的锁 69

第 2章 中断管理 81

2.1 中断控制器 82

2.2 硬件中断号和Linux中断号的映射 87

2.3 注册中断 98

2.4 ARM64底层中断处理 105

2.5 高层中断处理 114

2.6 软中断和tasklet 125

2.7 工作队列 136

第3章 内核调试与性能优化 164

3.1 打造ARM64实验平台 165

3.2 ftrace 181

3.3 内存检测 196

3.4 死锁检测 204

3.5 内核调试方法 210

3.6 使用perf优化性能 217

3.7 SystemTap 222

3.8 eBPF和BCC 224

第4章 基于x86_64解决宕机难题 229

4.1 Kdump和Crash工具 230

4.2 x86_64架构基础知识 230

4.3 在CentOS 7.6中安装和配置Kdump和Crash 233

4.4 crash命令 235

4.5 案例1:一个简单的宕机案例 244

4.6 案例2:访问被删除的链表 250

4.7 案例3:一个真实的驱动崩溃案例 254

4.8 死锁检查机制 259

4.9 案例4:一个简单的死锁案例 261

4.10 案例5:分析和推导参数的值变量 263

4.11 案例6:一个复杂的宕机案例 270

第5章 基于ARM64解决宕机难题 285

5.1 搭建Kdump实验环境 285

5.2 案例1:一个简单的宕机案例 287

5.3 案例2:恢复函数调用栈 288

5.4 案例3:分析和推导参数的值 291

5.5 案例4:一个复杂的宕机案例 294

第6章 安全漏洞分析 303

6.1 侧信道攻击 303

6.2 CPU熔断漏洞分析 306

6.3 CPU“幽灵”漏洞 317

附录A 使用DS-5调试ARM64 Linux内核 325

附录B ARM64中的独占访问指令 341

附录C 图解MESI状态转换 345

附录D 高速缓存与内存屏障 350
猜您喜欢

读书导航