一个简单的演示用的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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: linux 里面装windows下一篇: LVM磁盘管理技术案例讲解
关于一个简单的演示用的Linux字符设备驱动程序的所有评论