图书介绍
Linux内核设计与实现 第2版PDF|Epub|txt|kindle电子书版本下载
- (美)Robert Love著;陈莉君,康华,张波译(西安邮电学院) 著
- 出版社: 北京:机械工业出版社
- ISBN:7111178653
- 出版时间:2006
- 标注页数:289页
- 文件大小:17MB
- 文件页数:304页
- 主题词:
PDF下载
下载说明
Linux内核设计与实现 第2版PDF格式电子书版下载
下载的文件为RAR压缩包。需要使用解压软件进行解压得到PDF格式图书。建议使用BT下载工具Free Download Manager进行下载,简称FDM(免费,没有广告,支持多平台)。本站资源全部打包为BT种子。所以需要使用专业的BT下载软件进行下载。如BitComet qBittorrent uTorrent等BT下载工具。迅雷目前由于本站不是热门资源。不推荐使用!后期资源热门了。安装了迅雷也可以迅雷进行下载!
(文件页数 要大于 标注页数,上中下等多册电子书除外)
注意:本站所有压缩包均有解压码: 点击下载压缩包解压工具
图书目录
译者序1
序言1
前言1
第1章 Linux内核简介1
目录1
1.1 追寻Linus的足迹:Linux简介2
1.2 操作系统和内核简介3
1.3 Linux内核和传统Unix内核的比较5
1.4 Linux内核版本6
1.6 小结7
1.5 Linux内核开发者社区7
第2章 从内核出发8
2.1 获取内核源码8
2.1.1 安装内核源代码8
2.1.2 使用补丁8
2.2 内核源码树9
2.3 编译内核9
2.3.1 减少编译的垃圾信息10
2.3.3 安装内核11
2.4 内核开发的特点11
2.3.2 衍生多个编译作业11
2.4.1 没有libc库12
2.4.2 GNU C12
2.4.3 没有内存保护机制14
2.4.4 不要轻易在内核中使用浮点数14
2.4.5 容积小而固定的栈14
2.4.6 同步和并发15
2.4.7 可移植性的重要性15
2.5 小结15
第3章 进程管理16
3.1.1 分配进程描述符17
3.1 进程描述符及任务结构17
3.1.2 进程描述符的存放18
3.1.3 进程状态19
3.1.4 设置当前进程状态20
3.1.5 进程上下文21
3.1.6 进程家族树21
3.2 进程创建22
3.2.1 写时拷贝22
3.2.2 fork()23
3.2.3 vfork()23
3.3 线程在Linux中的实现24
3.4 进程终结26
3.4.1 删除进程描述符27
3.4.2 孤儿进程造成的进退维谷27
3.5 进程小结28
第4章 进程调度29
4.1 策略30
4.1.1 I/O消耗型和处理器消耗型的进程30
4.1.2 进程优先级30
4.1.3 时间片31
4.2 Linux调度算法32
4.1.5 调度策略的活动32
4.1.4 进程抢占32
4.2.1 可执行队列33
4.2.2 优先级数组35
4.2.3 重新计算时间片36
4.2.4 schedule()36
4.2.5 计算优先级和时间片37
4.2.6 睡眠和唤醒39
4.2.7 负载平衡程序41
4.3 抢占和上下文切换44
4.3.2 内核抢占45
4.3.1 用户抢占45
4.5 与调度相关的系统调用46
4.4 实时46
4.5.1 与调度策略和优先级相关的系统调用47
4.5.2 与处理器绑定有关的系统调用47
4.5.3 放弃处理器时间47
4.6 调度程序小结48
第5章 系统调用49
5.1 API、POSIX和C库49
5.2 系统调用50
5.3 系统调用处理程序51
5.2.1 系统调用号51
5.2.2 系统调用的性能51
5.3.1 指定恰当的系统调用52
5.3.2 参数传递52
5.4 系统调用的实现53
5.5 系统调用上下文55
5.5.1 绑定一个系统调用的最后步骤55
5.5.2 从用户空间访问系统调用57
5.5.3 为什么不通过系统调用的方式实现57
5.6 系统调用小结58
6.1 中断59
第6章 中断和中断处理程序59
6.2 中断处理程序60
6.3 注册中断处理程序61
6.4 编写中断处理程序63
6.4.1 共享的中断处理程序64
6.4.2 中断处理程序实例65
6.5 中断上下文66
6.6 中断处理机制的实现67
6.7.1 禁止和激活中断70
6.7 中断控制70
6.7.2 禁止指定中断线71
6.7.3 中断系统的状态72
6.8 别打断我,马上结束73
第7章 下半部和推后执行的工作74
7.1 半部74
7.1.1 为什么要用下半部75
7.1.2 下半部的环境75
7.2 软中断77
7.2.1 软中断的实现77
7.2.2 使用软中断79
7.3 tasklet80
7.3.1 tasklet的实现81
7.3.2 使用tasklet82
7.3.3 ksoftirqd84
7.3.4 老的BH机制85
7.4 工作队列86
7.4.1 工作队列的实现86
7.4.2 使用工作队列89
7.4.3 老的任务队列机制92
7.5 下半部机制的选择92
7.6 在下半部之间加锁93
7.7 下半部处理小结95
第8章 内核同步介绍96
8.1 临界区和竞争条件96
8.2 加锁98
8.2.1 到底是什么造成了并发执行100
8.2.2 要保护些什么101
8.3 死锁102
8.4 争用和扩展性103
8.5 小结104
9.1.1 原子整数操作105
第9章 内核同步方法105
9.1 原子操作105
9.1.2 原子位操作107
9.2 自旋锁109
9.2.1 其他针对自旋锁的操作111
9.2.2 自旋锁和下半部112
9.3 读-写自旋锁112
9.4 信号量114
9.4.1 创建和初始化信号量115
9.5 读-写信号量116
9.4.2 使用信号量116
9.6 自旋锁与信号量117
9.7 完成变量118
9.8 BKL118
9.9 禁止抢占120
9.10 顺序和屏障121
9.11 小结124
第10章 定时器和时间管理125
10.1 内核中的时间概念125
10.2 节拍率:HZ126
10.3 jiffies128
10.3.1 jiffies的内部表示129
10.3.2 jiffies的回绕130
10.3.3 用户空间和HZ131
10.4 硬时钟和定时器132
10.4.1 实时时钟132
10.4.2 系统定时器132
10.5 时钟中断处理程序132
10.6 实际时间134
10.7.1 使用定时器136
10.7 定时器136
10.7.2 定时器竞争条件138
10.7.3 实现定时器138
10.8 延迟执行138
10.8.1 忙等待139
10.8.2 短延迟140
10.8.3 schedule_timeout()141
10.8.4 设置超时时间,在等待队列上睡眠142
10.9 小结143
第11章 内存管理144
11.1 页144
11.2 区145
11.3 获得页147
11.3.1 获得填充为0的页148
11.3.2 释放页148
11.4 kmalloc()149
11.4.1 gfp_mask标志149
11.4.2 kfree()152
11.5 vmalloc()153
11.6 slab层154
11.7 slab分配器的接口157
11.8 在栈上的静态分配159
11.9 高端内存的映射160
11.9.1 永久映射160
11.9.2 临时映射161
11.10 每个CPU的分配162
11.11 新的每个CPU接口162
11.11.1 编译时的每个CPU数据162
11.11.2 运行时的每个CPU数据163
11.12 使用每个CPU数据的原因164
11.13 分配函数的选择165
12.2 文件系统抽象层166
12.1 通用文件系统接口166
第12章 虚拟文件系统166
12.3 Unix文件系统167
12.4 VFS对象及其数据结构168
12.5 超级块对象169
12.6 索引节点对象172
12.7 目录项对象177
12.7.1 目录项状态177
12.7.2 目录项缓存178
12.7.3 目录项操作179
12.8 文件对象180
12.9 和文件系统相关的数据结构184
12.10 和进程相关的数据结构185
12.11 Linux中的文件系统187
第13章 块I/O层188
13.1 解剖一个块设备188
13.2 缓冲区和缓冲区头189
13.3 bio结构体191
13.4 请求队列193
13.5 I/O调度程序194
13.5.1 I/O调度程序的工作194
13.5.3 最终期限I/O调度程序195
13.5.2 Linus电梯195
13.5.4 预测I/O调度程序197
13.5.5 完全公正的排队I/O调度程序198
13.5.6 空操作的I/O调度程序198
13.5.7 I/O调度程序的选择198
13.6 小结199
第14章 进程地址空间200
14.1 内存描述符201
14.1.1 分配内存描述符202
14.2 内存区域203
14.1.3 mm_struct与内核线程203
14.1.2 销毁内存描述符203
14.2.1 VMA标志204
14.2.2 VMA操作205
14.2.3 内存区域的树型结构和内存区域的链表结构206
14.2.4 实际使用中的内存区域207
14.3 操作内存区域208
14.3.1 find_vma()208
14.3.2 find_vma_prev()209
14.3.3 find_vma_intersection()209
14.4 mmap()和do_mmap():创建地址区间210
14.5 munmap()和do_munmap():删除地址区间211
14.6 页表212
14.7 小结213
第15章 页高速缓存和页回写214
15.1 页高速缓存214
15.2 基树217
15.3 缓冲区高速缓存218
15.4 pdflush后台例程218
15.4.2 bdflush和kupdated219
15.4.1 膝上型电脑模式219
15.4.3 避免拥塞的方法:使用多线程220
15.5 小结221
第16章 模块222
16.1 构建模块223
16.1.1 放在内核源代码树中223
16.1.2 放在内核代码外225
16.2 安装模块225
16.3 产生模块依赖性225
16.4 载入模块225
16.5 管理配置选项226
16.6 模块参数228
16.7 导出符号表229
16.8 小结230
第17章 kobject sysfs231
17.1 kobject231
17 2 ktype232
17 3 kset233
17.4 subsystem233
17.5 别混淆了这些结构体234
17.6 管理和操作kobject234
17.7 引用计数235
17 8 sysfs236
17.8.1 sysfs中添加和删除kobject238
17.8.2 向sysfs中添加文件238
17.9 内核事件层241
17.10 小结242
第18章 调试243
18.1 调试前需要准备什么243
18.2 内核中的bug244
18.3 printk()244
18.3.1 printk()函数的健壮性244
18.3.2 记录等级245
18.3.4 syslogd和klogd246
18.3.5 printk()和内核开发时需要留意的一点246
18.3.3 记录缓冲区246
18.4 oops247
18.4.1 ksymoops248
18.4.2 kallsyms248
18.5 内核调试配置选项248
18.6 引发bug并打印信息249
18.7 神奇的SysRq250
18.8.2 kgdb251
18.8 内核调试器的传奇251
18.8.1 gdb251
18.8.3 kdb252
18.9 刺探系统252
18.9.1 用UID作为选择条件252
18.9.2 使用条件变量252
18.9.3 使用统计量252
18.9.4 重复频率限制253
18.10 用二分查找法找出引发灾难的变更254
18.11 当所有的努力都失败时254
第19章 可移植性255
19.1 Linux的可移植性256
19.2 字长和数据类型257
19.2.1 不透明类型258
19.2.2 指定数据类型259
19.2.3 长度明确的类型259
19.2.4 char型的符号问题260
19.3 数据对齐260
19.3.2 非标准类型的对齐261
19.3.3 结构体填补261
19.3.1 避免对齐引发的问题261
19.4 字节顺序262
19.4.1 高位优先和低位优先的历史264
19.4.2 内核中的字节顺序264
19.5 时间264
19.6 页长度264
19.7 处理器排序265
19.8 SMP、内核抢占、高端内存265
19.9 小结266
20.1 社区267
20.2 Linux编码风格267
第20章 补丁、开发和社区267
20.2.1 缩进268
20.2.2 括号268
20.2.3 每行代码的长度269
20.2.4 命名规范269
20.2.5 函数269
20.2.6 注释269
20.2.7 typedef270
20.2.9 在源码中不要使用ifdef271
20.2.10 结构初始化271
20.2.8 多用现成的东西271
20.2.11 代码的事后修正272
20.3 管理系统272
20.4 提交错误报告272
20.5 创建补丁273
20.6 提交补丁273
20.7 小结274
附录A 链表275
附录B 内核随机数产生器281
附录C 复杂度算法285
参考资料287