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

深入Linux设备驱动程序内核机制
作 者: 陈学松
出版社: 电子工业出版社
丛编项:
版权说明: 本书为公共版权或经版权方授权,请支持正版图书
标 签: LINUX
ISBN 出版时间 包装 开本 页数 字数
未知 暂无 暂无 未知 0 暂无

作者简介

  陈学松,曾任职于Intel,Marvell等半导体公司,9年以上Linux内核、设备驱动程序、嵌入式LinuxBSP等领域的开发经验。专注于Linux系统内核、BIOS、文件系统及软件虚拟化等技术,曾模仿Linux内核编写过微型操作系统。工作之余喜欢以文章的形式将自己的学习心得进行总结,善于运用图形等元素将复杂概念具体化,梳理脉络而不拘于细节。05年在IBMLinux开发者论坛所发表的《解析Linux中的VFS文件系统机制》则堪称作者这一写作特色的代表之作,该文发表后曾被多家技术网站、论坛及个人博客所转载。喜欢游泳,四肢发达,胸无城府。古文功底颇深,少时涉猎甚广,现在则主要阅读一些历史题材类的书籍,熟读《三国志》。目前任职于AMD上海研发中心,主要从事Linux显卡驱动等领域的研发工作。

内容简介

内 容 简 介这是一本系统阐述Linux设备驱动程序技术内幕的专业书籍,它的侧重点不是讨论如何在Linux系统下编写设备驱动程序,而是要告诉读者隐藏在这些设备驱动程序背后的那些内核机制及原理。作者通过对Linux内核源码抽丝剥茧般的解读,再辅之以精心设计的大量图片,使读者在阅读完本书后对驱动程序前台所展现出来的那些行为特点变得豁然开朗。本书涵盖了编写设备驱动程序所需要的几乎所有的内核设施,比如内核模块、中断处理、互斥与同步、内存分配、延迟操作、时间管理,以及新设备驱动模型等内容。为了避免读者迷失在某一技术细节的讨论当中,本书在一个比较高的层面上进行展开,以一种先框架再细节的结构安排极大地简化了读者的阅读与学习。本书不仅适合那些在Linux系统下从事设备驱动程序开发的专业技术人员阅读,也同样适合有志于从事Linux设备驱动程序开发或对Linux设备驱动程序及Linux内核感兴趣的在校学生等阅读。对于没有任何Linux设备驱动程序开发经验的初学者,建议先阅读那些讨论“如何”在Linux系统下编写设备驱动程序的入门书籍,然后再阅读本书来理解“为什么”要以这样或者那样的方式来编写设备驱动程序。

图书目录

录第1章

内核模块

内核模块的文件格式

EXPORT_SYMBOL的内核实现

模块的加载过程

81.3.1

sys_init_module(第一部分)

91.3.2

structmodule

91.3.3

load_module

131.3.4

sys_init_module(第二部分)

491.3.5

模块的卸载

本章小结

55第2章

字符设备驱动程序

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

structfile_operations

字符设备的内核抽象

设备号的构成与分配

652.4.1

设备号的构成

652.4.2

设备号的分配与管理

字符设备的注册

设备文件节点的生成

字符设备文件的打开操作

本章小结

85第3章

分配内存

物理内存的管理

873.1.1

内存节点node

873.1.2

内存区域zone

883.1.3

内存页

页面分配器(pageallocator)

903.2.1

gfp_mask

913.2.2

alloc_pages

953.2.3

__get_free_pages

963.2.4

get_zeroed_page

973.2.5

__get_dma_pages

slab分配器(slaballocator)

983.3.1

管理slab的数据结构

993.3.2

kmalloc与kzalloc

1053.3.3

kmem_cache_create与kmem_cache_alloc

内存池(mempool)

虚拟内存的管理

1113.5.1

内核虚拟地址空间构成

1113.5.2

vmalloc与vfree

1123.5.3

ioremap

per-CPU变量

1153.6.1

静态per-CPU变量的声明与定义

1163.6.2

静态per-CPU变量的链接脚本

1173.6.3

setup_per_cpu_areas函数

1183.6.4

使用per-CPU变量

本章小结

125第4章

互斥与同步

并发的来源

local_irq_enable与local_irq_disable

自旋锁

1294.3.1

spin_lock

1304.3.2

spin_lock的变体

1334.3.3

单处理器上的spin_lock函数

1364.3.4

读取者与写入者自旋锁rwlock

信号量(semaphore)

1414.4.1

信号量的定义与初始化

1414.4.2

DOWN操作

1424.4.3

UP操作

1454.4.4

读取者与写入者信号量rwsem

互斥锁mutex

1484.5.1

互斥锁的定义与初始化

1484.5.2

互斥锁的DOWN操作

1494.5.3

互斥锁的UP操作

顺序锁seqlock

RCU

1554.7.1

读取者的RCU临界区

1564.7.2

写入者的RCU操作

1564.7.3

RCU使用的特点

原子变量与位操作

等待队列

1624.9.1

等待队列头wait_queue_head_t

1624.9.2

等待队列的节点

1634.9.3

等待队列的应用

完成接口completion

本章小结

168第5章

中断处理

中断的硬件框架

PIC与软件中断号

通用的中断处理函数

do_IRQ函数

structirq_chip

structirqaction

irq_set_handler

handle_irq_event

request_irq

中断处理的irq_thread机制

free_irq

SOFTIRQ

irq的自动探测

中断处理例程

中断共享

本章小结

202第6章

延迟操作

tasklet

2036.1.1

tasklet机制初始化

2046.1.2

提交一个tasklet2056.1.3

tasklet_action

2096.1.4

tasklet的其他操作

工作队列workqueue

2146.2.1

数据结构

2146.2.2

create_singlethread_workqueue和create_workqueue

2166.2.3

工人线程worker_thread

2196.2.4

destroy_workqueue

2216.2.5

提交工作节点queue_work

2246.2.6

内核创建的工作队列

本章小结

230第7章

设备文件的高级操作

ioctl文件操作

2317.1.1

ioctl的系统调用

2317.1.2

ioctl的命令编码

2357.1.3

copy_from_user和copy_to_user

字符设备的I/O模型

同步阻塞型I/O

2447.3.1

wait_event_interruptible

2447.3.2

wake_up_interruptible

同步非阻塞型I/O2507.5

异步阻塞型I/O

异步非阻塞型I/O2587.7

驱动程序的fsync例程2597.8

fasync例程

llseek例程

访问权能

本章小结

273第8章

时间管理

jiffies

2748.1.1

时间比较

2778.1.2

时间转换

延时操作

2798.2.1

长延时

2808.2.2

短延时

内核定时器

2868.3.1

init_timer

2898.3.2

add_timer

2898.3.3

del_timer和del_timer_sync

本章小结

293第9章

Linux设备驱动模型

sysfs文件系统

kobject和kset

2989.2.1

kobject

2989.2.2

kobject的类型属性

3059.2.3

kset

3089.2.4

热插拔中的uevent和call_usermodehelper

3119.2.5

实例源码

总线、设备与驱动

3289.3.1

总线及其注册

3289.3.2

总线的属性

3359.3.3

设备与驱动的绑定

3389.3.4

设备

3399.3.5

驱动

class

本章小结

355第10章

内存映射与DMA

设备缓存与设备内存

mmap

35610.2.1

structvm_area_struct

35710.2.2

用户空间虚拟地址布局

35810.2.3

mmap系统调用过程

36210.2.4

驱动程序中mmap方法的实现

36810.2.5

mmap使用范例

37310.2.6

munmap

DMA

38410.3.1

内核中的DMA层

38410.3.2

物理地址与总线地址

38610.3.3

dma_set_mask

38710.3.4

DMA映射

38810.3.5

回弹缓冲区(bouncebuffer)

40110.3.6

DMA池

本章小结

405第11章

块设备驱动程序

块子系统初始化

ramdisk源码实例

41011.2.1

make_request版本的RAMDISK源码

41111.2.2

request版本的RAMDISK源码

41611.2.3

ramdisk的使用

块设备号的注册与管理

block_device

structgendisk

structhd_struct

用alloc_disk分配gendisk对象42811.8

向系统添加一个块设备add_disk

block_device_operations

块设备文件的打开

blk_init_queue

blk_queue_make_request

向队列提交请求

块设备的请求处理函数

bio结构

本章小结

472第12章

网络设备驱动程序

net_device

网络设备的注册

设备方法

49212.3.1

设备初始化

49412.3.2

设备接口的打开与停止

49512.3.3

数据包的发送

49512.3.4

网络数据包发送过程中的流控机制

50012.3.5

传输超时(watchdogtimeout)

50312.3.6

数据包的接收

套接字缓冲区

中断处理

NAPI

本章小结