展开全部

主编推荐语

本书基于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 案例分析——为何不能调度
展开全部

评分及书评

评分不足
1个评分
  • 用户头像
    给这本书评了
    5.0

    本书基于 Linux 5.0 内核的源代码讲述 Linux 内核中核心模块的实现。本书共 9 章,主要内容包括处理器架构、ARM64 在 Linux 内核中的实现、内存管理之预备知识、物理内存与虚拟内存、内存管理之高级主题、内存管理之实战案例、进程管理之基本概念、进程管理之调度和负载均衡、进程管理之调试与案例分析。

      转发
      评论

    出版方

    人民邮电出版社

    人民邮电出版社是工业和信息化部主管的大型专业出版社,成立于1953年10月1日。人民邮电出版社坚持“立足信息产业、面向现代社会、传播科学知识、服务科教兴国”,致力于通信、计算机、电子技术、教材、少儿、经管、摄影、集邮、旅游、心理学等领域的专业图书出版。