展开全部

主编推荐语

众所周知,Linux操作系统的源代码复杂、文档少,对程序员的要求高,要想看懂这些代码并不是一件容易事。本书结合内核版本2.6.24源代码中最关键的部分,深入讨论Linux内核的概念、结构和实现。

内容简介

本书适合Linux系统编程人员、系统管理者以及Linux爱好者学习使用。本书讨论了Linux内核的概念、结构和实现。主要内容包括多任务、调度和进程管理,物理内存的管理以及内核与相关硬件的交互,用户空间的进程如何访问虚拟内存,如何编写设备驱动程序,模块机制以及虚拟文件系统,Ext文件系统属性和访问控制表的实现方式,内核中网络的实现,系统调用的实现方式,内核对时间相关功能的处理,页面回收和页交换的相关机制以及审计的实现等。此外,本书借助内核源代码中关键部分进行讲解,帮助读者掌握重要的知识点,从而在运用中充分展现Linux系统的魅力。

目录

  • 版权信息
  • 版权声明
  • 致谢
  • 引言
  • 第1章 简介和概述
  • 1.1 内核的任务
  • 1.2 实现策略
  • 1.3 内核的组成部分
  • 1.3.1 进程、进程切换、调度
  • 1.3.2 UNIX进程
  • 1.3.3 地址空间与特权级别
  • 1.3.4 页表
  • 1.3.5 物理内存的分配
  • 1.3.6 计时
  • 1.3.7 系统调用
  • 1.3.8 设备驱动程序、块设备和字符设备
  • 1.3.9 网络
  • 1.3.10 文件系统
  • 1.3.11 模块和热插拔
  • 1.3.12 缓存
  • 1.3.13 链表处理
  • 1.3.14 对象管理和引用计数
  • 1.3.15 数据类型
  • 1.3.16 本书的局限性
  • 1.4 为什么内核是特别的
  • 1.5 行文注记
  • 1.6 小结
  • 第2章 进程管理和调度
  • 2.1 进程优先级
  • 2.2 进程生命周期
  • 抢占式多任务处理
  • 2.3 进程表示
  • 2.3.1 进程类型
  • 2.3.2 命名空间
  • 2.3.3 进程ID号
  • 2.3.4 进程关系
  • 2.4 进程管理相关的系统调用
  • 2.4.1 进程复制
  • 2.4.2 内核线程
  • 2.4.3 启动新程序
  • 2.4.4 退出进程
  • 2.5 调度器的实现
  • 2.5.1 概观
  • 2.5.2 数据结构
  • 2.5.3 处理优先级
  • 2.5.4 核心调度器
  • 2.6 完全公平调度类
  • 2.6.1 数据结构
  • 2.6.2 CFS操作
  • 2.6.3 队列操作
  • 2.6.4 选择下一个进程
  • 2.6.5 处理周期性调度器
  • 2.6.6 唤醒抢占
  • 2.6.7 处理新进程
  • 2.7 实时调度类
  • 2.7.1 性质
  • 2.7.2 数据结构
  • 2.7.3 调度器操作
  • 2.8 调度器增强
  • 2.8.1 SMP调度
  • 2.8.2 调度域和控制组
  • 2.8.3 内核抢占和低延迟相关工作
  • 2.9 小结
  • 第3章 内存管理
  • 3.1 概述
  • 3.2 (N)UMA模型中的内存组织
  • 3.2.1 概述
  • 3.2.2 数据结构
  • 3.3 页表
  • 3.3.1 数据结构
  • 3.3.2 页表项的创建和操作
  • 3.4 初始化内存管理
  • 3.4.1 建立数据结构
  • 3.4.2 特定于体系结构的设置
  • 3.4.3 启动过程期间的内存管理
  • 3.5 物理内存的管理
  • 3.5.1 伙伴系统的结构
  • 3.5.2 避免碎片
  • 3.5.3 初始化内存域和结点数据结构
  • 3.5.4 分配器API
  • 3.5.5 分配页
  • 3.5.6 释放页
  • 3.5.7 内核中不连续页的分配
  • 3.5.8 内核映射
  • 3.6 slab分配器
  • 3.6.1 备选分配器
  • 3.6.2 内核中的内存管理
  • 3.6.3 slab分配的原理
  • 3.6.4 实现
  • 3.6.5 通用缓存
  • 3.7 处理器高速缓存和TLB控制
  • 3.8 小结
  • 第4章 进程虚拟内存
  • 4.1 简介
  • 4.2 进程虚拟地址空间
  • 4.2.1 进程地址空间的布局
  • 4.2.2 建立布局
  • 4.3 内存映射的原理
  • 4.4 数据结构
  • 4.4.1 树和链表
  • 4.4.2 虚拟内存区域的表示
  • 4.4.3 优先查找树
  • 4.5 对区域的操作
  • 4.5.1 将虚拟地址关联到区域
  • 4.5.2 区域合并
  • 4.5.3 插入区域
  • 4.5.4 创建区域
  • 4.6 地址空间
  • 4.7 内存映射
  • 4.7.1 创建映射
  • 4.7.2 删除映射
  • 4.7.3 非线性映射
  • 4.8 反向映射
  • 4.8.1 数据结构
  • 4.8.2 建立逆向映射
  • 4.8.3 使用逆向映射
  • 4.9 堆的管理
  • 4.10 缺页异常的处理
  • 4.11 用户空间缺页异常的校正
  • 4.11.1 按需分配/调页
  • 4.11.2 匿名页
  • 4.11.3 写时复制
  • 4.11.4 获取非线性映射
  • 4.12 内核缺页异常
  • 4.13 在内核和用户空间之间复制数据
  • 4.14 小结
  • 第5章 锁与进程间通信
  • 5.1 控制机制
  • 5.1.1 竞态条件
  • 5.1.2 临界区
  • 5.2 内核锁机制
  • 5.2.1 对整数的原子操作
  • 5.2.3 信号量
  • 5.2.4 RCU机制
  • 5.2.5 内存和优化屏障
  • 5.2.6 读者/写者锁
  • 5.2.7 大内核锁
  • 5.2.8 互斥量
  • 5.2.9 近似的per-CPU计数器
  • 5.2.10 锁竞争与细粒度锁
  • 5.3 System V进程间通信
  • 5.3.1 System V机制
  • 5.3.2 信号量
  • 5.3.3 消息队列
  • 5.3.4 共享内存
  • 5.4 其他IPC机制
  • 5.4.1 信号
  • 5.4.2 管道和套接字
  • 5.5 小结
  • 第6章 设备驱动程序
  • 6.1 I/O体系结构
  • 扩展硬件
  • 6.2 访问设备
  • 6.2.1 设备文件
  • 6.2.2 字符设备、块设备和其他设备
  • 6.2.3 使用ioctl进行设备寻址
  • 6.2.4 主从设备号的表示
  • 6.2.5 注册
  • 6.3 与文件系统关联
  • 6.3.1 inode中的设备文件成员
  • 6.3.2 标准文件操作
  • 6.3.3 用于字符设备的标准操作
  • 6.3.4 用于块设备的标准操作
  • 6.4 字符设备操作
  • 6.4.1 表示字符设备
  • 6.4.2 打开设备文件
  • 6.4.3 读写操作
  • 6.5 块设备操作
  • 6.5.1 块设备的表示
  • 6.5.2 数据结构
  • 6.5.3 向系统添加磁盘和分区
  • 6.5.4 打开块设备文件
  • 6.5.5 请求结构
  • 6.5.6 BIO
  • 6.5.7 提交请求
  • 6.5.8 I/O调度
  • 6.5.9 ioctl的实现
  • 6.6 资源分配
  • 6.6.1 资源管理
  • 6.6.2 I/O内存
  • 6.6.3 I/O端口
  • 6.7 总线系统
  • 6.7.1 通用驱动程序模型
  • 6.7.2 PCI总线
  • 6.7.3 USB
  • 6.8 小结
  • 第7章 模块
  • 7.1 概述
  • 7.2 使用模块
  • 7.2.1 添加和移除
  • 7.2.2 依赖关系
  • 7.2.3 查询模块信息
  • 7.2.4 自动加载
  • 7.3 插入和删除模块
  • 7.3.1 模块的表示
  • 7.3.2 依赖关系和引用
  • 7.3.3 模块的二进制结构
  • 7.3.4 插入模块
  • 7.3.5 移除模块
  • 7.4 自动化与热插拔
  • 7.4.1 kmod实现的自动加载
  • 7.4.2 热插拔
  • 7.5 版本控制
  • 7.5.1 校验和方法
  • 7.5.2 版本控制函数
  • 7.6 小结
  • 第8章 虚拟文件系统
  • 8.1 文件系统类型
  • 8.2 通用文件模型
  • 8.2.1 inode
  • 8.2.2 链接
  • 8.2.3 编程接口
  • 8.2.4 将文件作为通用接口
  • 8.3 VFS的结构
  • 8.3.1 结构概观
  • 8.3.2 inode
  • 8.3.3 特定于进程的信息
  • 8.3.4 文件操作
  • 8.3.5 目录项缓存
  • 8.4 处理VFS对象
  • 8.4.1 文件系统操作
  • 8.4.2 文件操作
  • 8.5 标准函数
  • 8.5.1 通用读取例程
  • 8.5.2 失效机制
  • 8.5.3 权限检查
  • 8.6 小结
  • 第9章 Ext文件系统族
  • 9.1 简介
  • 9.2 Ext2文件系统
  • 9.2.1 物理结构
  • 9.2.2 数据结构
  • 9.2.3 创建文件系统
  • 9.2.4 文件系统操作
  • 9.3 Ext3文件系统
  • 9.3.1 概念
  • 9.3.2 数据结构
  • 9.4 小结
  • 第10章 无持久存储的文件系统
  • 10.1 proc文件系统
  • 10.1.1 /proc的内容
  • 10.1.2 数据结构
  • 10.1.3 初始化
  • 10.1.4 装载proc文件系统
  • 10.1.5 管理/proc数据项
  • 10.1.6 读取和写入信息
  • 10.1.7 进程相关的信息
  • 10.1.8 系统控制机制
  • 10.2 简单的文件系统
  • 10.2.1 顺序文件
  • 10.2.2 用libfs编写文件系统
  • 10.2.3 调试文件系统
  • 10.2.4 伪文件系统
  • 10.3 sysfs
  • 10.3.1 概述
  • 10.3.2 数据结构
  • 10.3.3 装载文件系统
  • 10.3.4 文件和目录操作
  • 10.3.5 向sysfs添加内容
  • 10.4 小结
  • 第11章 扩展属性和访问控制表
  • 11.1 扩展属性
  • 11.1.1 到虚拟文件系统的接口
  • 11.1.2 Ext3中的实现
  • 11.1.3 Ext2中的实现
  • 11.2 访问控制表
  • 11.2.1 通用实现
  • 11.2.2 Ext3中的实现
  • 11.2.3 Ext2中的实现
  • 11.3 小结
  • 第12章 网络
  • 12.1 互联的计算机
  • 12.2 ISO/OSI和TCP/IP参考模型
  • 12.3 通过套接字通信
  • 12.3.1 创建套接字
  • 12.3.2 使用套接字
  • 12.3.3 数据报套接字
  • 12.4 网络实现的分层模型
  • 12.5 网络命名空间
  • 12.6 套接字缓冲区
  • 12.6.1 使用套接字缓冲区管理数据
  • 12.6.2 管理套接字缓冲区数据
  • 12.7 网络访问层
  • 12.7.1 网络设备的表示
  • 12.7.2 接收分组
  • 12.7.3 发送分组
  • 12.8 网络层
  • 12.8.1 IPv4
  • 12.8.2 接收分组
  • 12.8.3 交付到本地传输层
  • 12.8.4 分组转发
  • 12.8.5 发送分组
  • 12.8.6 netfilter
  • 12.8.7 IPv6
  • 12.9 传输层
  • 12.9.1 UDP
  • 12.9.2 TCP
  • 12.10 应用层
  • 12.10.1 socket数据结构
  • 12.10.2 套接字和文件
  • 12.10.3 socketcall系统调用
  • 12.10.4 创建套接字
  • 12.10.5 接收数据
  • 12.10.6 发送数据
  • 12.11 内核内部的网络通信
  • 12.11.1 通信函数
  • 12.11.2 netlink机制
  • 12.12 小结
  • 第13章 系统调用
  • 13.1 系统程序设计基础
  • 13.1.1 追踪系统调用
  • 13.1.2 支持的标准
  • 13.1.3 重启系统调用
  • 13.2 可用的系统调用
  • 13.3 系统调用的实现
  • 13.3.1 系统调用的结构
  • 13.3.2 访问用户空间
  • 13.3.3 追踪系统调用
  • 13.4 小结
  • 第14章 内核活动
  • 14.1 中断
  • 14.1.1 中断类型
  • 14.1.2 硬件IRQ
  • 14.1.3 处理中断
  • 14.1.4 数据结构
  • 14.1.5 中断电流处理
  • 14.1.6 初始化和分配IRQ
  • 14.1.7 处理IRQ
  • 14.2 软中断
  • 14.2.1 开启软中断处理
  • 14.2.2 软中断守护进程
  • 14.3 tasklet
  • 14.3.1 创建tasklet
  • 14.3.2 注册tasklet
  • 14.3.3 执行tasklet
  • 14.4 等待队列和完成量
  • 14.4.1 等待队列
  • 14.4.2 完成量
  • 14.4.3 工作队列
  • 14.5 小结
  • 第15章 时间管理
  • 15.1 概述
  • 15.1.1 定时器的类型
  • 15.1.2 配置选项
  • 15.2 低分辨率定时器的实现
  • 15.2.1 定时器激活与进程统计
  • 15.2.2 处理jiffies
  • 15.2.3 数据结构
  • 15.2.4 动态定时器
  • 15.3 通用时间子系统
  • 15.3.1 概述
  • 15.3.2 配置选项
  • 15.3.3 时间表示
  • 15.3.4 用于时间管理的对象
  • 15.4 高分辨率定时器
  • 15.4.1 数据结构
  • 15.4.2 设置定时器
  • 15.4.3 实现
  • 15.4.4 周期时钟仿真
  • 15.4.5 切换到高分辨率定时器
  • 15.5 动态时钟
  • 15.5.1 数据结构
  • 15.5.2 低分辨率系统下的动态时钟
  • 15.5.3 高分辨率系统下的动态时钟
  • 15.5.4 停止和启动周期时钟
  • 15.6 广播模式
  • 15.7 定时器相关系统调用的实现
  • 15.7.1 时间基准
  • 15.7.2 alarm和setitimer系统调用
  • 15.7.3 获取当前时间
  • 15.8 管理进程时间
  • 15.9 小结
  • 第16章 页缓存和块缓存
  • 16.1 页缓存的结构
  • 16.1.1 管理和查找缓存的页
  • 16.1.2 回写修改的数据
  • 16.2 块缓存的结构
  • 16.3 地址空间
  • 16.3.1 数据结构
  • 16.3.2 页树
  • 16.3.3 地址空间操作
  • 16.4 页缓存的实现
  • 16.4.1 分配页
  • 16.4.2 查找页
  • 16.4.3 在页上等待
  • 16.4.4 对整页的操作
  • 16.4.5 页缓存预读
  • 16.5 块缓存的实现
  • 16.5.1 数据结构
  • 16.5.2 操作
  • 16.5.3 页缓存和块缓存的交互
  • 16.5.4 独立的缓冲区
  • 16.6 小结
  • 第17章 数据同步
  • 17.1 概述
  • 17.2 pdflush机制
  • 17.3 启动新线程
  • 17.4 线程初始化
  • 17.5 执行实际工作
  • 17.6 周期性刷出
  • 17.7 相关的数据结构
  • 17.7.1 页状态
  • 17.7.2 回写控制
  • 17.7.3 可调参数
  • 17.8 中央控制
  • 17.9 超级块同步
  • 17.10 inode同步
  • 17.10.1 遍历超级块
  • 17.10.2 考察超级块inode
  • 17.10.3 回写单个inode
  • 17.11 拥塞
  • 17.11.1 数据结构
  • 17.11.2 阈值
  • 17.11.3 拥塞状态的设置和清除
  • 17.11.4 在拥塞队列上等待
  • 17.12 强制回写
  • 17.13 膝上模式
  • 17.14 用于同步控制的系统调用
  • 17.15 完全同步
  • 17.15.1 inode的同步
  • 17.15.2 单个文件的同步
  • 17.15.3 内存映射的同步
  • 17.16 小结
  • 第18章 页面回收和页交换
  • 18.1 概述
  • 18.1.1 可换出页
  • 18.1.2 页颠簸
  • 18.1.3 页交换算法
  • 18.2 Linux内核中的页面回收和页交换
  • 18.2.1 交换区的组织
  • 18.2.2 检查内存使用情况
  • 18.2.3 选择要换出的页
  • 18.2.4 处理缺页异常
  • 18.2.5 缩减内核缓存
  • 18.3 管理交换区
  • 18.3.1 数据结构
  • 18.3.2 创建交换区
  • 18.3.3 激活交换区
  • 18.4 交换缓存
  • 18.4.1 标识换出页
  • 18.4.2 交换缓存的结构
  • 18.4.3 添加新页
  • 18.4.4 搜索一页
  • 18.5 数据回写
  • 18.6 页面回收
  • 18.6.1 概述
  • 18.6.2 数据结构
  • 18.6.3 确定页的活动程度
  • 18.6.4 收缩内存域
  • 18.6.5 隔离LRU页和集中回收
  • 18.6.6 收缩活动页链表
  • 18.6.7 回收不活动页
  • 18.7 交换令牌
  • 18.8 处理交换缺页异常
  • 18.8.1 换入页
  • 18.8.2 读取数据
  • 18.8.3 交换预读
  • 18.9 发起内存回收
  • 18.9.1 用kswapd进行周期性内存回收
  • 18.9.2 在严重内存不足时换出页
  • 18.10 收缩其他缓存
  • 18.10.1 数据结构
  • 18.10.2 注册和删除收缩器
  • 18.10.3 收缩缓存
  • 18.11 小结
  • 第19章 审计
  • 19.1 概述
  • 19.2 审计规则
  • 19.3 实现
  • 19.3.1 数据结构
  • 19.3.2 初始化
  • 19.3.3 处理请求
  • 19.3.4 记录事件
  • 19.3.5 系统调用审计
  • 19.4 小结
  • 附录A 体系结构相关知识
  • A.1 概述
  • A.2 数据类型
  • A.3 对齐
  • A.4 内存页面
  • A.5 系统调用
  • A.6 字符串处理
  • A.7 线程表示
  • A.7.1 IA-32
  • A.7.2 IA-64
  • A.7.3 ARM
  • A.7.4 Sparc64
  • A.7.5 Alpha
  • A.7.6 Mips
  • A.7.7 PowerPC
  • A.7.8 AMD64
  • A.8 位操作和字节序
  • A.8.1 位操作
  • A.8.2 不同字节序之间的转换
  • A.9 页表
  • A.10 杂项
  • A.10.1 校验和计算
  • A.10.2 上下文切换
  • A.10.3 查找当前进程
  • A.11 小结
  • 附录B 使用源代码
  • B.1 内核源代码的组织
  • B.2 用Kconfig进行配置
  • B.2.1 配置文件示例
  • B.2.2 Kconfig的语言要素
  • B.2.3 处理配置信息
  • B.3 用Kbuild编译内核
  • B.3.1 使用Kbuild系统
  • B.3.2 Makefile的结构
  • B.4 有用的工具
  • B.4.1 LXR
  • B.4.2 patch和diff
  • B.4.3 git
  • B.5 调试和分析内核
  • B.5.1 GDB和DDD
  • B.5.2 本地内核
  • B.5.3 KGDB
  • B.6 用户模式Linux
  • B.7 小结
  • 附录C 有关C语言的注记
  • C.1 GNU C编译器如何工作
  • C.1.1 从源代码到机器码程序
  • C.1.2 汇编和链接
  • C.1.3 过程调用
  • C.1.4 优化
  • C.1.5 内联函数
  • C.1.6 属性
  • C.1.7 内联汇编
  • C.1.8 __builtin函数
  • C.1.9 指针运算
  • C.2 内核的标准数据结构和技术
  • C.2.1 引用计数器
  • C.2.2 指针类型转换
  • C.2.3 对齐问题
  • C.2.4 位运算
  • C.2.5 预处理器技巧
  • C.2.6 杂项
  • C.2.7 双链表
  • C.2.8 散列表
  • C.2.9 红黑树
  • C.2.10 基数树
  • C.3 小结
  • 附录D 系统启动
  • D.1 IA-32系统上与体系结构相关的设置
  • D.2 高层初始化
  • D.2.1 子系统初始化
  • D.3 小结
  • 附录E ELF二进制格式
  • E.1 布局和结构
  • E.1.1 ELF头
  • E.1.2 程序头表
  • E.1.3 节
  • E.1.4 符号表
  • E.1.5 字符串表
  • E.2 内核中的数据结构
  • E.2.1 数据类型
  • E.2.2 头部
  • E.2.3 字符串表
  • E.2.4 符号表
  • E.2.5 重定位项
  • E.2.6 动态链接
  • E.3 小结
  • 附录F 内核开发过程
  • F.1 简介
  • F.2 内核代码树和开发的结构
  • F.2.1 命令链
  • F.2.2 开发周期
  • F.2.3 在线资源
  • F.3 补丁的结构
  • F.3.1 技术问题
  • F.3.2 提交和审阅
  • F.4 Linux和学术界
  • F.4.1 一些例子
  • F.4.2 采用研究成果
  • F.5 小结
  • 参考文献
展开全部

评分及书评

评分不足
2个评分

出版方

人民邮电出版社·图灵出品

图灵社区成立于2005年6月,由人民邮电出版社投资控股,以策划出版高质量的科技书籍为核心业务,主要出版领域包括计算机、电子电气、数学统计、科普等,通过引进国际高水平的教材、专著,以及发掘国内优秀原创作品等途径,为目标读者提供一流的内容。