Linux 2.6 字符设备驱动程序
○
、说明
笔记适用于
Linux
的
2.6.10
以后的内核。
笔记以
Linux
Device
Driver3
提供的
scull
程序
(scull
目录中的
main.c
和
scull.h)
为记录主线,并以该驱动程序中的各种系统调用和函数调用流程为记
录顺序。比如,
module_init( )
和
module_exit(
)
为相对应的一对系统调用,一般书籍中都会放在一起讨论,但是本笔记却不会这样,而是在需要调用的时候才会涉及,因此
module_init(
)
会放在笔记开始时,也就是刚加载
module
时讨论,而
module_exit( )
则会放在笔记结束前,也就是要卸载
module
时再加以讨论。
该笔记的的目的是为了对
Linux Device Drvier3
中提到的各个知识点作一下整理,理清一下头绪,从而能让我对
Linux
驱动程序加深整体或者全局上的理解。
注:个人理解,有误难免!
*******************************************
驱动程序
module
的工作流程主要分为四个部分:
1
、
用
Linux
提供的命令加载驱动
module
2
、
驱动
module
的初始化(初始化结束后即进入
“
潜伏
”
状态,直到有系统调用)
3
、
当操作设备时,即有系统调用时,调用驱动
module
提供的各个服务函数
4
、
卸载驱动
module
一、
驱动程序的加载
Linux
驱动程序分为两种形式:一种是直接编译进内核,另一种是编译成
module
形式,然后在需要该驱动
module
时手动加载。对于前者,还有待学习。
Module
形式的驱动,
Linux
提供了两个命令用来加载:
modprobe
和
insmod
。
其
中
modprobe
可以解决驱动
module
的依赖性,即假如正加载的驱动
module
若引用了其他
module
提供的内核符号或者其他资源,则
modprobe
就会自动加载那些
module
,不过,使用
modprobe
时,必须把要加载的驱动
module
放在当前模块搜索路径中。而
insmod
命令不会考虑驱动
module
的依赖性,但是它却可以加载任意目录下的驱动
module
。
一般来说,在驱动开发阶段,使用
/sbin/insmod
比较方便,因为不用将
module
放入当前
module
搜索路径中。
一旦使用
insmod
加载模块,则
Linux
内核就会调用
module_init(scull_init_module)
特殊宏,其中
scull_init_module
是驱动初始化函数,可自定义名称。
在用
insmod
加载
module
时,还可以给
module
提供模块参数,但是这需要在驱动源代码中加入几条语句,让模块
相关文档:
虽然学过
Linux Shell
编程,但由于编写
Shell
脚本的机会实在是比较少
(
通常在项目初期搭建开发环境时编写得比较
多一些
)
,所以一
些语法久而久之就会忘了,一个简单的语法去翻书效率实在是慢,所以就个人整理了一个表格,由于我用的编程语言是
C/C++
,所以在编程的时候往往脑海里面首
先浮现的是用
C
......
说明:本文以主要为转载内容,同时加入了我在使用过程中遇到问题对其的修正!!!!!!!!!
先说statfs结构:
#include <sys/vfs.h> /* 或者 <sys/statfs.h> */
int statfs(const char *path, struct statfs *buf);
int fstatfs(int fd, struct statfs *buf);
参数: ......
曾做过signal相关的一点儿开发,谈谈我的一些理解。
首先,需要理解几个signal相关的函数。
sigaddset(sigset_t* sigSet, int sigNum ) : 将信号sigNum 添加到信号集 sigSet 中;
sigdelset(sigset_t* sigSet, int sigNum) : 将信号 sigNum 从信号集 sigSet 中删除;
......
此文于2010-02-26被推荐到CSDN首页
如何被推荐?
最近在研究 Linux
内核的时间子系统,为下一篇长文《服务器程序中的日期与时间》做准备,无意中注意到了 Linux
新增的几个系统调用的对编写服务器代码的影响,先大致记录在这里。这篇博客也可算作前一篇《多线
程服务器的常用编程模型》
的一个注脚。
< type="te ......