英文第三版 http://books.google.com/books?id=M7RHMACEkg4C&printsec=frontcover#v=onepage&q&f=false
01章 An Introduction to Device Drivers
驱动的角色
policy: how to use capability Gnome ftp http
mechanism: what to be provided X Serv TCP/IP
内核介绍:任务,内存,文件管理,驱动,网络
模块:char module:open, close, read, and write system calls
block module
network module.
安全与版本
02章 Building and Running Modules
2.1建立纯净的内核环境
2.2helloworld,注意makefile的写法:
2.3驱动和应用程序的区别:初始化与退出,只能调用内核函数,不调用库,唯一的例外是头文件<stdarg.h>,内核函数定义在内核源码树linux/include下
用户空间和内核空间
内核并发:获取当前进程current <linux/sched.h>
一些细节:由于内核栈很小(4096B),需要自己申请内存,不支持浮点运算
2.4编译和加载
讲解helloworld的makefile
装载卸载模块 insmod=ld 注意kernel/module.c中为insmod安排内存,调用模块并初始化
sys_为系统调用前缀
lsmod =cat /proc//modules =ls /sys/module
版本依赖 必须为每个内核树重新编译,否则helloworld也会出错。vermagic.o检查是否match
简介version.h里面的宏
平台依赖 vermagic.o
2.5 内核符号表 其他模块可使用新模块输出的变量,由此形成模块堆叠(module stack),如USB驱动都在usbcore的基础上
2.6预备知识 #include <linux/module.h> <linux/init.h> //向模块传递参数<linux/moduleparam.h>
MODULE_AUTHOR,MODULE_DESCRIPTION,MODULE_VERSION,MODULE_ALIAS,MODULE_DEVICE_TABLE
2.7初始化和退出
声明static int __init functionA(void) //加static,这样模块外就不可见
module_init(initialization_function); //定义初始化函数
退出:static void __exit functionB(void)
module_exit(cleanup_function);
初始化时的错误处理:goto语句的使用,错误处理函数
2.8模块参数 加入参数
antique@debian~:#insmod hello.ko howmany=5 whom="hello "
2.9 用户模式(非内核模式)驱动:优点和缺点,如可使用库,不受内核栈限制
03章 Char Drivers
3.1 scull设计 几种类型的驱动,本章讨论scull0-3,后文讨论scullpipe与scull的其他访问控制类型
3.2 major&minor编号
3.2.1 设备编号的内部表示 <linux/types.h> dev_t get/set major&minor
3.2.2 申请和释放设备编号
3.2.3 major的动态分配 alloc_chrdev_region 使用bash脚本,使用动态分配,但留有更改major的选项,如通过insmod传递参数,更改宏定义
3.3 一些数据结构<linux/fs.h> file_operations,file,node
3.3.1 文件操作 解释file_operations的定义
3.3.2 文件结构 file的定义
3.3.3 inode结构
3.4字符设备注册 <linux/cdev.h> cdev的初始化操作
3.4.1 scull的设备注册
3.4.2 老方法
3.5open&release
3.5.1 自定义的device_open
3.5.2 自定义的device_release/close
3.6 scull的内存使用<linux/slab.h>
*kmalloc和 kfree ,更好的内存分配方法参见08章节
3.7 read&write readv&writev
用户态:read
copy_to_user/copy_from_user
3.8 使用新设备
如何测试scull
本文详细介绍Linux环境下驱动开发的基础知识,包括驱动的角色与功能、模块编写与运行、字符设备的实现等。文章通过实例代码讲解了helloworld模块的创建过程,并探讨了用户模式驱动的优缺点。

被折叠的 条评论
为什么被折叠?



