免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1072 | 回复: 0
打印 上一主题 下一主题

编写Linux用户空间驱动程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-19 11:23 |只看该作者 |倒序浏览
设备驱动程序大概可分为两种
内核驱动程序及用户空间驱动程序。
内核驱动程序
是内核空间实现的驱动程序,它使用内核资源,内核栈。它包括可加载的内核驱动模块。在这里我想主要说说用户空间驱动程序的编写。
用户空间驱动程序
就是指在用户空间实现的驱动程序。可以认为,它跟普通的用户程序没有什么两样,它使用用户进程空间和栈。这里说下,我不是讨论接到串口,并口上什么设备!
大家不要以为在用户空间写驱动程序[color="#ee1196"]“不过瘾!”。其实,作为设备驱动程序,其主要做的事就是配置设备寄存器(一家之言)。所以也不用把驱动程序看得那么“神秘”。当然,有些设备是不合适在用户空间实现驱动的。个人认为,使用中断的设备不宜在用户空间驱动,除此外,都有办法在用户空间来驱动。
在用户空间实现驱动的一个好处就是,方便用GDB调试。
怎么写
上面说到,驱动程序主要做的事情就是配置设备寄存器。那么,只要在用户空间,我能获得到寄存器地址(或是映像地址)那就可以驱动这个设备了。
以PCI设备为例,假设你的PCI设备主芯片的配置寄存器在PCI配置头的0x14位置:

先:通过/proc文件系统的pci文件,及/proc/bus/pci目录下的文件,可以获取到你的设备PCI配置头的信息,当然,也可以读出0x14
偏移的值。假设其值为0xE0080000;这个就是你的PCI设备主芯片的配置寄存器的物理地址。在有MMU的处理器里,直接使用这个地址是不允许的。
我们都知道,在用户进程空间寻址一个物理地址,首先要把这个物理地址映射到进程空间内。
怎么映射呢?
我们知道,在Linux的/dev目录下,有一个mem的设备。我们简单认为它
就是管理0x00000000-0xFFFFFFFF(32位处理器)物理地址的一个设备(不单指物理内存,它的空间也含盖了PCI地址空间)。将PCI
配置寄存器空间映射到进程空间的逻辑如下:
fd = open("/dev/mem",O_RDWR);
reg_addr = mmap(NULL,0x100,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0xE0080000);
之后,你就可以使用reg_addr这个地址,在0x100大小空间范围内配置你的PCI设备了。

就这么完了吗
在用户空间实现的驱动程序,不用为设备建立设备文件。当然,在多个进程使用时,要使用IPC机制来实现设备临界区的
保护等。如果你真的感觉写用户空间的设备驱动程序“没什么水平”,那你可以用它来调试好你的设备(也是就知道怎么设置寄存器)后,再花一点时间把它移到内
核去,加上文件系统接口,使用内核同步机制进行同步,再实现初始化函数,就可以变成内核驱动了。
http://www.52rd.com/blog/Detail_RD.Blog_sbz_4327.html
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/101356/showart_2098172.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP