快速业务通道

一个简单的演示用的Linux字符设备驱动程序

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-06
,我们还是指定主设备号为145
这样我们可以在/dev/目录下建立几个设备节点.

[root@char8139]$ mknod /dev/char8139_0 c 145 0
[root@char8139]$ mknod /dev/char8139_0 c 145 17
[root@char8139]$ mknod /dev/char8139_0 c 145 36
[root@char8139]$ mknod /dev/char8139_0 c 145 145

看一下我们建立的节点

[michael@char8139]$ ll /dev/char8139*
crw-r--r-- 1 root root 145, 0 2004-12-26 20:33 /dev/char8139_0
crw-r--r-- 1 root root 145, 17 2004-12-26 20:34 /dev/char8139_1
crw-r--r-- 1 root root 145, 36 2004-12-26 20:34 /dev/char8139_2
crw-r--r-- 1 root root 145, 145 2004-12-26 20:34 /dev/char8139_3
[michael@char8139]$

我们建立了四个节点,使用了四个次设备号,后面我们会说明次设备号的作用.


再来看看我们的file_operations的定义.这里其实只实现了read(),open(),release()三个
系统调用,ioctl()只是简单返回.更有write()等函数甚至根本没有声明,没有声明的
函数系统可能会调用默认的操作.
struct file_operations char8139_fops =
{
owner: THIS_MODULE,
read: char8139_read,
ioctl: char8139_ioctl,
open: char8139_open,
release: char8139_release,
};

file_operations是每个字符设备驱动程序实现的系统调用,当用户对/dev中我们的设备对应
结点进行操作时,linux就会调用我们驱动程序中提供的系统调用.比如用户敲入
"cat /dev/char8139_0"命令,想想cat这个应用程序的实现,它肯定调用C语言库里的open()
函数去打开/dev/char8139_0这个文件,到了系统这一层,系统会看到/dev/char8139_0不是普通
磁盘文件,而是一个代表字符设备的节点,系统会根据/dev/char8139_0的主设备号来查找是不是
已经有驱动程序使用这个相同的主设备号进行了注册,如果有,就调用驱动程序的open()实现.

为什么要这样干?要提供抽象,提供统一的接口,别忘了操作系统的作用之一就是这个.
我们的设备提供的统一的接口,cat这个应用程序使用一般的文件操作就能从我们的设备中读出数据,
more, less这些应用程序都能从我们的设备中读出数据.

现在来看看我们的设备
#define CHAR8139_BUFFER_SIZE 2000
unsigned char *buffer=NULL; /* driver data buffer */
unsigned char *p_buf;
unsigned int data_size=0;
我们的设备很简单,一个2000字节的缓冲区, data_size指定缓冲区中有效数据的字节数.我们的设备
只支持读不支持写.我们在char8139_init()中为缓冲区分配空间.

char8139_exit()里面的操作就是char8139_init()里面操作的反向操作.


现在我们来看看,假如用户调用了"cat /dev/char8139_3"这个命令会发生什么事情.
根据前面的介绍,我们驱动程序中的open()函数会被调用.

int char8139_open(struct inode *node, struct file *flip)
{
int type = MINOR(node->i_rdev)>>4;
int num = MINOR(node->i_rdev) & 0x0F;

/* put some char in buffer to reflect the minor device number */
*buffer=(unsigned char)(''0'');
*(buffer 1)=(unsigned char)(''x'');
*(buffer 2)=(unsigned char)(''0'' type);
*(buffer 3)=(unsigned char)(''0'' num);
*(buffer 4)=(unsigned char)(''n'');
data_size =5;

PDBG("Ok. Find treasure! 8139 I/O port base: %xn", detect_8139_io_port());
PDBG("OK. Find treasure! 8139 I/O memory base address: %lxn",
detect_8139_io_mem());

MOD

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号