计算机
类型
8.0
豆瓣评分
可以朗读
语音朗读
623千字
字数
2021-01-01
发行日期
展开全部
主编推荐语
本书基于Linux5.0内核的源代码讲述Linux内核中核心模块的实现。
内容简介
本书共9章,主要内容包括处理器架构、ARM64在Linux内核中的实现、内存管理之预备知识、物理内存与虚拟内存、内存管理之高级主题、内存管理之实战案例、进程管理之基本概念、进程管理之调度和负载均衡、进程管理之调试与案例分析。
本书适合Linux系统开发人员、嵌入式系统开发人员及Android开发人员阅读,也可供计算机相关专业的师生阅读。
目录
- 版权信息
- 内容提要
- 模拟面试题
- 前言
- 致谢
- 如何阅读本书
- 服务与支持
- 第1章 处理器架构
- 1.1 处理器架构介绍
- 1.1.1 精简指令集和复杂指令集
- 1.1.2 大/小端字节序
- 1.1.3 一条存储读写指令的执行全过程
- 1.1.4 内存屏障产生的原因
- 1.1.5 高速缓存的工作方式
- 1.1.6 高速缓存的映射方式
- 1.1.7 组相联的高速缓存
- 1.1.8 PIPT和VIVT的区别
- 1.1.9 页表的创建和查询过程
- 1.1.10 TLB
- 1.1.11 MESI协议
- 1.1.12 高速缓存伪共享
- 1.1.13 高速缓存在Linux内核中的应用
- 1.1.14 ARM的大/小核架构
- 1.1.15 高速缓存一致性和一致性内存模型
- 1.1.16 高速缓存的回写策略和替换策略
- 1.1.17 NUMA
- 1.1.18 ARM处理器设计
- 1.1.19 最新进展
- 1.2 ARM64架构
- 1.2.1 ARMv8-A架构
- 1.2.2 采用ARMv8架构的常见处理器内核
- 1.2.3 ARMv8架构中的基本概念
- 1.2.4 ARMv8处理器执行状态
- 1.2.5 ARMv8支持的数据宽度
- 1.2.6 不对齐访问
- 1.3 ARMv8寄存器
- 1.3.1 通用寄存器
- 1.3.2 处理器状态
- 1.3.3 特殊寄存器
- 1.3.4 系统寄存器
- 1.4 A64指令集
- 1.4.1 常用的算术和搬移指令
- 1.4.2 乘法和除法指令
- 1.4.3 移位操作指令
- 1.4.4 位操作指令
- 1.4.5 条件操作
- 1.4.6 内存加载指令
- 1.4.7 多字节内存加载和存储指令
- 1.4.8 非特权访问级别的加载和存储指令
- 1.4.9 内存屏障指令简介
- 1.4.10 独占内存访问指令
- 1.4.11 跳转与比较指令
- 1.4.12 异常处理指令
- 1.4.13 系统寄存器访问指令
- 1.5 GCC内联汇编
- 1.6 函数调用标准和栈布局
- 1.7 ARM64异常处理
- 1.7.1 异常类型
- 1.7.2 同步异常和异步异常
- 1.7.3 异常发生后的处理
- 第2章 ARM64在Linux内核中的实现
- 2.1 ARM64内存管理
- 2.1.1 页表
- 2.1.2 页表映射
- 2.1.3 页表项描述符
- 2.1.4 Linux内核中的页表
- 2.1.5 ARM64内核内存分布
- 2.1.6 案例分析:ARM64的页表映射过程
- 2.2 高速缓存管理
- 2.3 TLB管理
- 2.4 内存属性
- 2.4.1 内存属性
- 2.4.2 高速缓存共享属性
- 2.5 内存屏障
- 2.5.1 内存屏障指令
- 2.5.2 加载-获取屏障原语与存储-释放屏障原语
- 2.6 Linux内核汇编代码分析
- 2.6.1 链接文件基础知识
- 2.6.2 vmlinux.lds.S文件分析
- 2.6.3 启动汇编代码
- 2.6.4 创建恒等映射和内核映像映射
- 2.6.5 __cpu_setup函数分析
- 2.6.6 __primary_switch函数分析
- 2.7 关于页表的常见疑问
- 2.7.1 关于下一级页表基地址
- 2.7.2 软件遍历页表
- 第3章 内存管理之预备知识
- 3.1 从硬件角度看内存管理
- 3.1.1 内存管理的“远古时代”
- 3.1.2 分段机制
- 3.1.3 分页机制
- 3.1.4 虚拟地址到物理地址的转换
- 3.2 从软件角度看内存管理
- 3.2.1 从Linux系统使用者的角度看内存管理
- 3.2.2 从Linux应用程序开发人员的角度看内存管理
- 3.2.3 从内存分布的角度看内存管理
- 3.2.4 从进程的角度看内存管理
- 3.2.5 从Linux内核的角度看内存管理
- 3.3 物理内存管理之预备知识
- 3.3.1 内存架构之UMA和NUMA
- 3.3.2 内存管理之数据结构
- 3.3.3 内存大小
- 3.3.4 物理内存映射
- 3.3.5 zone初始化
- 3.3.6 空间划分
- 3.3.7 物理内存初始化
- 第4章 物理内存与虚拟内存
- 4.1 页面分配之快速路径
- 4.1.1 分配物理页面的接口函数
- 4.1.2 分配掩码
- 4.1.3 alloc_pages()函数
- 4.1.4 get_page_from_freelist()函数
- 4.1.5 zone_watermark_fast()函数
- 4.1.6 rmqueue()函数
- 4.1.7 释放页面
- 4.1.8 小结
- 4.2 slab分配器
- 4.2.1 slab分配器产生的背景
- 4.2.2 创建slab描述符
- 4.2.3 slab分配器的内存布局
- 4.2.4 配置slab描述符
- 4.2.5 分配slab对象
- 4.2.6 释放slab缓存对象
- 4.2.7 slab分配器和伙伴系统的接口函数
- 4.2.8 管理区
- 4.2.9 kmalloc()
- 4.2.10 小结
- 4.3 vmalloc()
- 4.4 虚拟内存管理之进程地址空间
- 4.4.1 进程地址空间
- 4.4.2 mm_struct数据结构
- 4.4.3 VMA数据结构
- 4.4.4 VMA的属性
- 4.4.5 查找VMA
- 4.4.6 插入VMA
- 4.4.7 合并VMA
- 4.4.8 红黑树例子
- 4.4.9 小结
- 4.5 malloc()
- 4.5.1 brk系统调用
- 4.5.2 用户态地址空间划分
- 4.5.3 __do_sys_brk()函数
- 4.5.4 do_brk_flags()函数
- 4.5.5 _mm_populate()函数
- 4.5.6 get_user_pages()函数
- 4.5.7 小结
- 4.6 mmap
- 4.6.1 mmap概述
- 4.6.2 小结
- 4.7 缺页异常处理
- 4.7.1 ARM64缺页异常的底层处理流程
- 4.7.2 do_page_fault()函数
- 4.7.3 handle_mm_fault()函数
- 4.7.4 匿名页面缺页中断
- 4.7.5 系统零页
- 4.7.6 文件映射缺页中断
- 4.7.7 写时复制
- 4.7.8 ARM64硬件DBM机制导致的竞争问题
- 4.7.9 关于pte_offset_map()安全使用的问题
- 4.7.10 关于写时复制的竞争问题
- 4.7.11 为什么要在切换页表项之前刷新TLB
- 4.7.12 缺页异常引发的死锁
- 4.7.13 小结
- 第5章 内存管理之高级主题
- 5.1 page
- 5.1.1 page数据结构
- 5.1.2 _refcount的应用
- 5.1.3 _mapcount的应用
- 5.1.4 PG_Locked
- 5.1.5 mapping成员的妙用
- 5.1.6 和page相关的几个接口函数
- 5.1.7 小结
- 5.2 RMAP
- 5.2.1 RMAP的主要数据结构
- 5.2.2 父进程产生匿名页面
- 5.2.3 根据父进程创建子进程
- 5.2.4 子进程发生写时复制
- 5.2.5 RMAP的应用
- 5.2.6 小结
- 5.3 页面回收
- 5.3.1 LRU链表
- 5.3.2 第二次机会法
- 5.3.3 触发页面回收
- 5.3.4 kswapd内核线程
- 5.3.5 balance_pgdat()函数
- 5.3.6 shrink_node()函数
- 5.3.7 shrink_active_list()函数
- 5.3.8 shrink_inactive_list()函数
- 5.3.9 跟踪LRU活动情况
- 5.3.10 页面回收机制
- 5.3.11 Refault Distance算法
- 5.3.12 小结
- 5.4 匿名页面生命周期
- 5.4.1 匿名页面的产生
- 5.4.2 匿名页面的使用
- 5.4.3 匿名页面的换出
- 5.4.4 匿名页面的换入
- 5.4.5 匿名页面的销毁
- 5.5 页面迁移
- 5.5.1 哪些页面可以迁移
- 5.5.2 页面迁移主函数
- 5.5.3 move_to_new_page()函数
- 5.5.4 迁移页表
- 5.5.5 迁移非LRU页面
- 5.5.6 小结
- 5.6 内存规整
- 5.6.1 内存规整的基本原理
- 5.6.2 触发内存规整
- 5.6.3 直接内存规整
- 5.6.4 compact_zone()函数
- 5.6.5 哪些页面适合做内存规整
- 5.7 KSM
- 5.7.1 使能KSM
- 5.7.2 KSM基本实现
- 5.7.3 KSM数据结构
- 5.7.4 新版本KSM的新特性
- 5.7.5 malloc()分配的页面可以被KSM扫描吗
- 5.7.6 合并页面
- 5.7.7 一个有趣的计算公式
- 5.7.8 page->index的值
- 5.7.9 小结
- 5.8 页面分配之慢速路径
- 5.8.1 alloc_pages_slowpath()函数
- 5.8.2 水位管理和分配优先级
- 5.9 内存碎片化管理
- 5.9.1 伙伴系统算法如何减少内存碎片
- 5.9.2 页面迁移类型和内存规整
- 5.9.3 Linux 5.0内核新增的反碎片优化
- 第6章 内存管理之实战案例分析
- 6.1 内存管理日志信息和调试信息
- 6.1.1 vm_stat计数值
- 6.1.2 meminfo分析
- 6.1.3 伙伴系统信息
- 6.1.4 查看内存管理区的信息
- 6.1.5 查看与进程相关的内存信息
- 6.1.6 为什么S_swap与P_swap不相等
- 6.1.7 解读OOM Killer机制输出的日志信息
- 6.1.8 解读缺页异常后输出的宕机日志信息
- 6.2 内存管理调优参数
- 6.2.1 影响内存管理区水位的调优参数min_free_kbytes
- 6.2.2 影响页面分配的参数lowmem_reserve_ratio
- 6.2.3 影响页面回收的参数
- 6.2.4 影响脏页回写的参数
- 6.3 内存管理实战案例分析
- 6.3.1 案例一:缺页异常和文件系统引发的宕机
- 6.3.2 案例二:KSM和NUMA引发的虚拟机宕机
- 6.3.3 案例三:为什么无法分配一个页面
- 6.3.4 案例四:秘密任务——动态修改系统调用表引发的4次宕机
- 第7章 进程管理之基本概念
- 7.1 关于进程的基本概念
- 7.1.1 进程的来由
- 7.1.2 进程描述符
- 7.1.3 进程的生命周期
- 7.1.4 进程标识
- 7.1.5 进程间的家族关系
- 7.1.6 获取当前进程
- 7.1.7 进程0和进程1
- 7.2 与进程创建和终止相关的操作系统原语
- 7.2.1 写时复制技术
- 7.2.2 fork()函数
- 7.2.3 vfork()函数
- 7.2.4 clone()函数
- 7.2.5 内核线程
- 7.2.6 终止进程
- 7.2.7 僵尸进程和进程托孤
- 7.3 代码分析:进程的创建和终止
- 7.3.1 _do_fork()函数分析
- 7.3.2 copy_process()函数分析
- 7.3.3 dup_task_struct()函数分析
- 7.3.4 sched_fork()函数分析
- 7.3.5 copy_mm()函数分析
- 7.3.6 进程创建后的返回
- 7.4 进程调度原语
- 7.4.1 进程分类
- 7.4.2 进程优先级和权重
- 7.4.3 调度策略
- 7.4.4 时间片
- 7.4.5 经典调度算法
- 7.4.6 Linux内核的O (n)调度算法
- 7.4.7 Linux内核的O (1)调度算法
- 7.4.8 Linux内核的CFS
- 第8章 进程管理之调度与负载均衡
- 8.1 CFS
- 8.1.1 vruntime的计算
- 8.1.2 调度器的数据结构
- 8.1.3 对进程创建代码的分析
- 8.1.4 对进程加入调度器的代码的分析
- 8.1.5 进程调度
- 8.1.6 进程切换
- 8.1.7 调度节拍
- 8.1.8 组调度机制
- 8.1.9 小结
- 8.2 负载计算
- 8.2.1 如何衡量一个CPU的负载
- 8.2.2 工作负载和量化负载
- 8.2.3 历史累计衰减的计算
- 8.2.4 量化负载的计算
- 8.2.5 实际算力的计算
- 8.2.6 sched_avg数据结构
- 8.2.7 PELT代码分析
- 8.2.8 PELT接口函数
- 8.3 SMP负载均衡
- 8.3.1 CPU管理位图
- 8.3.2 CPU调度域
- 8.3.3 建立CPU调度域拓扑关系
- 8.3.4 负载均衡
- 8.3.5 唤醒进程
- 8.3.6 wake affine特性
- 8.3.7 调试
- 8.3.8 小结
- 8.4 绿色节能调度器
- 8.4.1 量化计算能力
- 8.4.2 能效模型
- 8.4.3 OPP子系统
- 8.4.4 初始化CPUfreq-dt驱动程序
- 8.4.5 注册能效模型子系统
- 8.4.6 该选择哪个CPU来执行唤醒进程p呢
- 8.4.7 overutilized条件判断
- 8.4.8 CPU动态调频
- 8.4.9 小结
- 8.5 实时调度
- 8.5.1 实时延时分析
- 8.5.2 Linux内核实时性改进
- 第9章 进程管理之调试与案例分析
- 9.1 进程管理之调试
- 9.1.1 查看与进程相关的调度信息
- 9.1.2 查看CFS的信息
- 9.1.3 查看调度域信息
- 9.1.4 与调度相关的调试节点
- 9.2 综合案例分析
- 9.3 进程管理
- 9.3.1 进程的本质
- 9.3.2 逃离不掉的进程优先级
- 9.3.3 调度器的选择
- 9.3.4 用四维空间来理解负载
- 9.3.5 案例分析——为何不能调度
展开全部
出版方
人民邮电出版社
人民邮电出版社是工业和信息化部主管的大型专业出版社,成立于1953年10月1日。人民邮电出版社坚持“立足信息产业、面向现代社会、传播科学知识、服务科教兴国”,致力于通信、计算机、电子技术、教材、少儿、经管、摄影、集邮、旅游、心理学等领域的专业图书出版。