2024年4月17日发(作者:)
维普资讯
计算机与现代化
2OO7年第5期JISuANJI YU XIANDAIHUA 总第141期
文章编号:1006-2475(2007)05-0117-03
嵌入式uCLinux设备驱动程序的研究与实现
廖光忠,刘万震
(武汉科技大学计算机科学与技术学院,湖北武汉430081)
摘要:通过在嵌入式uC nux上实现字符型设备驱动程序的添加实例,介绍了嵌入式Linux系统的设备管理、设备驱动程
序的框架和实现设备驱动程序的添加方法,以能够提供给大家一个开发uCIjnll】【下设备驱动程序的向导,使之在开发各
种设备的驱动程序中得到很好的应用。
关键词:嵌入式系统;uCHn ̄;驱动程序
中图分类号:TP316 文献标识码:A
Realizing Device Driver Added in Embedded uCLinux
LIAO Guang—zhong,LIU Wan—zhen
(Computer cShool,Wuhan University of Science and Technology,Wuhan 430081,China)
Abstract:This paper introduces management in embedded uCHn ̄system of driver and an approach of adding driver th ̄ush an
instance of realizing device driver added in embedded Linux system,which Can supply a prD 珊nmiflg guide for uClint=device
drivers.And this has been very useful for developing device drivers.
Key words:embedded system;uCLint=;driver
O 引 言
本元素:内核引导实用程序、uCLinux微内核、初始化
过程。同时,根据需要添加:硬件驱动程序、1个或多
随着信息技术和网络技术的快速发展,嵌入式系 个应用进程(以提供所需功能)、1个文件系统(可能
统已成为一个备受关注的热点。嵌入式系统融合了 在ROM或者RAM内)、存储半瞬态数据和提供交换
计算机软硬件技术、通信技术和微电子技术,用户可
空间的磁盘、TCP IP网络栈等。
以根据具体应用需求,把相应的微处理器直接嵌入到
uCLinux与Linux最大区别在于Linux采用了虚
具体的应用系统中。然而在嵌入式开发中,经常会遇 拟存储技术¨J。虚拟存储技术的实现基于局部性原
到许多新的外部设备需要系统支持的情况,在嵌入式
理。一个程序在运行之前,没有必要全部装入内存,
uCLinux上实现设备驱动程序的添加方法,成为开发 而是将那些当前需要运行的部分页面装入内存运行,
人员十分关注的一个问题。
其余暂时留在硬盘上。如果发现所需页面不在内存
1 uCLinux嵌入式系统
中,操作系统将产生一个页失效异常,导致操作系统
把需要运行的部分页加载到内存中。虚拟存储技术
uCLinux是针对控制领域的嵌入式Linux操作系 能提供内存保护,进程不能以非授权方式访问或修改
统,由LintLx2.0 2.4内核派生而来,沿袭了主流Linux
页面,内核保护单个进程的数据与代码,以防止其他
的绝大部分特性,适合不具备内存管理单元的微处理
进程修改它们。
器(MMU)。有无MMU支持是Linux与uCLinux的基
Linux是针对有内存管理单元的处理器而设计的,
本差异。最小的嵌入式uCLinux系统仅需要3个基 虚拟内存地址是经过MMU进行地址转换后映射为实际
收稿日期:2006-12-30
基金项目:湖北省教育厅重点科学研究计划(Z200511005)
作者简介:廖光忠(1969-),男,湖北武汉人,武汉科技大学计算机科学与技术学院讲师,硕士,研究方向:计算机网络安全,系
统软件开发和多媒体技术;刘万震(1982一),男,福建漳平人,硕士研究生,研究方向:软件工程,嵌入式系统软件开发。
维普资讯
ll8 计算机与现代化 2007年第5期
的物理地址。uCunux没有MMU,不能使用虚拟存储技
的函数地址结构的指针传输给内核。这样,内核就能
通过设备驱动程序的主设备号索引访问驱动程序内
部的子程序,完成打开、读、写等操作。
uCLillUX系统引导时,通过sys-setup(1inux/fs/file
systems.c)进行系统初始化。而sys-setup又调用device-
setup进行设备初始化。字符型初始化由ehr-dev.init
(uCllnux/15nux/drivem/char/me ̄c)完成。
术,但仍然采用存储器分页管理机制,系统启动时把实
际存储器分页,在加载应用程序时分页加载。由于没有
MMU管理,所以uCLinux采用了实存储器策略。
ucunux对内存的访问是直接的,所有程序访问的地址
都是实际的物理地址。操作系统对内存空间没有保护,
各个进程实际上是共享一个运行空间。一个进程在运
行前,系统必须为进程分配足够的连续地址空间,然后
为Linux内核编写驱动程序,一般的工作方式都
全部载人到主存储器连续空间中。
2设备驱动程序
2.1嵌入式系统的设备管理
Linux的设备管理系统是操作系统的重要组成部分,
是输入输出子系统。系统分为E下两个部分:一部分是下
层的、设备相关的,即所谓的设备驱动程序,它直接与相应
的设备打交道,并向上提供一组访问接口;另一部分是上
层的、与设备无关的,这部分根据输入输出请求,通过特定
设备驱动提供的接口,与设备断 百信l2】。
目前绝大多数嵌入式系统的软件系统存放在
Flash上,包括uCLinux操作系统、应用系统的程序以
及各种设备的驱动程序都被直接固化到Flash上,系
统启动时,程序代码直接在Flash上开始运行。
根据设备性质的不同,设备驱动程序通常可归结
为四种类型:字符设备(char)、块设备(block)、网络
接口(net)和其他设备驱动程序模块,它们都在Linux
drivers目录下的子目录。如char、block、net、cdrom、sc.
si、sound等。Linux系统通过这种文件系统实现软件
设备驱动程序。所有的字符和块设备的驱动程序都
支持文件操作接口,因此用户对任何一个设备的存取
如同对文件操作一样。只要特定的设备驱动程序支
持这一抽象的文件接口即可。对于Linux系统来说,
虽然设备的种类繁多,但是为了便于使用,将各种设
备都作为(特殊)文件来处理,对设备可以进行open、
read和write等操作o
2.2设备驱动程序的框架
Linux的设备驱动程序与内核的接口可分为三部
分:与系统启动代码的接口对设备进行初始化;与内
核接口通过file-operation来完成;与设备的接口对设
备进行读写操作等。
每一个设备驱动程序实质上是用来完成特定任
务的一组函数集。驱动程序拥有一个称为file-opera-
tion的数据结构,其中包含指向驱动程序内部大多数
函数的指针。引导系统时,内核调用每一个驱动程序
的初始化函数,将驱动程序的主设备号以及程序内部
是在现成的驱动程序的基础上针对特殊的硬件设备
作相应的改动,并编写几个基本的函数并向虚拟文件
系统(VFS)注册。当上层应用要使用该设备时,VFS
就会调用相应的设备函数。
3实现设备驱动程序的添加
驱动程序可以按照两种方式编译:一种是静态编
译进内核;另一种是编译成模块以供动态加载。由于
ucLinux不支持模块动态加载,因而设备驱动程序只
能静态编译进uc ux内核[3】。下面以在嵌入式
ucLinux系统中需新增一个字符型设备为例,介绍设
备驱动程序的添加的一系列步骤(设其驱动程序为
test.c)o
3.1改动设备驱动程序test.c源代码
第一步,将原来的:
#include<limLx/module.h>
#include<llnux/version.h>
char kernel-version[]=UTS-RELEASE;
改为:
样谢efMODULE
样include<linux/module.h>
#include<llnux/version.h>
char kernel-version[]=UTS-ERLEASE;
#else
#define MOD.INC.USE.COUNT
#deifne MOD.DEC.USE.COUNT
#endif
第二步,新建函数init init-test(void)
将设备注册写在此:
result=register-chardev(254,”test”,&test-fops);
3.2复制改动好的驱动程序到嵌入式u(】_j眦系统
将test.e复制到uCLinux/Li肌】【/(1river/char目
录下,在该目录下的Makefde中增加如下代码:
(¥(CON ̄G一 ̄STDmVE),y)
L-OBJS+=test.o
End.f
维普资讯
2OO7年第5期 廖光忠等:嵌入式uCLinux设备驱动程序的研究与实现
Const char・device);
119
3.3新设备驱动程序的注册
 ̄_/uCIAnux/romdisk/romdisk/dev/目录下创建设备:
@test c 254 0
其中handler是中断处理子程序指针,中断产生时
由操作系统自动调用此函数;参数 为中断号;pt—legs
为中断发生时寄存器的内容;device为设备名称;lfags确 其中test是设备名,C表示字符设备,254是主设
备号,O是次设备号。做法为:
¥touch@test c 254 0
在/uCunux/linux/dIiver8/,char目录下nleln.c中,init char-
dev—init()函数中增加如下代码:
bool support for testdrive CONFIG—TESTDRIVE Y
3.4重新编译内核
在/uCLinux/linux/目录下运行menuucconfig进
行编译(在menuucconfig字符设备选项中可以看到刚
添加的“support for testdrive”选项,并且已被选中):
make clean;make dep;make linux;make linux.test;
make linux.data;cat linux.text linux.data>linux.bino
通过make的一系列编译,所有内核和应用程序
源代码将被编译,并会产生imagez.bin二进制影像文
件和clv4文件。
3.5添加驱动程序到Flash
下载的方法如下,通过串口进入目标系统
在uCLinux目录下运行make sloaf将新的im.
agez.bin写入Flash中。
目标系统重新启动完成后,在目标系统的dev目录下
增加了—个名称为test的设备,在bin目录下增加了—个
tset文件,到这里,在uCLinux中添加设备驱动程序的工作
可以 完成了,就可以蝴拍己的勃设备test了。
4设备驱动机制的关键问题
4.1内存操作
在设备驱动程序中动态开辟内存,不是用manoc
函数,而是用kmalloc函数。这个函数运行很快,除非
它被阻塞。或者用get—free—pages直接申请页。释放
内存用的是kfree或free—pages。
4.2中断处理
设备驱动程序通过调用request—irq()函数申请
中断,将一个硬件处理函数挂到相应的处理队列
中 。uCLinux系统中对中断的处理属于系统的核
心部分,因此,如果外部设备与系统之间以中断方式
进行数据交换,就必须把该设备的驱动程序作为系统
内核的一部分。通过request-irq函数调用就可以把
相关的中断号和具体的中断处理程序相关联。
Int request-irq(unsigned int irq,
Void(・handler)(int,void・,struct pt—regs・),
Unsigned int log flags,
定了中断处理程序的一些特性。na =SA INTER
RUPT表示该中断处理函数是快速中断,在其运行时所
有中断都被屏蔽;不设置SA INTERRUPT表示慢速处理
程序,这种程序运行时除了正在处理的中断外,其他中
断都没有被屏蔽;na =sA srm ̄Q表示共享此中断处
理程序。函数调用成功返回O值,返回一INVAL表示中断
号超出范围或者handler=NULL,返回-BUSY表示中断
已经被占用且不能共享。
4.3用户空间和内核空间
设备驱动程序是在“内核空间”中运行的,而一
般应用程序则是在“用户空间”中运行。在uCLinux
系统中,操作系统内核程序在最高级执行(也称为
“管理员态”),在内核空间可以执行对硬件的任何操
作 J,而一般的应用程序则运行在最低级(“用户空
间”)。在用户空间操作,系统禁止对硬件的直接访
问和对内存的未授权访问。uCLinux通过系统调用
和硬件中断完成从用户空间到内核空间的控制转移。
执行系统调用的内核代码在进程的上下文上执行
(它代表调用进程操作,而且可以访问进程地址空间
的数据)。但与此不同,处理中断的函数代码相对进
程而言是异步的,而且与任何一个进程都无关。
5结束语
本文通过介绍在uCLinux操作系统下设备驱动
的相关问题,使用户了解嵌入式系统设备驱动的开发
流程。借助uCLinux的开放性,我们能够灵活快捷开
发嵌入式应用系统。
参考文献:
[1]邹思轶.嵌入式Linux的设计与应用[M].北京:清华大
学出版社,2002.
[2]Rubini A,Corbet J.Linux设备驱动程序[M].魏永明,骆
刚,姜君译.北京:中国电力出版社。2002。
[3]贾明,严世贤.Linux下的c编程[M].北京:人民邮电出版
社。2001.
[4]翟鸿鸣.Linux系统实时性能增强方法的研究[J].微机
发展,2003,13(z1):1—3.
[5]王俊锋,冯志彪.如何编写设备驱动程序[J].微机发
展,2O05,15(2):52~27.
发布者:admin,转转请注明出处:http://www.yc00.com/web/1713286149a2218989.html
评论列表(0条)