网上购物 货比三家
您现在的位置:快乐比价网 > 图书 > 计算机与网络 > 操作系统 > 商品详情

深入Linux设备驱动程序内核机制 预售商品

分享到:
深入Linux设备驱动程序内核机制 预售商品

最 低 价:¥68.60

定 价:¥98.00

作 者:陈学松 著

出 版 社:电子工业出版社

出版时间:2012-1-8

I S B N:9787121150524

商品详情

编辑推荐

这不是一本单纯的关于Linux设备驱动程序入门的书。它是给有一定的Linux设备驱动程序编写经验并且对众多Linux底层设备驱动内幕机制感兴趣的读者量身定制的。与市面上已经出版的Linux相关方面的图书的不同之处在于,本书并不着重于全面描述Linux内核,也不只是简单地告诉你如何去写一个Linux下的设备驱动程序。它是从设备驱动程序的视角出发,深入到Linux内核去剖析那些和驱动程序实现机制密切相关的技术内幕。比如让你理解为什么在这个地方驱动程序应该使用work queue而不是tasklet,为什么在中断处理例程里应该使用spin_lock而不是mutex_lock……因为只有当你对驱动程序中使用的各种内核实现有了清晰的认识,你才能在日常的工作当中随心所欲地驾驭它们,写出更高性能更安全的代码。知其然,更知其所以然,对于沉迷于技术领域的人而言,这种不断探索的好奇心是对技术工作能长期保持热情的一个基本特质。相对于市面上已经出版的相关书籍而言,本书具有以下两个鲜明的特色:

细节揭秘

目前市场上已经出版的Linux内核和驱动程序方面的书籍,大体上可分为两种。一种是侧重于内核本身,鉴于目前Linux的内核源码已经十分庞大,这些讲解内核的书有些本身非常全面,作者的写作态度也非常严谨,比如Deep Understanding Linux Kernel,还有新近出版的Professional Linux Kernel Architecture,后者几乎涵盖了新版Linux内核中绝大部分重要的构件,但也正因如此,这样的书籍就不可能在与驱动程序相关的机制上留下太多笔墨。另外还有一种是专门讲解Linux驱动方面的书籍,典型的有Linux Device DriverEssential Linux Device Driver。这些书着重于介绍Linux驱动的基本概念和架构,但是对于想了解更多幕后的技术细节的读者来说,《深入Linux设备驱动程序内核机制》一书可提供更详细的资源和帮助。通常当你想深入理解一些一般书籍没有描述的机制时,你可能会采用在线搜索或查看源码的方式,但有时这不仅费时也未必能得到满意的答案。本书提供了另一途径让你更系统、有效地理解这些内核机制。我相信对于广大忙于在校学习、职场深造或课题攻关的读者来说,本书可提供很多有益的帮助。

图片说理

这本书另外一个很大的特点是,作者大量使用其精心设计的图片来帮助你清晰地理解一些复杂的概念、流程和架构。这在中文版原创的图书中是很难能可贵的,相对而言外文书在这方面做得就要好很多。形象直观的图片胜过大量的文字,也能节省读者大量的时间。可以看到,本书的作者在这一方面做了很大的努力去加以完善,在我看来,这是一个非常好的尝试。本书作者当前正在AMD上海研发中心从事Linux显卡驱动等系统软件方面的研发工作,能在繁忙的工作之余,通过对自己学习和实践经验的总结写下这样一本书,对增进国内读者的 Linux 系统开发能力将起到很大的作用。我相信,如果作者有足够的时间与精力的话,这本书还可以进一步完善,包括在某些技术方面可以有更精细的描述。

AMD图形软件架构师  PMTS  俞辉

2011824日于加拿大

内容简介

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

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

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

作者简介

陈学松,曾任职于Intel,Marvell等半导体公司,9年以上Linux内核、设备驱动程序、嵌入式Linux BSP等领域的开发经验。专注于Linux系统内核、BIOS、文件系统及软件虚拟化等技术,曾模仿Linux内核编写过微型操作系统。工作之余喜欢以文章的形式将自己的学习心得进行总结,善于运用图形等元素将复杂概念具体化,梳理脉络而不拘于细节。05年在IBM Linux开发者论坛所发表的《解析Linux中的VFS文件系统机制》则堪称作者这一写作特色的代表之作,该文发表后曾被多家技术网站、论坛及个人博客所转载。

喜欢游泳,四肢发达,胸无城府。古文功底颇深,少时涉猎甚广,现在则主要阅读一些历史题材类的书籍,熟读《三国志》。目前任职于AMD上海研发中心,主要从事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  kmallockzalloc     105

3.3.3  kmem_cache_createkmem_cache_alloc      108

3.4  内存池(mempool   110

3.5  虚拟内存的管理   111

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

3.5.2  vmallocvfree 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_enablelocal_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_workqueuecreate_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_usercopy_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_timerdel_timer_sync     293

8.4  本章小结      293

9  Linux设备驱动模型     295

9.1  sysfs文件系统      295

9.2  kobjectkset      298

9.2.1  kobject       298

9.2.2  kobject的类型属性   305

9.2.3  kset     308

9.2.4  热插拔中的ueventcall_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

商品评论(0条)

暂无评论!

您的浏览历史

loading 内容加载中,请稍后...