Linux Device Drivers读书笔记01-03章

本文详细介绍Linux环境下驱动开发的基础知识,包括驱动的角色与功能、模块编写与运行、字符设备的实现等。文章通过实例代码讲解了helloworld模块的创建过程,并探讨了用户模式驱动的优缺点。

英文第三版 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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值