ubuntu12.04下实现字符设备驱动并提供源码解析

上两篇文章记录了在ubuntu12.04上面初步实现一个驱动模块及其参数的问题:

HelloWorld

模块参数

下面记录一下,在ubuntu12.04上面实现字符驱动的过程,在看到LDD3(linux device driver 3rd)第三章的时候,讲解了字符设备驱动的实现,自然就找到了源码来进行查看和编译,但是,官方的源码包含了第三章到第六章的内容,对于新手来说,可能就会觉得很苦恼,因为后面的知识都还不会,而且代码混合在一起也不利于本章知识的掌握,下面就记录一下我源码分离的过程,以及在ubuntu12.04(kernel version 3.2.0-23-generic)上面编译,加载,测试,卸载的过程。

先给出最后可以运行的源码资源:http://download.csdn.net/detail/jiguangcanhen/8314973

-------------------------------------------------------------------------------------------

最后源码包含的文件有:

main.c  Makefile  scull.h  scull.init  scull_load  scull_unload

分别说一下:

main.c:当然是模块的主体内容了。

Makefile:是编译脚本

scull.h:自定义的头文件,在main.c中进行了引用,声明了一些变量等。

scull.init:初始化脚本,在加载模块的时候创建设备节点,在卸载模块的时候删除设备节点等等。

scull_load:模块加载脚本。

scull_unload:模块卸载脚本。

--------------------------------------------------------------------------------------------

首先是main.c脚本的源码解析,这个大家参考这篇博客,讲解的很详细:http://blog.csdn.net/liuhaoyutz/article/details/7383313

--------------------------------------------------------------------------------------------

接着是Makefile脚本的解析,这个大家也参考这篇博客:http://blog.csdn.net/liuhaoyutz/article/details/7382956

这里,我只说一下需要修改的地方:

1.把scull-objs := main.o pipe.o access.o修改为scull-objs := main.o

原因也很简单,我们现在已经没有pipe.c和access.c了,这些是后面章节的内容,也是我们需要去除的部分。

2.这里在make的时候,还会出现一个错误的,这个留在后面给出。

--------------------------------------------------------------------------------------------

对于scull.init和scull_load和scull_unload就是三个shell脚本,对于这里,如果大家看不懂,请先阅读《shell入门与开发指南》

这里也是给出需要修改的地方:

1.FILES="     0 0         1 1         2 2        3 3    priv 16

pipe0 32    pipe1 33    pipe2 34   pipe3 35

single 48      uid 64     wuid 80"

修改为:

FILES="     0 0         1 1         2 2        3 3"

原因也很简单,就是后面的那些字符设备,我们都不需要了。

至于scull_load和scull_unload可以不用修改。

在具体的,大家就比对我的源码和官方源码的不同就可以了。

-------------------------------------------------------------------------------------------

下面就是make的过程:

问题1:Makefile.build:12: *** CFLAGS wa changed in ‘‘yourpath" . Fix it to use ccflags-y. Stop.

问题解决:也很简单,就是在Makefile中找到相应的问题,进行替换就可以了。

问题2:main.c:1:0: error: linux/config.h: No such file or directory.

问题解决:把#include <linux/config.h>这句话给注释掉就可以了。

问题3:error: implicit declaration of function ‘init_MUTEX’

问题解决:你可以报main.c在初始化使用到init_MUTEX的地方注释掉,也可以使用sema_init(sem,1);来进行替代。

--------------------------------------------------------------------------------------------

这样之后,make就通过了,ls看看现在的文件目录。

因为我们还没有加载模块,所以还无法看到我们创建的设备节点,加载模块的时候,需要root权限下才可以哦。

加载了模块之后,可以在/proc/modules中看到我们的模块。

可以在/dev下看到我们的设备。

可以看到我们设备的设备主编号为249,此编号分别为:0、1、2、3,名称分辨为scull0、scull1、scull2、scull3。并且c开头的话,说明我们的设备是字符设备。并且主编号一般和驱动相关联,可以说明我们的驱动的编号为249.

测试我们的字符设备以及驱动,显示查看scull0里面的内容,发现什么都没有,然后把当前登录账户的信息输入到scull0中,再次查看可以看到我们的之前输入的信息。

然后进行模块的卸载,可以发现,相应的设备已经被删除了,同时模块也已经成功卸载了。

时间: 2024-10-12 19:47:43

ubuntu12.04下实现字符设备驱动并提供源码解析的相关文章

Maxwin-z/XListView-Android(下拉刷新上拉加载)源码解析(一)

本次解析的内容,是github上一个用于下拉刷新上拉加载的控件xlistview,这个功能相信大家在开发的过程中会经常用到. 控件的源码地址是https://github.com/Maxwin-z/XListView-Android 在这个控件之前,我看过一些相同功能的控件,挑选后觉得XListView功能比较完善,而且易于理解.在android-open-project里面,有提到一个DropDownListView,个人使用过以后,觉得功能是具备了,但是操作体验不好,原因就是没有使用到Scr

linux 3.0.35下globalmem 字符设备驱动实现

1.Makefile KDIR=/home/xxx/s-linux-3.0.35 PWD:=$(shell pwd) # kernel modules obj-m := globalmem.o modules: make -C $(KDIR) M=$(PWD) modules clean: rm -rf *.o *.ko *.mod.c *.markesr *.order *.symvers .PHONY:modules clean 2.globalmem.c #include <linux/m

Maxwin-z/XListView-Android(下拉刷新上拉加载)源码解析(二)

转载请注明出处http://blog.csdn.net/crazy__chen/article/details/45980399 源文件下载地址http://download.csdn.net/detail/kangaroo835127729/8736887 本文主要是贴出xlistview的源代码和一个使用实例,没有过多讲解 使用实例,MainActivity public class MainActivity extends Activity { private LinkedList<Str

Linux高级字符设备驱动 poll方法(select多路监控原理与实现)

1.什么是Poll方法,功能是什么? 2.Select系统调用(功能)      Select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程.      int select(int maxfd, fd_set *readfds, fd_set *writefds, fe_set *exceptfds, const struct timeval *timeout)     Select系统调用(参数)     1)Maxfd:           文件描述符的范围,比

SylixOS字符设备驱动框架

1.概述 本文档主要介绍SylixOS中字符设备驱动框架,适用于在SylixOS集成开发环境下进行字符设备驱动开发的学习. 注:文中xxx是指具体设备名,编写对应驱动时,自行命名(如RTC.COMPASS等). 2.SylixOS字符设备驱动简介 字符设备是指只能以字节为单位进行读写的设备,读取数据需按照先后顺序,不能随机读取设备内存中某一数据.常见的字符设备如:鼠标.键盘.串口等. 在SylixOS中,每个字符设备都会在/dev目录下对应一个设备文件,用户程序可通过设备文件(或设备节点)来使用

arm-linux字符设备驱动开发之---简单字符设备驱动

一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 1.字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的字符设备有鼠标.键盘.串口.控制台和LED设备等.2.块设备:是指可以从设备的任意位置读取一定长度数据的设备.块设备包括硬盘.磁盘.U盘和SD卡等. 每一个字符设备或块设备都在/dev目录下对应一个设备文件.linux用户程序通过设备文件(或称设备节点)来使用驱动程序操作字符设备和

从Linux内核LED驱动来理解字符设备驱动开发流程

目录 博客说明 开发环境 1. Linux字符设备驱动的组成 1.1 字符设备驱动模块加载与卸载函数 1.2 字符设备驱动的file_operations 结构体中的成员函数 2. 字符设备驱动--设备号注册卸载 2.1 设备号注册 2.2 设备号注销 3. 字符设备驱动--文件操作 参考资料 示例代码 @(从Linux内核LED驱动来理解字符设备驱动开发流程) 博客说明 撰写日期 2018.12.08 完稿日期 2019.10.06 最近维护 暂无 本文作者 multimicro 联系方式 [

linux 字符设备驱动开发详解

一.设备的分类及特点 1.字符设备 字符设备是面向数据流的设备,没有请求缓冲区,对设备的存取只能按顺序按字节的存取而不能随机访问.    Linux下的大多设备都是字符设备.应用程序是通过字符设备节点来访问字符设备的.通常至少需要实现 open, close, read, 和 write 等系统调用.    设备节点一般都由mknod命令都创建在/dev目录下,包含了设备的类型.主/次设备号以及设备的访问权限控制等,如:crw-rw----  1 root  root 4, 64 Feb 18

linux设备驱动第三篇:写一个简单的字符设备驱动

在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存. 下面就开始学习如何写一个简单的字符设备驱动.首先我们来分解一下字符设备驱动都有那些结构或者方法组成,也就是说实现一个可以使用的字符设备驱动我们必须做些什么工作. 1.主设备号和次设备号 对于字符设备的访问是通过文件系统中的设备名称进行的.他们通常位于/dev目录下.如下: [plain] vie