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
提供模块参数,但是这需要在驱动源代码中加入几条语句,让模块
相关文档:
虽然mplayer的安装方法已经不是什么技术活,但最近有不少同学在询问我关于mplayer的安装方法的问题。我一贯推荐它们源代码包的安装,虽然步骤有些复杂,但解码器和二进制程序都尽在掌握,心里踏实。
===
1
下载如下这些软件:
all-20071007.tar.bz2
windows-all-20071007.zip
Blue-1.7.tar.bz2
MPlayer-1.0rc2.ta ......
Linux源码安装Subversion
先从subversion的官方网站下载源码,subversion.apache.org
解压开到subversion-xxx 然后configure
然后一般就是找不到某某库的错误,以下说明
1.找不到sqlite3
从sqlite网站上下载sqlite3的源码,然后把sqlite3.c拷贝到 subversion-xxx/sqlite-amalgamation/sqlite3.c
2.找不到apr
......
; break;
}
if (type != EV_SYN)
&nbs ......
曾做过signal相关的一点儿开发,谈谈我的一些理解。
首先,需要理解几个signal相关的函数。
sigaddset(sigset_t* sigSet, int sigNum ) : 将信号sigNum 添加到信号集 sigSet 中;
sigdelset(sigset_t* sigSet, int sigNum) : 将信号 sigNum 从信号集 sigSet 中删除;
......
-----------------------------
Based on Fedora 8 version:
-----------------------------
1. No common command like ifconfig in os?
Root cause is the standard search path not include /sbin and /usr/sbin. Try to include them in /etc/profile. As belows:
#Kenny add /sbin and /usr/sbin here.
&n ......