展开全部

主编推荐语

内核机制原理与趣味实验相结合

内容简介

本书讲述内存管理、进程管理、同步机制以及调试方法等。不讲内核的原理的具体实现,即不逐行分析内核代码,而是尽量从使用的角度来讲述内核的机制和原理。同时本书会更具趣味性,增加大量简单有趣的内核实验,比如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日。人民邮电出版社坚持“立足信息产业、面向现代社会、传播科学知识、服务科教兴国”,致力于通信、计算机、电子技术、教材、少儿、经管、摄影、集邮、旅游、心理学等领域的专业图书出版。