Linux设备驱动程序第三版学习(2)-字符设备驱动程序源码分析(续)

前段时间一直在搞GPS导航系统的应用软件,最近告一段落,继续捡起linux设备驱动,啃之!

上次记录了模块初始化代码的学习,今次看看卸载模块的代码。

 

看一下scull_trim

/*

* Empty out the scull device; must be called with the device

* semaphore held.

*/

该函数的作用很简单:遍历整个数据区,释放所有找到的量子和量子集。内容也很简单,不解释。

 

  

SCULL设备驱动程序实现了几个最重要的设备方法。如下file_operations结构

这些方法都要驱动程序设计者自己来实现的,每个设备驱动程序都需要设计者来实现这几个方法。
例如驱动程序使用者对open的调用将会调用scull_open函数。我认为这里可以理解为所有驱动程序的接口都是相同的,只是内部实现不同。
关于open和release方法的作用参考书中page62, page63。
read和write方法的原型如下:
ssize_t read(stuct file *filp, char _ _user *buff, size_t count, loff_t offp);
ssize_t write(struct file * filp, const char _ _user *buff, size_t count, loff_t *offp);
这两个方法的实质就是数据拷贝。read方法拷贝数据到用户地址空间,write方法拷贝数据到内核地址空间。实现这两种拷贝用到的内核函数如下(是大多数read和write方法实现的核心部分):
unsigned long copy_to_user(void _ _user *to, const void *from, unsigned long count);
unsigned long copy_from_user(void *to, const void _ _user *from, unsigned long count);

分析一下scull的open方法:


分析一下scull的release方法:基本的scull没有需要关闭的硬件,因此直接返回。


分析一下scull的read方法:

你可能感兴趣的:(linux)