深入Linux设备驱动程序内核机制

深入Linux设备驱动程序内核机制

 

基本信息

  • 作者: 陈学松   
  • 出版社:电子工业出版社
  • ISBN:9787121150524
  • 上架时间:2012-2-6
  • 出版日期:2012 年1月

http://product.china-pub.com/198916

内容简介

<!--更改-->
  这是一本系统阐述linux设备驱动程序技术内幕的专业书籍,它的侧重点不是讨论如何在linux系统下编写设备驱动程序,而是要告诉读者隐藏在这些设备驱动程序背后的那些内核机制及原理。作者通过对linux内核源码抽丝剥茧般的解读,再辅之以精心设计的大量图片,使读者在阅读完本书后对驱动程序前台所展现出来的那些行为特点变得豁然开朗。

《深入linux设备驱动程序内核机制》涵盖了编写设备驱动程序所需要的几乎所有的内核设施,比如内核模块、中断处理、互斥与同步、内存分配、延迟操作、时间管理,以及新设备驱动模型等内容。为了避免读者迷失在某一技术细节的讨论当中,本书在一个比较高的层面上进行展开,以一种先框架再细节的结构安排极大地简化了读者的阅读与学习。

  《深入linux设备驱动程序内核机制》不仅适合那些在linux系统下从事设备驱动程序开发的专业技术人员阅读,也同样适合有志于从事linux设备驱动程序开发或对linux设备驱动程序及linux内核感兴趣的在校学生等阅读。对于没有任何linux设备驱动程序开发经验的初学者,建议先阅读那些讨论“如何”在linux系统下编写设备驱动程序的入门书籍,然后再阅读本书来理解“为什么”要以这样或者那样的方式来编写设备驱动程序。

目录

《深入linux设备驱动程序内核机制》

第1章内核模块1

1.1内核模块的文件格式2

1.2export_symbol的内核实现5

1.3模块的加载过程8

1.3.1sys_init_module(第一部分)9

1.3.2structmodule9

1.3.3load_module13

1.3.4sys_init_module(第二部分)49

1.3.5模块的卸载54

1.4本章小结55

第2章字符设备驱动程序57

2.1应用程序与设备驱动程序互动实例58

2.2structfile_operations62

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内存节点node87

3.1.2内存区域zone88

3.1.3内存页89

3.2页面分配器(pageallocator)90

3.2.1gfp_mask91

3.2.2alloc_pages95

3.2.3__get_free_pages96

3.2.4get_zeroed_page97

3.2.5__get_dma_pages97

3.3slab分配器(slaballocator)98

3.3.1管理slab的数据结构99

3.3.2kmalloc与kzalloc105

3.3.3kmem_cache_create与kmem_cache_alloc108

3.4内存池(mempool)110

3.5虚拟内存的管理111

3.5.1内核虚拟地址空间构成111

3.5.2vmalloc与vfree112

3.5.3ioremap115

3.6per-cpu变量115

3.6.1静态per-cpu变量的声明与定义116

3.6.2静态per-cpu变量的链接脚本117

3.6.3setup_per_cpu_areas函数118

3.6.4使用per-cpu变量121

3.7本章小结125

第4章互斥与同步127

4.1并发的来源127

4.2local_irq_enable与local_irq_disable128

4.3自旋锁129

4.3.1spin_lock130

4.3.2spin_lock的变体133

4.3.3单处理器上的spin_lock函数136

4.3.4读取者与写入者自旋锁rwlock137

4.4信号量(semaphore)141

4.4.1信号量的定义与初始化141

4.4.2down操作142

4.4.3up操作145

4.4.4读取者与写入者信号量rwsem146

4.5互斥锁mutex148

4.5.1互斥锁的定义与初始化148

4.5.2互斥锁的down操作149

4.5.3互斥锁的up操作150

4.6顺序锁seqlock152

4.7rcu155

4.7.1读取者的rcu临界区156

4.7.2写入者的rcu操作156

4.7.3rcu使用的特点157

4.8原子变量与位操作159

4.9等待队列162

4.9.1等待队列头wait_queue_head_t162

4.9.2等待队列的节点163

4.9.3等待队列的应用164

4.10完成接口completion164

4.11本章小结168

第5章中断处理169

5.1中断的硬件框架169

5.2pic与软件中断号170

5.3通用的中断处理函数171

5.4do_irq函数172

5.5structirq_chip178

5.6structirqaction179

5.7irq_set_handler180

5.8handle_irq_event184

5.9request_irq186

5.10中断处理的irq_thread机制190

5.11free_irq191

5.12softirq192

5.13irq的自动探测196

5.14中断处理例程200

5.15中断共享201

5.16本章小结202

第6章延迟操作203

6.1tasklet203

6.1.1tasklet机制初始化204

6.1.2提交一个tasklet205

6.1.3tasklet_action209

6.1.4tasklet的其他操作212

6.2工作队列workqueue214

6.2.1数据结构214

6.2.2create_singlethread_workqueue和create_workqueue216

6.2.3工人线程worker_thread219

6.2.4destroy_workqueue221

6.2.5提交工作节点queue_work224

6.2.6内核创建的工作队列229

6.3本章小结230

第7章设备文件的高级操作231

7.1ioctl文件操作231

7.1.1ioctl的系统调用231

7.1.2ioctl的命令编码235

7.1.3copy_from_user和copy_to_user238

7.2字符设备的i/o模型243

7.3同步阻塞型i/o244

7.3.1wait_event_interruptible244

7.3.2wake_up_interruptible246

7.4同步非阻塞型i/o250

7.5异步阻塞型i/o251

7.6异步非阻塞型i/o258

7.7驱动程序的fsync例程259

7.8fasync例程260

7.9llseek例程269

7.10访问权能272

7.11本章小结273

第8章时间管理274

8.1jiffies274

8.1.1时间比较277

8.1.2时间转换278

8.2延时操作279

8.2.1长延时280

8.2.2短延时285

8.3内核定时器286

8.3.1init_timer289

8.3.2add_timer289

8.3.3del_timer和del_timer_sync293

8.4本章小结293

第9章linux设备驱动模型295

9.1sysfs文件系统295

9.2kobject和kset298

9.2.1kobject298

9.2.2kobject的类型属性305

9.2.3kset308

9.2.4热插拔中的uevent和call_usermodehelper311

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.4class351

9.5本章小结355

第10章内存映射与dma356

10.1设备缓存与设备内存356

10.2mmap356

10.2.1structvm_area_struct357

10.2.2用户空间虚拟地址布局358

10.2.3mmap系统调用过程362

10.2.4驱动程序中mmap方法的实现368

10.2.5mmap使用范例373

10.2.6munmap383

10.3dma384

10.3.1内核中的dma层384

10.3.2物理地址与总线地址386

10.3.3dma_set_mask387

10.3.4dma映射388

10.3.5回弹缓冲区(bouncebuffer)401

10.3.6dma池401

10.4本章小结405

第11章块设备驱动程序407

11.1块子系统初始化408

11.2ramdisk源码实例410

11.2.1make_request版本的ramdisk源码411

11.2.2request版本的ramdisk源码416

11.2.3ramdisk的使用420

11.3块设备号的注册与管理422

11.4block_device424

11.5structgendisk425

11.6structhd_struct428

11.7用alloc_disk分配gendisk对象428

11.8向系统添加一个块设备add_disk430

11.9block_device_operations439

11.10块设备文件的打开440

11.11blk_init_queue448

11.12blk_queue_make_request459

11.13向队列提交请求460

11.14块设备的请求处理函数466

11.15bio结构467

11.16本章小结472

第12章网络设备驱动程序473

12.1net_device475

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传输超时(watchdogtimeout)503

12.3.6数据包的接收506

12.4套接字缓冲区510

12.5中断处理518

12.6napi520

12.7本章小结522

相关推荐