编写Linux用户空间驱动程序

来源:互联网 发布:康泰尔a1丝绕线数据 编辑:程序博客网 时间:2024/05/16 08:25

http://blog.csdn.net/mtv0312/article/details/6839730

设备驱动程序大概可分为两种

内核驱动程序及用户空间驱动程序。
内核驱动程序

是内核空间实现的驱动程序,它使用内核资源,内核栈。它包括可加载的内核驱动模块。在这里我想主要说说用户空间驱动程序的编写。

用户空间驱动程序

就是指在用户空间实现的驱动程序。可以认为,它跟普通的用户程序没有什么两样,它使用用户进程空间和栈。这里说下,我不是讨论接到串口,并口上什么设备!
大家不要以为在用户空间写驱动程序“不过瘾!”。其实,作为设备驱动程序,其主要做的事就是配置设备寄存器(一家之言)。所以也不用把驱动程序看得那么“神秘”。当然,有些设备是不合适在用户空间实现驱动的。个人认为,使用中断的设备不宜在用户空间驱动,除此外,都有办法在用户空间来驱动。
在用户空间实现驱动的一个好处就是,方便用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机制来实现设备临界区的保护等。如果你真的感觉写用户空间的设备驱动程序“没什么水平”,那你可以用它来调试好你的设备(也是就知道怎么设置寄存器)后,再花一点时间把它移到内核去,加上文件系统接口,使用内核同步机制进行同步,再实现初始化函数,就可以变成内核驱动了。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 酷匠密码忘记了怎么办 战地1有时候卡死怎么办 战地一fps太低怎么办 Dnf与系统不兼容怎么办 使命召唤7显示w怎么办 战地3王者太卡怎么办 合金装备5消音器没了怎么办 红警基地没了怎么办 玩战地1帧数太低怎么办 战地1点游戏不开怎么办 ios耳机孔坏了怎么办? 吃泻药都不排便怎么办 上司离职了我该怎么办 我上司要辞职我怎么办 一方坚决不同意离婚我该怎么办 模拟农场车翻了怎么办 手机退出键坏了怎么办 dnf邮件发错了怎么办 手机提示sd卡已损坏怎么办 解压包文件数据损坏该怎么办 电脑被压缩后电脑打不开怎么办 眼睛里进了飞虫怎么办 虫子飞到眼睛里怎么办 云电脑pc版双鼠标怎么办 电脑蓝屏代码7f怎么办 笔记本电脑蓝屏开不了机怎么办 装xp系统后蓝屏怎么办 一键ghost断电了怎么办 如何防止cpu降频怎么办 win7 64位系统不兼容怎么办 网页无法加载打印机插件怎么办 微信提示安装了插件怎么办 电脑上不了网怎么办 win10 win10电脑突然没网了怎么办 笔记本玩战争前线发热严重怎么办 玩战争前线总是闪退怎么办 uu加速器卡在29怎么办 新ipad下载不了东西怎么办 福昕pdf阅读器找不到图章怎么办 战地4没达到分数怎么办 植物在太暗环境怎么办