注重体验与质量的电子书资源下载网站
分类于: 互联网 职场办公
简介
深入Linux设备驱动程序内核机制 豆 9.5分
资源最后更新于 2020-07-28 14:43:47
作者:陈学松
出版社:电子工业出版社
出版日期:2012-01
ISBN:9787121150524
文件格式: pdf
标签: Linux 驱动 内核 kernel linux 计算机 操作系统 嵌入式
简介· · · · · ·
《深入Linux设备驱动程序内核机制》内容简介:这是一本系统阐述Linux设备驱动程序技术内幕的专业书籍,它的侧重点不是讨论如何在Linux系统下编写设备驱动程序,而是要告诉读者隐藏在这些设备驱动程序背后的那些内核机制及原理。作者通过对Linux内核源码抽丝剥茧般的解读,再辅之以精心设计的大量图片,使读者在阅读完《深入Linux设备驱动程序内核机制》后对驱动程序前台所展现出来的那些行为特点变得豁然开朗。
《深入Linux设备驱动程序内核机制》涵盖了编写设备驱动程序所需要的几乎所有的内核设施,比如内核模块、中断处理、互斥与同步、内存分配、延迟操作、时间管理,以及新设备驱动模型等内容。为了避免读者迷失在某一,技术细节的讨论当中,《深入Linux设备驱动程序内核机制》在一个比较高的层面上进行展开,以一种先框架再细节的结构安排极大地简化了读者的阅读与学习。
...
目录
第1章 内核模块 1
1.1 内核模块的文件格式 2
1.2 EXPORT_SYMBOL的内核实现 5
1.3 模块的加载过程 8
1.3.1 sys_init_module(第一部分) 9
1.3.2 struct module 9
1.3.3 load_module 13
1.3.4 sys_init_module(第二部分) 49
1.3.5 模块的卸载 54
1.4 本章小结 55
第2章 字符设备驱动程序 57
2.1 应用程序与设备驱动程序互动实例 58
2.2 struct file_operations 62
2.3 字符设备的内核抽象 63
2.4 设备号的构成与分配 65
2.4.1 设备号的构成 65
2.4.2 设备号的分配与管理 66
2.5 字符设备的注册 71
2.6 设备文件节点的生成 74
2.7 字符设备文件的打开操作 77
2.8 本章小结 85
第3章 分配内存 87
3.1 物理内存的管理 87
3.1.1 内存节点node 87
3.1.2 内存区域zone 88
3.1.3 内存页 89
3.2 页面分配器(page allocator) 90
3.2.1 gfp_mask 91
3.2.2 alloc_pages 95
3.2.3 __get_free_pages 96
3.2.4 get_zeroed_page 97
3.2.5 __get_dma_pages 97
3.3 slab分配器(slab allocator) 98
3.3.1 管理slab的数据结构 99
3.3.2 kmalloc与kzalloc 105
3.3.3 kmem_cache_create与kmem_cache_alloc 108
3.4 内存池(mempool) 110
3.5 虚拟内存的管理 111
3.5.1 内核虚拟地址空间构成 111
3.5.2 vmalloc与vfree 112
3.5.3 ioremap 115
3.6 per-CPU变量 115
3.6.1 静态per-CPU变量的声明与定义 116
3.6.2 静态per-CPU变量的链接脚本 117
3.6.3 setup_per_cpu_areas函数 118
3.6.4 使用per-CPU变量 121
3.7 本章小结 125
第4章 互斥与同步 127
4.1 并发的来源 127
4.2 local_irq_enable与local_irq_disable 128
4.3 自旋锁 129
4.3.1 spin_lock 130
4.3.2 spin_lock的变体 133
4.3.3 单处理器上的spin_lock函数 136
4.3.4 读取者与写入者自旋锁rwlock 137
4.4 信号量(semaphore) 141
4.4.1 信号量的定义与初始化 141
4.4.2 DOWN操作 142
4.4.3 UP操作 145
4.4.4 读取者与写入者信号量rwsem 146
4.5 互斥锁mutex 148
4.5.1 互斥锁的定义与初始化 148
4.5.2 互斥锁的DOWN操作 149
4.5.3 互斥锁的UP操作 150
4.6 顺序锁seqlock 152
4.7 RCU 155
4.7.1 读取者的RCU临界区 156
4.7.2 写入者的RCU操作 156
4.7.3 RCU使用的特点 157
4.8 原子变量与位操作 159
4.9 等待队列 162
4.9.1 等待队列头wait_queue_head_t 162
4.9.2 等待队列的节点 163
4.9.3 等待队列的应用 164
4.10 完成接口completion 164
4.11 本章小结 168
第5章 中断处理 169
5.1 中断的硬件框架 169
5.2 PIC与软件中断号 170
5.3 通用的中断处理函数 171
5.4 do_IRQ函数 172
5.5 struct irq_chip 178
5.6 struct irqaction 179
5.7 irq_set_handler 180
5.8 handle_irq_event 184
5.9 request_irq 186
5.10 中断处理的irq_thread机制 190
5.11 free_irq 191
5.12 SOFTIRQ 192
5.13 irq的自动探测 196
5.14 中断处理例程 200
5.15 中断共享 201
5.16 本章小结 202
第6章 延迟操作 203
6.1 tasklet 203
6.1.1 tasklet机制初始化 204
6.1.2 提交一个tasklet 205
6.1.3 tasklet_action 209
6.1.4 tasklet的其他操作 212
6.2 工作队列work queue 214
6.2.1 数据结构 214
6.2.2 create_singlethread_workqueue和create_workqueue 216
6.2.3 工人线程worker_thread 219
6.2.4 destroy_workqueue 221
6.2.5 提交工作节点queue_work 224
6.2.6 内核创建的工作队列 229
6.3 本章小结 230
第7章 设备文件的高级操作 231
7.1 ioctl文件操作 231
7.1.1 ioctl的系统调用 231
7.1.2 ioctl的命令编码 235
7.1.3 copy_from_user和copy_to_user 238
7.2 字符设备的I/O模型 243
7.3 同步阻塞型I/O 244
7.3.1 wait_event_interruptible 244
7.3.2 wake_up_interruptible 246
7.4 同步非阻塞型I/O 250
7.5 异步阻塞型I/O 251
7.6 异步非阻塞型I/O 258
7.7 驱动程序的fsync例程 259
7.8 fasync例程 260
7.9 llseek例程 269
7.10 访问权能 272
7.11 本章小结 273
第8章 时间管理 274
8.1 jiffies 274
8.1.1 时间比较 277
8.1.2 时间转换 278
8.2 延时操作 279
8.2.1 长延时 280
8.2.2 短延时 285
8.3 内核定时器 286
8.3.1 init_timer 289
8.3.2 add_timer 289
8.3.3 del_timer和del_timer_sync 293
8.4 本章小结 293
第9章 Linux设备驱动模型 295
9.1 sysfs文件系统 295
9.2 kobject和kset 298
9.2.1 kobject 298
9.2.2 kobject的类型属性 305
9.2.3 kset 308
9.2.4 热插拔中的uevent和call_usermodehelper 311
9.2.5 实例源码 320
9.3 总线、设备与驱动 328
9.3.1 总线及其注册 328
9.3.2 总线的属性 335
9.3.3 设备与驱动的绑定 338
9.3.4 设备 339
9.3.5 驱动 348
9.4 class 351
9.5 本章小结 355
第10章 内存映射与DMA 356
10.1 设备缓存与设备内存 356
10.2 mmap 356
10.2.1 struct vm_area_struct 357
10.2.2 用户空间虚拟地址布局 358
10.2.3 mmap系统调用过程 362
10.2.4 驱动程序中mmap方法的实现 368
10.2.5 mmap使用范例 373
10.2.6 munmap 383
10.3 DMA 384
10.3.1 内核中的DMA层 384
10.3.2 物理地址与总线地址 386
10.3.3 dma_set_mask 387
10.3.4 DMA映射 388
10.3.5 回弹缓冲区(bounce buffer) 401
10.3.6 DMA池 401
10.4 本章小结 405
第11章 块设备驱动程序 407
11.1 块子系统初始化 408
11.2 ramdisk源码实例 410
11.2.1 make_request版本的RAM DISK源码 411
11.2.2 request版本的RAM DISK源码 416
11.2.3 ramdisk的使用 420
11.3 块设备号的注册与管理 422
11.4 block_device 424
11.5 struct gendisk 425
11.6 struct hd_struct 428
11.7 用alloc_disk分配gendisk对象 428
11.8 向系统添加一个块设备add_disk 430
11.9 block_device_operations 439
11.10 块设备文件的打开 440
11.11 blk_init_queue 448
11.12 blk_queue_make_request 459
11.13 向队列提交请求 460
11.14 块设备的请求处理函数 466
11.15 bio结构 467
11.16 本章小结 472
第12章 网络设备驱动程序 473
12.1 net_device 475
12.2 网络设备的注册 488
12.3 设备方法 492
12.3.1 设备初始化 494
12.3.2 设备接口的打开与停止 495
12.3.3 数据包的发送 495
12.3.4 网络数据包发送过程中的流控机制 500
12.3.5 传输超时(watchdog timeout) 503
12.3.6 数据包的接收 506
12.4 套接字缓冲区 510
12.5 中断处理 518
12.6 NAPI 520
12.7 本章小结 522
1.1 内核模块的文件格式 2
1.2 EXPORT_SYMBOL的内核实现 5
1.3 模块的加载过程 8
1.3.1 sys_init_module(第一部分) 9
1.3.2 struct module 9
1.3.3 load_module 13
1.3.4 sys_init_module(第二部分) 49
1.3.5 模块的卸载 54
1.4 本章小结 55
第2章 字符设备驱动程序 57
2.1 应用程序与设备驱动程序互动实例 58
2.2 struct file_operations 62
2.3 字符设备的内核抽象 63
2.4 设备号的构成与分配 65
2.4.1 设备号的构成 65
2.4.2 设备号的分配与管理 66
2.5 字符设备的注册 71
2.6 设备文件节点的生成 74
2.7 字符设备文件的打开操作 77
2.8 本章小结 85
第3章 分配内存 87
3.1 物理内存的管理 87
3.1.1 内存节点node 87
3.1.2 内存区域zone 88
3.1.3 内存页 89
3.2 页面分配器(page allocator) 90
3.2.1 gfp_mask 91
3.2.2 alloc_pages 95
3.2.3 __get_free_pages 96
3.2.4 get_zeroed_page 97
3.2.5 __get_dma_pages 97
3.3 slab分配器(slab allocator) 98
3.3.1 管理slab的数据结构 99
3.3.2 kmalloc与kzalloc 105
3.3.3 kmem_cache_create与kmem_cache_alloc 108
3.4 内存池(mempool) 110
3.5 虚拟内存的管理 111
3.5.1 内核虚拟地址空间构成 111
3.5.2 vmalloc与vfree 112
3.5.3 ioremap 115
3.6 per-CPU变量 115
3.6.1 静态per-CPU变量的声明与定义 116
3.6.2 静态per-CPU变量的链接脚本 117
3.6.3 setup_per_cpu_areas函数 118
3.6.4 使用per-CPU变量 121
3.7 本章小结 125
第4章 互斥与同步 127
4.1 并发的来源 127
4.2 local_irq_enable与local_irq_disable 128
4.3 自旋锁 129
4.3.1 spin_lock 130
4.3.2 spin_lock的变体 133
4.3.3 单处理器上的spin_lock函数 136
4.3.4 读取者与写入者自旋锁rwlock 137
4.4 信号量(semaphore) 141
4.4.1 信号量的定义与初始化 141
4.4.2 DOWN操作 142
4.4.3 UP操作 145
4.4.4 读取者与写入者信号量rwsem 146
4.5 互斥锁mutex 148
4.5.1 互斥锁的定义与初始化 148
4.5.2 互斥锁的DOWN操作 149
4.5.3 互斥锁的UP操作 150
4.6 顺序锁seqlock 152
4.7 RCU 155
4.7.1 读取者的RCU临界区 156
4.7.2 写入者的RCU操作 156
4.7.3 RCU使用的特点 157
4.8 原子变量与位操作 159
4.9 等待队列 162
4.9.1 等待队列头wait_queue_head_t 162
4.9.2 等待队列的节点 163
4.9.3 等待队列的应用 164
4.10 完成接口completion 164
4.11 本章小结 168
第5章 中断处理 169
5.1 中断的硬件框架 169
5.2 PIC与软件中断号 170
5.3 通用的中断处理函数 171
5.4 do_IRQ函数 172
5.5 struct irq_chip 178
5.6 struct irqaction 179
5.7 irq_set_handler 180
5.8 handle_irq_event 184
5.9 request_irq 186
5.10 中断处理的irq_thread机制 190
5.11 free_irq 191
5.12 SOFTIRQ 192
5.13 irq的自动探测 196
5.14 中断处理例程 200
5.15 中断共享 201
5.16 本章小结 202
第6章 延迟操作 203
6.1 tasklet 203
6.1.1 tasklet机制初始化 204
6.1.2 提交一个tasklet 205
6.1.3 tasklet_action 209
6.1.4 tasklet的其他操作 212
6.2 工作队列work queue 214
6.2.1 数据结构 214
6.2.2 create_singlethread_workqueue和create_workqueue 216
6.2.3 工人线程worker_thread 219
6.2.4 destroy_workqueue 221
6.2.5 提交工作节点queue_work 224
6.2.6 内核创建的工作队列 229
6.3 本章小结 230
第7章 设备文件的高级操作 231
7.1 ioctl文件操作 231
7.1.1 ioctl的系统调用 231
7.1.2 ioctl的命令编码 235
7.1.3 copy_from_user和copy_to_user 238
7.2 字符设备的I/O模型 243
7.3 同步阻塞型I/O 244
7.3.1 wait_event_interruptible 244
7.3.2 wake_up_interruptible 246
7.4 同步非阻塞型I/O 250
7.5 异步阻塞型I/O 251
7.6 异步非阻塞型I/O 258
7.7 驱动程序的fsync例程 259
7.8 fasync例程 260
7.9 llseek例程 269
7.10 访问权能 272
7.11 本章小结 273
第8章 时间管理 274
8.1 jiffies 274
8.1.1 时间比较 277
8.1.2 时间转换 278
8.2 延时操作 279
8.2.1 长延时 280
8.2.2 短延时 285
8.3 内核定时器 286
8.3.1 init_timer 289
8.3.2 add_timer 289
8.3.3 del_timer和del_timer_sync 293
8.4 本章小结 293
第9章 Linux设备驱动模型 295
9.1 sysfs文件系统 295
9.2 kobject和kset 298
9.2.1 kobject 298
9.2.2 kobject的类型属性 305
9.2.3 kset 308
9.2.4 热插拔中的uevent和call_usermodehelper 311
9.2.5 实例源码 320
9.3 总线、设备与驱动 328
9.3.1 总线及其注册 328
9.3.2 总线的属性 335
9.3.3 设备与驱动的绑定 338
9.3.4 设备 339
9.3.5 驱动 348
9.4 class 351
9.5 本章小结 355
第10章 内存映射与DMA 356
10.1 设备缓存与设备内存 356
10.2 mmap 356
10.2.1 struct vm_area_struct 357
10.2.2 用户空间虚拟地址布局 358
10.2.3 mmap系统调用过程 362
10.2.4 驱动程序中mmap方法的实现 368
10.2.5 mmap使用范例 373
10.2.6 munmap 383
10.3 DMA 384
10.3.1 内核中的DMA层 384
10.3.2 物理地址与总线地址 386
10.3.3 dma_set_mask 387
10.3.4 DMA映射 388
10.3.5 回弹缓冲区(bounce buffer) 401
10.3.6 DMA池 401
10.4 本章小结 405
第11章 块设备驱动程序 407
11.1 块子系统初始化 408
11.2 ramdisk源码实例 410
11.2.1 make_request版本的RAM DISK源码 411
11.2.2 request版本的RAM DISK源码 416
11.2.3 ramdisk的使用 420
11.3 块设备号的注册与管理 422
11.4 block_device 424
11.5 struct gendisk 425
11.6 struct hd_struct 428
11.7 用alloc_disk分配gendisk对象 428
11.8 向系统添加一个块设备add_disk 430
11.9 block_device_operations 439
11.10 块设备文件的打开 440
11.11 blk_init_queue 448
11.12 blk_queue_make_request 459
11.13 向队列提交请求 460
11.14 块设备的请求处理函数 466
11.15 bio结构 467
11.16 本章小结 472
第12章 网络设备驱动程序 473
12.1 net_device 475
12.2 网络设备的注册 488
12.3 设备方法 492
12.3.1 设备初始化 494
12.3.2 设备接口的打开与停止 495
12.3.3 数据包的发送 495
12.3.4 网络数据包发送过程中的流控机制 500
12.3.5 传输超时(watchdog timeout) 503
12.3.6 数据包的接收 506
12.4 套接字缓冲区 510
12.5 中断处理 518
12.6 NAPI 520
12.7 本章小结 522