计算机
类型
6.7
豆瓣评分
可以朗读
语音朗读
377千字
字数
2019-01-01
发行日期
展开全部
主编推荐语
内核机制原理与趣味实验相结合
内容简介
本书讲述内存管理、进程管理、同步机制以及调试方法等。不讲内核的原理的具体实现,即不逐行分析内核代码,而是尽量从使用的角度来讲述内核的机制和原理。同时本书会更具趣味性,增加大量简单有趣的内核实验,比如ubuntu编译内核、qemu调试内核、编写内核模块等。
目录
- 封面
- 扉页
- 版权信息
- 目录
- 内容提要
- 序一
- 序二
- 前言
- 资源与支持
- 第1章 Linux系统入门
- 1.1 Linux的发展历史
- 1.2 Linux发行版
- 1.2.1 Red Hat Linux
- 1.2.2 Debian Linux
- 1.2.3 SuSE Linux
- 1.2.4 优麒麟Linux
- 1.3 Linux内核
- 1.3.1 宏内核和微内核
- 1.3.2 Linux内核概貌
- 1.4 如何学习Linux内核
- 1.5 Linux内核实验入门
- 1.5.1 实验1:在虚拟机中安装优麒麟Linux 18.04系统
- 1.5.2 实验2:给优麒麟Linux系统更换“心脏”
- 1.5.3 实验3:使用定制的内核runninglinuxkernel
- 1.5.4 实验4:如何编译和运行一个ARM Linux内核
- 第2章 Linux内核基础知识
- 2.1 Linux常用的编译工具
- 2.1.1 GCC工具
- 2.1.2 ARM GCC
- 2.1.3 GCC编译
- 2.2 Linux内核中常用的C语言技巧
- 2.3 Linux内核中常用的数据结构和算法
- 2.3.1 链表
- 2.3.2 红黑树
- 2.3.3 无锁环形缓冲区
- 2.4 Vim工具的使用
- 2.4.1 Vim 8介绍
- 2.4.2 Vim的基本模式
- 2.4.3 Vim中3种模式的切换
- 2.4.4 Vim光标的移动
- 2.4.5 删除、复制和粘贴
- 2.4.6 查找和替换
- 2.4.7 文件相关
- 2.5 git工具的使用
- 2.5.1 安装git
- 2.5.2 git基本操作
- 2.5.3 分支管理
- 2.6 实验
- 2.6.1 实验1:GCC编译
- 2.6.2 实验2:内核链表
- 2.6.3 实验3:红黑树
- 2.6.4 实验4:使用Vim工具
- 2.6.5 实验5:把Vim打造成一个强大的IDE编辑工具
- 2.6.6 实验6:建立一个git本地仓库
- 2.6.7 实验7:解决合并分支冲突
- 2.6.8 实验8:利用git来管理Linux内核开发
- 2.6.9 实验9:利用git来管理项目代码
- 第3章 内核编译和调试
- 3.1 内核配置
- 3.1.1 内核配置工具
- 3.1.2 .config文件
- 3.2 实验1:通过QEMU调试ARM Linux内核
- 3.3 实验2:通过QEMU调试ARMv8的Linux内核
- 3.4 实验3:通过Eclipse+QEMU单步调试内核
- 3.5 实验4:在QEMU中添加文件系统的支持
- 第4章 内核模块
- 4.1 从一个内核模块开始
- 4.2 模块参数
- 4.3 符号共享
- 4.4 实验
- 4.4.1 实验1:编写一个简单的内核模块
- 4.4.2 实验2:向内核模块传递参数
- 4.4.3 实验3:在模块之间导出符号
- 第5章 简单的字符设备驱动
- 5.1 实验1:从一个简单的字符设备开始
- 5.2 字符设备驱动详解
- 5.2.1 字符设备驱动的抽象
- 5.2.2 设备号的管理
- 5.2.3 设备节点
- 5.2.4 字符设备操作方法集
- 5.3 实验2:使用misc机制来创建设备
- 5.4 一个简单的虚拟设备
- 5.4.1 实验3:为虚拟设备编写驱动
- 5.4.2 实验4:使用KFIFO改进设备驱动
- 5.5 阻塞I/O和非阻塞I/O
- 5.5.1 实验5:把虚拟设备驱动改成非阻塞模式
- 5.5.2 实验6:把虚拟设备驱动改成阻塞模式
- 5.6 I/O多路复用
- 5.6.1 Linux的I/O多路复用
- 5.6.2 实验7:向虚拟设备中添加I/O多路复用支持
- 5.7 实验8:为什么不能唤醒读写进程
- 5.8 实验9:向虚拟设备中添加异步通知
- 5.9 本章小结
- 第6章 系统调用
- 6.1 系统调用概念
- 6.1.1 系统调用和POSIX标准
- 6.1.2 系统调用表
- 6.1.3 用程序访问系统调用
- 6.1.4 新增系统调用
- 6.2 实验
- 6.2.1 实验1:在ARM32机器上新增一个系统调用
- 6.2.2 实验2:在优麒麟Linux机器上新增一个系统调用
- 第7章 内存管理
- 7.1 从硬件角度看内存管理
- 7.1.1 内存管理的“远古时代”
- 7.1.2 分段机制
- 7.1.3 分页机制
- 7.1.4 虚拟地址到物理地址的转换
- 7.2 从软件角度看内存管理
- 7.2.1 free命令
- 7.2.2 从应用编程角度看内存管理
- 7.2.3 从内存布局图角度看内存管理
- 7.2.4 从进程角度看内存管理
- 7.3 物理内存管理
- 7.3.1 物理页面
- 7.3.2 内存管理区
- 7.3.3 分配和释放页面
- 7.3.4 分配小块内存
- 7.4 虚拟内存管理
- 7.4.1 进程地址空间
- 7.4.2 内存描述符mm_struct
- 7.4.3 VMA管理
- 7.4.4 malloc分配函数
- 7.4.5 mmap
- 7.5 缺页异常
- 7.5.1 do_page_fault函数
- 7.5.2 匿名页面缺页异常
- 7.5.3 文件映射缺页中断
- 7.5.4 写时复制缺页异常
- 7.5.5 缺页异常小结
- 7.6 内存短缺
- 7.6.1 页面回收算法
- 7.6.2 OOM Killer机制
- 7.7 内存管理实验
- 7.7.1 实验1:查看系统内存信息
- 7.7.2 实验2:获取系统的物理内存信息
- 7.7.3 实验3:分配内存
- 7.7.4 实验4:slab
- 7.7.5 实验5:VMA
- 7.7.6 实验6:mmap
- 7.7.7 实验7:映射用户内存
- 7.7.8 实验8:OOM
- 第8章 进程管理
- 8.1 进程
- 8.1.1 进程的来由
- 8.1.2 进程描述符
- 8.1.3 进程的生命周期
- 8.1.4 进程标识
- 8.1.5 进程间的家族关系
- 8.1.6 获取当前进程
- 8.2 进程的创建和终止
- 8.2.1 写时复制技术
- 8.2.2 fork()函数
- 8.2.3 vfork()函数
- 8.2.4 clone()函数
- 8.2.5 内核线程
- 8.2.6 do_fork()函数
- 8.2.7 终止进程
- 8.2.8 僵尸进程和托孤进程
- 8.2.9 进程0和进程1
- 8.3 进程调度
- 8.3.1 进程分类
- 8.3.2 进程优先级
- 8.3.3 时间片
- 8.3.4 经典调度算法
- 8.3.5 Linux O(n)调度算法
- 8.3.6 Linux O(1)调度算法
- 8.3.7 Linux CFS调度算法
- 8.3.8 进程切换
- 8.3.9 与调度相关的数据结构
- 8.4 多核调度
- 8.4.1 调度域和调度组
- 8.4.2 负载计算
- 8.4.3 负载均衡算法
- 8.5 实验
- 8.5.1 实验1:fork和clone
- 8.5.2 实验2:内核线程
- 8.5.3 实验3:后台守护进程
- 8.5.4 实验4:进程权限
- 8.5.5 实验5:设置优先级
- 8.5.6 实验6:per-cpu变量
- 第9章 同步管理
- 9.1 原子操作与内存屏障
- 9.1.1 原子操作
- 9.1.2 内存屏障
- 9.2 自旋锁机制
- 9.2.1 自旋锁定义
- 9.2.2 自旋锁变种
- 9.2.3 自旋锁和raw_spin_lock
- 9.2.4 自旋锁的改进
- 9.3 信号量
- 9.4 互斥体
- 9.5 读写锁
- 9.5.1 读写锁定义
- 9.5.2 读写信号量
- 9.6 RCU
- 9.7 等待队列
- 9.7.1 等待队列头
- 9.7.2 等待队列节点
- 9.8 实验
- 9.8.1 实验1:自旋锁
- 9.8.2 实验2:互斥锁
- 9.8.3 实验3:RCU
- 第10章 中断管理
- 10.1 Linux中断管理机制
- 10.1.1 ARM中断控制器
- 10.1.2 硬件中断号和Linux中断号的映射
- 10.1.3 注册中断
- 10.2 软中断和tasklet
- 10.2.1 SoftIRQ软中断
- 10.2.2 tasklet
- 10.2.3 local_bh_disable/local_bh_enable
- 10.2.4 本节小结
- 10.3 工作队列机制
- 10.3.1 工作队列类型
- 10.3.2 使用工作队列
- 10.3.3 本节小结
- 10.4 实验
- 10.4.1 实验1:tasklet
- 10.4.2 实验2:工作队列
- 10.4.3 实验3:定时器和内核线程
- 第11章 调试和性能优化
- 11.1 printk和动态输出
- 11.1.1 printk输出函数
- 11.1.2 动态输出
- 11.1.3 实验1:printk
- 11.1.4 实验2:动态输出
- 11.2 proc和debugfs
- 11.2.1 proc文件系统
- 11.2.2 sys文件系统
- 11.2.3 debugfs
- 11.2.4 实验3:procfs
- 11.2.5 实验4:sysfs
- 11.2.6 实验5:debugfs
- 11.3 ftrace
- 11.3.1 irqs跟踪器
- 11.3.2 preemptoff跟踪器
- 11.3.3 preemptirqsoff跟踪器
- 11.3.4 function跟踪器
- 11.3.5 动态ftrace
- 11.3.6 事件跟踪
- 11.3.7 实验6:使用frace
- 11.3.8 实验7:添加一个新的跟踪点
- 11.3.9 实验8:使用示踪标志
- 11.3.10 实验9:使用kernelshark来分析数据
- 11.4 实验10:分析oops错误
- 11.5 perf性能分析工具
- 11.5.1 实验11:使用perf工具来进行性能分析
- 11.5.2 实验12:采集perf数据生成火焰图
- 11.6 内存检测
- 11.6.1 实验13:使用slub_debug检查内存泄漏
- 11.6.2 实验14:使用kmemleak检查内存泄漏
- 11.6.3 实验15:使用kasan检查内存泄漏
- 11.6.4 实验16:使用valgrind检查内存泄漏
- 11.7 实验17:kdump
- 11.8 性能和测试
- 11.8.1 性能测试概述
- 11.8.2 实验18:使用lkp-tests工具进行性能测试
- 第12章 开源社区
- 12.1 什么是开源社区
- 12.1.1 开源软件的发展历史
- 12.1.2 Linux基金会
- 12.1.3 开源协议
- 12.1.4 Linux内核社区
- 12.1.5 国内开源社区
- 12.2 参与开源社区
- 12.2.1 参与开源项目的好处
- 12.2.2 如何参与开源项目
- 12.3 实验1:使用cppcheck检查代码
- 12.4 实验2:提交第一个Linux内核补丁
- 12.5 实验3:管理和提交多个补丁组成的补丁集
- 12.6 实验4:在Gitee中创建一个开源项目
- 参考文献
展开全部
出版方
人民邮电出版社
人民邮电出版社是工业和信息化部主管的大型专业出版社,成立于1953年10月1日。人民邮电出版社坚持“立足信息产业、面向现代社会、传播科学知识、服务科教兴国”,致力于通信、计算机、电子技术、教材、少儿、经管、摄影、集邮、旅游、心理学等领域的专业图书出版。