万本电子书0元读

万本电子书0元读

顶部广告

奔跑吧Linux内核(第2版)卷1:基础架构电子书

基于Linux 5.0内核和ARM64/x86_64架构,全面修订,分析和总结大量项目经验。 基于GCC的“O0”选项编译的Linux5.0实验平台,通过大量实战案例、高频面试题,剖析Linux内核的源代码 基于Linux 5.0内核的源代码行案例分析。 新增了ARM64架构等方面的内容。 涵盖实战案例,可操作性强。 相对于Linux 4.0内核,Linux 5.0内核中增加了很多新特性,并且内核的实现已经发生了很大变化。本书旨在介绍Linux内核中核心模块的实现,主要内容包括ARM64架构,ARM64在Linux内核中的实现,内存管理的理论知识和案例,以及程管理的基础知识与案例等。本书适合Linux系统发人员、嵌式系统发人员及Android发人员阅读。

售       价:¥

纸质售价:¥127.90购买纸书

99人正在读 | 0人评论 6.6

作       者:笨叔 著

出  版  社:人民邮电出版社有限公司

出版时间:2021-01-01

字       数:67.2万

所属分类: 科技 > 计算机/网络 > 软件系统

温馨提示:数字商品不支持退换货,不提供源文件,不支持导出打印

为你推荐

  • 读书简介
  • 目录
  • 累计评论(0条)
  • 读书简介
  • 目录
  • 累计评论(0条)
本书基于Linux 5.0内核的源代码讲述Linux内核中核心模块的实现。本书共9章,主要内容包括处理器架构、ARM64在Linux内核中的实现、内存管理之预备知识、物理内存与虚拟内存、内存管理之高级主题、内存管理之实战案例、程管理之基本概念、程管理之调度和负载均衡、程管理之调试与案例分析。 本书适合Linux系统发人员、嵌式系统发人员及Android发人员阅读,也可供计算机相关专业的师生阅读。<br/>【推荐语】<br/>基于Linux 5.0内核和ARM64/x86_64架构,全面修订,分析和总结大量项目经验。 基于GCC的“O0”选项编译的Linux5.0实验平台,通过大量实战案例、高频面试题,剖析Linux内核的源代码 基于Linux 5.0内核的源代码行案例分析。 新增了ARM64架构等方面的内容。 涵盖实战案例,可操作性强。 相对于Linux 4.0内核,Linux 5.0内核中增加了很多新特性,并且内核的实现已经发生了很大变化。本书旨在介绍Linux内核中核心模块的实现,主要内容包括ARM64架构,ARM64在Linux内核中的实现,内存管理的理论知识和案例,以及程管理的基础知识与案例等。本书适合Linux系统发人员、嵌式系统发人员及Android发人员阅读。<br/>【作者】<br/>笨叔,Linux内核爱好者,出版过《奔跑吧Linux内核》《奔跑吧 Linux内核 门篇》。创建了奔跑吧Linux社区,为广大Linux爱好者布道。<br/>
目录展开

版权

内容提要

模拟面试题

前 言

致 谢

如何阅读本书

服务与支持

第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 案例分析——为何不能调度

累计评论(0条) 0个书友正在讨论这本书 发表评论

发表评论

发表评论,分享你的想法吧!

买过这本书的人还买过

读了这本书的人还在读

回顶部