参考书目录
《Linux内核设计与实现》 英文版从入门开始,介绍诸如进程管理、系统调用、中断和中断处理程序、内核同步、时间管理、内存管理、地址空间、调试技术等方面,内容比较浅显易懂,个人认为是内核新人首先必读的书籍。
目录
译者序
序言
前言
第1章 linux内核简介
1.1 追寻linus的足迹:linux简介
1.2 操作系统和内核简介
1.3 linux内核和传统unix内核的比较
1.4 linux内核版本
1.5 linux内核开发者社区
1.6 小结
第2章 从内核出发
2.1 获取内核源码
2.1.1 安装内核源代码
2.1.2 使用补丁
2.2 内核源码树
2.3 编译内核
2.3.1 减少编译的垃圾信息
2.3.2 衍生多个编译作业
2.3.3 安装内核
2.4 内核开发的特点
2.4.1 没有libc库
2.4.2 gnu c
2.4.3 没有内存保护机制
2.4.4 不要轻易在内核中使用浮点数
2.4.5 容积小而固定的栈
2.4.6 同步和并发
2.4.7 可移植性的重要性
2.5 小结
第3章 进程管理
3.1 进程描述符及任务结构
3.1.1 分配进程描述符
3.1.2 进程描述符的存放
3.1.3 进程状态
3.1.4 设置当前进程状态
3.1.5 进程上下文
3.1.6 进程家族树
3.2 进程创建
3.2.1 写时拷贝
3.2.2 fork()
3.2.3 vfork()
3.3 线程在linux中的实现
3.4 进程终结
3.4.1 删除进程描述符
3.4.2 孤儿进程造成的进退维谷
3.5 进程小结
第4章 进程调度
4.1 策略
4.1.1 i/o消耗型和处理器消耗型的进程
4.1.2 进程优先级
4.1.3 时间片
4.1.4 进程抢占
4.1.5 调度策略的活动
4.2 linux调度算法
4.2.1 可执行队列
4.2.2 优先级数组
4.2.3 重新计算时间片
4.2.4 schedule()
4.2.5 计算优先级和时间片
4.2.6 睡眠和唤醒
4.2.7 负载平衡程序
4.3 抢占和上下文切换
4.3.1 用户抢占
4.3.2 内核抢占
4.4 实时
4.5 与调度相关的系统调用
4.5.1 与调度策略和优先级相关的系统调用
4.5.2 与处理器绑定有关的系统调用
4.5.3 放弃处理器时间
4.6 调度程序小结
第5章 系统调用
5.1 api、posix和c库
5.2 系统调用
5.2.1 系统调用号
5.1.2 系统调用的性能
5.3 系统调用处理程序
5.3.1 指定恰当的系统调用
5.3.2 参数传递
5.4 系统调用的实现
5.5 系统调用上下文
5.5.1 绑定一个系统调用的最后步骤
5.5.2 从用户空间访问系统调用
5.5.3 为什么不通过系统调用的方式实现
5.6 系统调用小结
第6章 中断和中断处理程序
6.1 中断
6.2 中断处理程序
6.3 注册中断处理程序
6.4 编写中断处理程序
6.4.1 共享的中断处理程序
6.4.2 中断处理程序实例
6.5 中断上下文
6.6 中断处理机制的实现
6.7 中断控制
6.7.1 禁止和激活中断
6.7.2 禁止指定中断线
6.7.3 中断系统的状态
6.8 别打断我,马上结束
第7章 下半部和推后执行的工作
7.1 下半部
7.1.1 为什么要用下半部
7.1.1 下半部的环境
7.2 软中断
7.2.1 软中断的实现
7.2.2 使用软中断
7.3 tasklet
7.3.1 tasklet的实现
7.3.2 使用tasklet
7.3.3 ksofiirqd
7.3.4 老的bh机制
7.4 工作队列
7.4.1 工作队列的实现
7.4.2 使用工作队列
7.4.3 老的任务队列机制
7.5 下半部机制的选择
7.6 在下半部之间加锁
7.7 下半部处理小结
第8章 内核同步介绍
8.1 临界区和竞争条件
8.2 加锁
8.2.1 到底是什么造成了并发执行
8.2.2 要保护些什么
8.3 死锁
8.4 争用和扩展性
8.5 小结
第9章 内核同步方法
9.1 原子操作
9.1.1 原子整数操作
9.1.2 原子位操作
9.2 自旋销
9.2.1 其他针对自旋锁的操作
9.2.2 自旋销和下半部
9.3 读一写自旋销
9.4 信号量
9.4.1 创建和初始化信号量
9.4.2 使用信号量
9.5 读—写信号量
9.6 自旋锁与信号量
9.7 完成变量
9.8 bkl..
9.9 禁止抢占
9.10 顺序和屏障
9.11 小结
第10章 定时器和时间管理
10.1 内核中的时间概念
10.2 节拍率:hz
10.3 jiffies
10.3.1 jiffies的内部表示
10.3.2 jiffies的回绕
10.3.3 用户空间和hz
10.4 硬时钟和定时器
10.4.1 实时时钟
10.4.2 系统定时器
10.5 时钟中断处理程序
10.6 实际时间
10.7 定时器
10.7.1 使用定时器
10.7.2 定时器竞争条件
10.7.3 实现定时器
10.8 延迟执行
10.8.1 忙等待
10.8.2 短延迟
10.8.3 schedule_timeout()
10.8.4 设置超时时间,在等待队列上睡眠
10.9 小结
第11章 内存管理
11.1 页
11.2 区
11.3 获得页
11.3.1 获得填充为0的页
11.3.2 释放页
11.4 kmalloc()
11.4.1 gfp_mask标志
11.4.2 kfree()
11.5 vmalloc()
11.6 slab层
11.7 slab分配器的接口
11.8 在栈上的静态分配
11.9 高端内存的映射
11.9.1 永久映射
11.9.2 临时映射
11.10 每个cpu的分配
11.11 新的每个cpu接口
11.11.1 编译时的每个cpu数据
11.11.2 运行时的每个cpu数据
11.12 使用每个cpu数据的原因
11.13 分配函数的选择
第12章 虚拟文件系统
12.1 通用文件系统接口
12.1 文件系统抽象层
12.3 unix文件系统
12.4 vfs对象及其数据结构
12.5 超级块对象
12.6 索引节点对象
12.7 目录项对象
12.7.1 目录项状态
12.7.2 目录项缓存
12.7.3 目录项操作
12.8 文件对象
12.9 和文件系统相关的数据结构
12.10 和进程相关的数据结构
12.11 linux中的文件系统
第13章 块i/o层
13.1 解剖一个块设备
13.2 缓冲区和缓冲区头
13.3 bio结构体
13.4 请求队列
19.5 i/o调度程序
13.5.1 i/0调度程序的工作
13.5.2 linus电梯
13.5.3 最终期限i/o调度程序
13.5.4 预测i/0调度程序
13.5.5 完全公正的排队i/0调度程序
13.5.6 空操作的i/o调度程序
13.5.7 i/o调度程序的选择
13.6 小结
第14章 进程地址空间
14.1 内存描述符
14.1.1 分配内存描述符
14.1.2 销毁内存描述符
14.1.3 mm_struct与内核线程
14.2 内存区域
14.2.1 vma标志
14.2.2 vma操作
14.2.3 内存区域的树型结构和内存区域的链表结构
14.2.4 实际使用中的内存区域
14.3 操作内存区域
14.3.1 find_vma()
14.3.2 find_vma_prev()
14.3.3 find vma_intersection()
14.4 mmap()和do_mmap():创建地址区间
14.5 munmap()和do_munmap():删除地址区间
14.6 页表
14.7 小结
第15章 页高速缓存和页回写
15.1 页高速缓存
15.2 基树
15.3 缓冲区高速缓存
15.4 pdfiush后台例程
15.4.1 膝上型电脑模式
15.4.2 bdflush和kupdated
15.4.3 避免拥塞的方法:使用多线程
15.5 小结
第16章 模块
16.1 构建模块
16.1.1 放在内核源代码树中
16.1.2 放在内核代码外
16.2 安装模块
16.3 产生模块依赖性
16.4 载入模块
16.5 管理配置选项
16.6 模块参数
16.7 导出符号表
16.8 小结
第17章 kobject与sysfs
17.1 kobject
17.2 ktype
17.3 kset
17.4 subsystem
17.5 别混淆了这些结构体
17.6 管理和操作kobject
17.7 引用计数
17.8 sysfs
17.8.1 sysfs中添加和删除kobject
17.8.2 向sysfs中添加文件
17.9 内核事件层
17.10 小结
第18章 调试
18.1 调试前需要准备什么
18.2 内核中的bug
18.3 printk()
18.3.1 printk()函数的健壮性
18.3.2 记录等级
18.3.3 记录缓冲区
18.3.4 syslogd和klogd
18.3.5 printk()和内核开发时需要留意的一点
18.4 oops
18.4.1 ksymoops
18.4.2 kallsyms
18.5 内核调试配置选项
18.6 引发bug并打印信息
18.7 神奇的sysrq
18.8 内核调试器的传奇
18.8.1 gdb
18.8.2 kgdb
18.8.3 kdb
18.9 刺探系统
18.9.1 用uid作为选择条件
18.9.2 使用条件变量
18.9.3 使用统计量
18.9.4 重复频率限制
18.10 用二分查找法找出引发灾难的变更
18.11 当所有的努力都失败时
第19章 可移植性
19.1 linux的可移植性
19.2 字长和数据类型
19.2.1 不透明类型
19.2.2 指定数据类型
19.2.3 长度明确的类型
19.2.4 char型的符号问题
19.3 数据对齐
19.3.1 避免对齐引发的问题
19.3.2 非标准类型的对齐
19.3.3 结构体填补
19.4 字节顺序
19.4.1 高位优先和低位优先的历史
19.4.2 内核中的字节顺序
19.5 时间
19.6 页长度
19.7 处理器排序
19.8 smp、内核抢占、高端内存
19.9 小结
第20章 补丁、开发和社区
20.1 社区
20.2 linux编码风格
20.2.1 缩进
20.2.2 括号
20.2.3 每行代码的长度
20.2.4 命名规范
20.2.5 函数
20.2.6 注释
20.2.7 typedef
20.2.8 多用现成的东西
20.2.9 在源码中不要使用ifdef
20.2.10 结构初始化
20.2.11 代码的事后修正
20.3 管理系统
20.4 提交错误报告
20.5 创建补丁
20.6 提交补丁
20.7 小结
附录a 链表...
附录b 内核随机数产生器
附录c 复杂度算法
参考资料
《深入理解Linux内核》 英文2版 英文3版内容深入全面。
目录
前言
第一章 绪论
第二章 内存寻址
第三章 进程
第四章 中断和异常
第五章 内核同步
第六章 定时测量
第七章 进程调度
第八章 内存管理
第九章 进程地址空间
第十章 系统调用
第十一章 信号
第十二章 虚拟文件系统
第十三章 I/O体系结构和设备驱动程序
第十四章 块设备驱动程序
第十五章 页高速缓存
第十六章 访问文件
第十七章 回收页框
第十八章 Ext2和Ext3文件系统
第十九章 进程通信
第二十章 程序的执行
附录一 系统启动
附录二 模块
参考文献
源代码索引
《Linux设备驱动程序》 英文版驱动开发者人手一本。
目录
前言
第一章 设备驱动程序简介
设备驱动程序的作用
内核功能划分
设备和模块的分类
安全问题
版本编号
许可证条款
加入内核开发社团
本书概要
第二章 构造和运行模块
设置测试系统
Hello World模块
核心模块与应用程序的对比
编译和装载
前言
第一章 设备驱动程序简介
设备驱动程序的作用
内核功能划分
设备和模块的分类
安全问题
版本编号
许可证条款
加入内核开发社团
本书概要
第二章 构造和运行模块
设置测试系统
Hello World模块
核心模块与应用程序的对比
编译和装载
内核符号表
预备知识
初始化和关闭
模块参数
在用户空间编写驱动程序
快速参考
第三章 字符设备驱动程序
scull的设计
主设备号和次设备号
一些重要的数据结构
字符设备的注册
open和release
scull的内存使用
read和write
试试新设备
快速参考
第四章 调试技术
内核中的调试支持
通过打印调试
通过查询调试
通过监视调试
调试系统故障
调试器和相关工具
第五章 并发和竞态
scull的缺陷
并发及其管理
信号量和互斥体
completion
自旋锁
锁陷阱
除了锁之外的办法
快速参考
第六章 高级字符驱动程序操作
ioctl
阻塞型I/O
poll和select
异步通知
定位设备
设备文件的访问控制
快速参考
第七章 时间、延迟及延缓操作
度量时间差
获取当前时间
延迟执行
内核定时器
tasklet
工作队列
快速参考
第八章 分配内存
kmalloc函数的内幕
后备高速缓存
get_free_page和相关函数
vmalloc及其辅助函数
per-CPU变量
获取大的缓冲区
快速参考
第九章 与硬件通信
I/O端口和I/O内存
使用I/O端口
I/O端口示例
使用I/O内存
快速参考
第十章 中断处理
准备并口
安装中断处理例程
实现中断处理例程
顶半部和底半部
中断共享
中断驱动的I/O
快速参考
第十一章 内核的数据类型
使用标准C语言类型
为数据项分配确定的空间大小
接口特定的类型
其他有关移植性的问题
链表
快速参考
第十二章 PCI驱动程序
PCI接口
ISA回顾
PC/104和PC/104+
其他的PC总线
SBus
NuBus
外部总线
快速参考
第十三章 USB驱动程序
USB设备基础
USB和Sysfs
USB urb
编写USB驱动程序
不使用urb的USB传输
快速参考
第十四章 Linux设备模型
kobject、kset和子系统
低层sysfs操作
热插拔事件的产生
总线、设备和驱动程序
类
各环节的整合
热插拔
处理固件
快速索引
第十五章 内存映射和DMA
Linux的内存管理
mmap设备操作
执行直接I/O访问
直接内存访问
快速参考
第十六章 块设备驱动程序
注册
块设备操作
请求处理
其他一些细节
快速参考
第十七章 网络驱动程序
snull设计
连接到内核
net_device结构细节
打开和关闭
数据包传输
数据包的接收
中断处理例程
不使用接收中断
链路状态的改变
套接字缓冲区
MAC 地址解析
定制 ioctl 命令
统计信息
组播
其他知识点详解
快速参考
第十八章 TTY驱动程序
小型TTY驱动程序
tty_driver函数指针
TTY线路设置
ioctls
proc和sysfs对TTY设备的处理
tty_driver结构详解
tty_operations结构详解
tty_struct结构详解
快速参考
参考书目
《深入理解Linux虚拟内存管理》 介绍Linux虚拟内存管理机制。如果你希望深入的研究Linux的内存管理子系统,仔细的研读这本书无疑是最好的选择。
目录
第1章简介
1.1 开始启程
1.2 管理源码
1.3 浏览代码
1.4 阅读代码
1.5 提交补丁
第2章描述物理内存
2.1 节点
2.2 管理区
2.3 管理区初始化
2.4 初始化mem_map
2.5 页面
2.6 页面映射到管理区
2.7 高端内存
2.8 2.6中有哪些新特性
第3章页表管理
3.1描述页目录
3.2描述页表项
3.3页表项的使用
3.4页表项的转换和设置
3.5页表的分配和释放
3.6内核页表
3.7地址和structpage之间的映射
3.8转换后援缓冲区(tlb)
3.9一级cpu高速缓存管理
3.102.6中有哪些新特性
第4章进程地址空间
4.1线性地址空间
4.2地址空间的管理
4.3进程地址空间描述符
4.4内存区域
4.5异常处理
4.6缺页中断
4.7复制到用户空间/从用户空间复制
4.82.6中有哪些新特性
第5章引导内存分配器
5.1表示引导内存映射
5.2初始化引导内存分配器
5.3初始化bootmem_data
5.4分配内存
5.5释放内存
5.6销毁引导内存分配器
5.72.6中有哪些新特性
第6章物理页面分析
6.1管理空闲块
6.2分配页面
6.3释放页面
6.4获得空闲页面(gfp)标志位
6.5进程标志位
6.6防止碎片
6.72.6中有哪些新特性
第7章非连续内存分配
7.1描述虚拟内存区
7.2分配非连续区域
7.3释放非连续内存
7.42.6中有哪些新特性
第8章slab分配器
8.1高速缓存
8.2slabs
8.3对象
8.4指定大小的高速缓存
8.5per cpu对象高速缓存
8.6初始化slab分配器
8.7伙伴分配器接口
8.82.6中有哪些新特性
第9章高端内存管理
9.1管理pkmap地址空间
9.2映射高端内存页面
9.3解除页面映射
9.4原子性的映射高端内存页面
9.5弹性缓冲区
9.6紧急池
9.72.6中有哪些新特性
第10章页面帧回收
10.1页面替换策略
10.2页面高速缓存
10.3lru链表
10.4收缩所有的高速缓存
10.5换出进程页面
10.6页面换出守护程序(kswapd)
10.72.6中有哪些新特性
第11章交换管理
11.1描述交换区
11.2映射页表项到交换项
11.3分配一个交换槽
11.4交换区高速缓存
11.5从后援存储器读取页面
11.6向后援存储器写页面
11.7读/写交换区域的块
11.8激活一个交换区
11.9禁止一个交换区
11.102.6中有哪些新特性
第12章共享内存虚拟文件系统
12.1初始化虚拟文件系统
12.2使用shmem函数
12.3在tmpfs中创建文件
12.4虚拟文件中的缺页中断
12.5tmps中的文件操作
12.6tmpfs中的索引节点操作
12.7建立共享区
12.8systemvipc
12.92.6中有哪些新特性
第13章内存溢出管理
13.1检查可用内存
13.2确定oom状态
13.3选择进程
13.4杀死选定的进程
13.5是这样吗?
13.62.6中有哪些新特性
第14章结束语
附录a 介绍
附录b 描述物理内存
b.1初始化管理区201
b.2页面操作214
附录c页表管理
c.1初始化页表219
c.2遍历页表227
附录d进程地址空间
d.1进程内存描述符232
d.2创建内存区域239
d.3查找内存区域285
d.4对内存区域上锁和解锁291
d.5缺页中断304
d.6页面相关的磁盘i/o330
附录e启动内存分配
e.1初始化引导内存分配器370
e.2分配内存372
e.3释放内存381
e.4释放引导内存分配器383
附录f物理页面分配
f.1分配页面391
f.2分配辅助函数402
f.3释放页面404
f.4释放辅助函数409
附录g不连续内存分配
g.1分配一块非连续的区域411
g.2释放一块非连续区域420
附录hslab分配器
h.1高速缓存控制427
h.2slabs446
h.3对象452
h.4指定大小的高速缓存466
h.5percpu对象高速缓存469
h.6初始化slab分配器476
h.7与伙伴分配器的接口477
附录i高端内存管理
i.1映射高端内存页面479
i.2自动映射高端内存页面484
i.3解除页面映射485
i.4自动解除高端内存页面映射487
i.5弹性缓冲区488
i.6紧急池495
附录j页面帧回收
j.1页面高速缓存操作500
j.2lru链表操作510
j.3重填充inactive_list514
j.4从lru链表回收页面515
j.5收缩所有高速缓存522
j.6换出进程页面525
j.7页面交换守护程序536
附录k交换管理
k.1查找空闲项543
k.2交换高速缓存548
k.3交换区i/o555
k.4激活一个交换区564
k.5禁止一个交换区575
附录l共享内存虚拟文件系统
l.1初始化shmfs591
l.2在tmpfs中创建文件596
l.3tmpfs中的文件操作600
l.4tmpfs中的索引节点操作613
l.5虚拟文件中的缺页中断622
l.6交换空间交互633
l.7建立共享区639
l.8systemvipc642
附录m内存溢出管理
m.1确定可用内存650
m.2检查oom并从中恢复652
参考文献
《深入理解LINUX网络内幕》 英文版讲解网络子系统的实现,通过这本书,可以了解到Linux内核是如何实现复杂的网络功能的。
目录
前言
第一部分 基础背景
第一章 简介
基本术语
常见编码模式
用户空间工具
浏览源代码
当功能以补丁形式提供时
第二章 关键数据结构
套接字缓冲区:sk—buff结构
net—device结构
本章涉及的文件
第三章 用户空间与内核的接
概论
procfs与sysctl
ioctl
Netlink
配置改变串行化
第二部分 系统初始化
第四章 通知链
使用通知链的原因
概论
定义链
链注册
链上的通知事件
网络子系统的通知链
通过/proc文件系统的调整
本章涉及的函数和变量
本章涉及的文件和目录
第五章 网络设备初始化
系统初始化概论
设备注册和初始化
NIC初始化的基本目标
设备与内核之间的交互
初始化选项
模块选项
设备处理层初始化:net—dev—init
用户空间辅助程序
虚拟设备
通过/proc文件系统调整
本章涉及的函数和变量
本章涉及的文件和目录
第六章 PCI层和网络接口卡
本章涉及的数据结构
PCI NIC设备驱动程序的注册
电源管理和网络唤醒
PCI NIC驱动程序注册范例
大蓝图
通过/proc文件系统调整
本章涉及的函数和变量
本章涉及的文件和目录
第七章 组件初始化的内核基础架构
引导期间的内核选项
模块初始化代码
优化宏卷标
引导期间初始化函数
内存最优化
通过/proc文件系统调整
本章涉及的函数和变量
本章涉及的文件和目录
第八章 设备注册和初始化
设备注册之时
设备除名之时
分配net—device结构
NIC注册和除名的架构
设备初始化
net—device结构的组织
设备状态
设备的注册和除名
设备注册
设备除名
开启和关闭网络设备
更新设备队列规则状态
从用户空间配置设备相关信息
虚拟设备
上锁
通过/proc文件系统调整
本章涉及的函数和变量
本章涉及的文件和目录
第三部分 传输和接收
第九章 中断和网络驱动程序
决策和流量方向
接收到帧时通知驱动程序
中断处理函数
softnet—data结构
第十章 帧的接收
与其他功能交互
设备的开启和关闭
队列
通知内核帧已接收:NAPI和netif_rx
设备驱动程序与内核问的IB接口:netif_rx的第一部分
拥塞管理
处理NET_RX_SOFTIRQ:net_rxa_ction
第十一章 帧的传输
传输的开启和关闭
第十二章 中断事件一般性参考数据
统计数据
通过/proc和sysfs文件系统调整
本部分涉及的函数和变量
本部分涉及的文件和目录
第十三章 协议处理函数
网络协议栈概论
执行正确的协议处理函数
协议处理函数的组织
协议处理函数的注册
Ethernet与IEEE 802.3帧
通过/proc文件系统进行调整
本章涉及的函数和变量
本章涉及的文件和目录
第四部分 桥接
第十四章 桥接:概念
中继器、网桥以及路由器
网桥与交换机
主机
用网桥合并LAN
桥接不同技术的LAN
地址学习
多台网桥
第十五章 桥接:生成树协议
基本术语
阶层交换式L2拓扑范例
生成树协议的基本元素
网桥ID和端口ID
网桥协议数据单元(BPDU)
定义活跃拓扑
定时器
拓扑变化
BPDU封装
传输配置BPDU
处理入口帧
收敛时间
新版生成树协议概况
第十六章 桥接:Linux实现
网桥设备抽象
重要的数据结构
桥接程序的初始化
建立网桥设备和网桥端口
建立一个新网桥设备
网桥设备设置函数
删除网桥
给网桥添加端口
启动和关闭网桥设备
启动和关闭网桥端口
改变网桥端口状态
大蓝图
转发数据库
处理入口流量
网桥设备上的传输
生成树协议(STP)
netdevice通知链
第十七章 桥接:其他主题
用户空间配置工具
通过/proc文件系统调整网桥
通过/sys文件系统调整网桥
统计数据
本部分涉及的数据结构
本部分涉及的函数和变量
本部分涉及的文件和目录
第五部分 因特网协议第4版(IPv4)
第六部分 邻居子系统
第七部分 路由
首先通过《Linux内核设计与实现》或《深入理解Linux内核》了解内核的设计实现特点,对内核有个全局的认识和理解,然后可分为两个岔路,如果从事驱动开发,则钻研《Linux设备驱动程序》,如果希望对内核有更深入的理解,可以选择一个自己感兴趣的子系统,仔细分析它的代码,不懂的地方就通过社区、邮件列表或者直接发Email给maintainer请教等途径弄懂,切勿得过且过,这样分析下来,对同步、中断等等内核的很多机制也同样会非常了解,俗话说的一通则百通就是这个道理。当然,如果你选择研究的是内存管理或者网络,则可以有上面的两本书可以学习。