scull驱动学习!
来源:互联网 发布:云盘搬家软件 编辑:程序博客网 时间:2024/06/10 07:42
《Linux设备设备驱动程序(第三版)》学习笔记之一:
scull设备的使用
By:
吴垠
Date:
2007-07-05
Email:
lazy.fox.wu#gmail.com
Homepage:
http://blog.csdn.net/wooin
Copyright:
该文章版权由吴垠所有。可在非商业目的下任意传播和复制。
对于商业目的下对本文的任何行为需经作者同意。
联系方式:lazy.fox.wu#gmail.com
1.
写在前面:
a.
在进行下面的工作之前请先阅读我 的文章《在 Linux 2.6内核下编译可以加载的内核模块》,配 置好可加载内核模块的Linux环境
b.
下载《Linux设备设备驱动程序(第三版)》配套的源代 码,在这里可 以下载到,如果无法下载的话可以留言或者给我发邮件索取。
c.
本文的工作环境是Fedora Core 5,用“uname -r”查看内核版本是:2.6.15-1.2054_FC5
d.
本文主要针对的是《Linux设备设备驱动程序(第三 版)》中第三章:字符设备驱动程序
e.
下文的有些操作需要root权限,所以请尽量用root用 户来执行命令。
2.
源代码包解压后进入scull文件夹,其中的文件有:
access.c
main.c
主程序,scull设备的初始化、卸载、open、 write等实现都在这里面。
Makefile
pipe.c
第六章《高级字符驱动程序操作》会用到,用来讲解阻塞型设 备。
scull.h
头文件
scull.init
scull_load
加载scull模块的脚本
scull_unload
卸载scull模块的脚本
3.
直接在scull目录下运行make命令就可以编译通过,会生成一个叫scull.ko的文件,然后运行脚本scull_load, 没有任何输出就返回了,scull设备就会自动加载到内核当中去了,此时可以通过查看/proc/devices文件找到刚加载的scull模块,还有内 核为其分配的主设备号。
在/dev/中也增加很多以scull开头的字符设备。
4.
试试scull设备:
运行命令:
# ls -l > /dev/scull # 没有任何输出就返回了
# cat /dev/scull # 再运行cat命令读取scull设备,则会将上面命令的输出信息读出来
总计 900
-rw-rw-rw- 1 baobaowu baobaowu 10845 2005-02-01 access.c
-rw-rw-r-- 1 baobaowu baobaowu 74580 06-15 16:27 access.o
-rw-rw-rw- 1 baobaowu baobaowu 16631 06-15 17:15 main.c
-rw-r--r-- 1 baobaowu baobaowu 74512 06-15 17:16 main.o
-rw-r--r-- 1 baobaowu baobaowu 752 2005-02-01 Makefile
-rw-rw-rw- 1 baobaowu baobaowu 11138 2005-02-01 pipe.c
-rw-rw-r-- 1 baobaowu baobaowu 71576 06-15 16:27 pipe.o
-rw-r--r-- 1 baobaowu baobaowu 5153 2005-02-01 scull.h
-rwxr-xr-x 1 baobaowu baobaowu 3309 2005-02-01 scull.init
-rw-r--r-- 1 baobaowu baobaowu 248556 06-15 17:16 scull.ko
-rwxr-xr-x 1 baobaowu baobaowu 1708 06-15 16:34 scull_load
-rw-rw-rw- 1 baobaowu baobaowu 1852 06-15 17:16 scull.mod.c
-rw-r--r-- 1 baobaowu baobaowu 33696 06-15 17:16 scull.mod.o
-rw-r--r-- 1 baobaowu baobaowu 216043 06-15 17:16 scull.o
-rwxr-xr-x 1 baobaowu baobaowu 335 2005-02-01 scull_unload
果然scull设备跟书中介绍的一样,只是存在于内存中的一个缓冲区。
5.
再运行scull_unload,也是没有任何输出就返回了,但是scull模块却已经从内核中删除了,/proc/devices 文件中也没scull设备了,/dev/中也没有以scull开头的字符设备了。
6.
下面在scull增加一些调试信息:
打开main.c文件,在函数scull_init_module()的头部增加一句:
printk(KERN_ALERT "Debug by baobaowu:scull_init_module()/n");
在函数scull_read()的头部增加一句:
printk(KERN_ALERT "Debug by baobaowu:scull_read()/n");
在函数scull_write()的头部增加一句:
printk(KERN_ALERT "Debug by baobaowu:scull_write()/n");
保存后运行make进行编译。
7.
重复第3步,将scull加载进内核中,此时内核应该调用main.c中的scull_init_module()函数,是不是调用 了呢?我们看看/var/log/messages文件,果然在该文件最后有输出我们的调试信息:
Debug by baobaowu:scull_init_module()
那read和write怎么调用呢?我们紧接着下面介绍。
8.
可以想像,向设备中写数据就会调用scull_write()函数,我们执行下面的命令利用输出重定向来向/dev/scull设备 写数据:
# ls -l > /dev/scull
执行完命令后再看看/var/log/messages文件,果然在该文件最后有输出我们的调试信息:
Debug by baobaowu:scull_write()
9.
从设备中读取数据应该就会调用scull_read()函数,我们利用dd命令来读scull设备:
# dd if=/dev/scull of=temp # 从/dev/scull中读取数据,保存在当前目录下的temp文件中
执行完命令后再看看/var/log/messages文件,果然在该文件最后有输出我们的调试信息:
Debug by baobaowu:scull_read()
10.
本文介绍的scull使用方法调试成功后对读第三章《字符设备驱动程序》很有帮助,当遇到不懂,或不确定的地方时printk一下就 好了^_^
今天学习这个驱动例子,发现用printk打印的信息没有在/var/log/messages文件中,而是在/var/log/kern.log中,我用的是ubuntu10.
- scull驱动学习!
- scull驱动学习!
- linux驱动学习4:scull驱动
- Scull驱动
- linux 驱动学习之scull驱动的安装
- linux驱动学习笔记(2.3) scull模块 init_MUTEX被废除
- linux 内核驱动学习之scull代码编译
- Linux设备驱动学习(2) 全局内存“设备” scull
- Introduction the naive“scull” 《linux设备驱动》 学习笔记
- scull内存驱动
- Linux字符驱动-scull
- SCULL简单字符设备驱动
- scull
- 基于scull结构的驱动模块源码
- ldd3 驱动--测试scull
- 编译驱动scull出错后解决方案
- 编译LDD3的scull驱动问题总结
- ldd(linux设备驱动程序)scull驱动
- 在Linux 2.6内核下编译可以加载的内核模块
- 2.计算出1900年1月1日至当前日期之间总共间隔多少天,将其除以7取余数,该结果即为当月第一天是星期几,按日历格式输出
- cacti及其插件的安装配置
- sql 删除重复行怎么写
- Cannot access individual rows in this collection because the table has vertically merged cells c#
- scull驱动学习!
- mysql宕机分析(事务日志损坏)
- 如何从其它的方法中删除对话框?
- POJ2586--Y2K Accounting Bug
- oracle丢失更新示例及解决方案
- [leetCode] Gray Code
- vsftp设置不同的用户进入不同的目录
- 厚积薄发,丰富的公用类库积累,助你高效进行系统开发(13)
- 基于直方图特征的图像搜索