【转】用户空间编写驱动程序
设备驱动程序大概可分为两种: 内核驱动程序及用户空间驱动程序。
l 内核驱动程序
是内核空间实现的驱动程序,它使用内核资源,内核栈。它包括可加载的内核驱动模块。在这里我想主要说说用户空间驱动程序的编写。
l 用户空间驱动程序
就是指在用户空间实现的驱动程序。可以认为,它跟普通的用户程序没有什么两样,它使用用户进程空间和栈。这里说下,我不是讨论接到串口,并口上什么设备!
大家不要以为在用户空间写驱动程序“不过瘾!”。其实,作为设备驱动程序,其主要做的事就是配置设备寄存器(一家之言)。所以也不用把驱动程序看得那么“神秘”。当然,有些设备是不合适在用户空间实现驱动的。个人认为,使用中断的设备不宜在用户空间驱动,除此外,都有办法在用户空间来驱动。
在用户空间实现驱动的一个好处就是,方便用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机制来实现设备临界区的保护等。如果你真的感觉写用户空间的设备驱动程序“没什么水平”,那你可以用它来调试好你的设备(也是就知道怎么设置寄存器)后,再花一点时间把它移到内核去,加上文件系统接口,使用内核同步机制进行同步,再实现初始化函数,就可以变成内核驱动了。
这样,你该满意了吧!
本文来自:我爱研发网(52RD.com) - R&D大本营
详细出处:http://www.52rd.com/blog/Detail_RD.Blog_sbz_4327.html?WebShieldDRSessionVerify=boUBUf4rnKmnroDrFvFR
转载于:https://www.cnblogs.com/losing-1216/p/5025282.html
【转】用户空间编写驱动程序相关推荐
- 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序
嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...
- 浅入浅出 Android 安全:第三章 Android 本地用户空间层安全
第三章 Android 本地用户空间层安全 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 本地用户空间层在 Android ...
- V4L2用户空间和kernel层driver的交互过程
这篇文章详细分析了V4L2用户空间和kernel层driver的交互过程,目的只有一个: 更清晰的理解V4L2视频驱动程序的系统结构,驱动编程方法,为以后开发视频驱动打好基础 既然从用户层出发探究驱动 ...
- 用户空间与内核空间,进程上下文与中断上下文[总结]【转】
转自:http://blog.csdn.net/lizuobin2/article/details/51791863 本文转载自:http://www.cnblogs.com/Anker/p/3269 ...
- I/O流(包括操作系统与内核,用户空间),I/O工作原理,Java I/O流的设计及Java IO系统
文章目录 一.操作系统与内核 1.1操作系统 1.2内核 1.3 关系图 二.内核空间和用户空间 2.1:目的: 2.2.内核空间(Kernel-space): 2.3.用户空间(User-space ...
- linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间
linux驱动程序一般工作在内核空间,但也可以工作在用户空间.下面我们将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们. Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,L ...
- LWN:DVB与头文件和用户空间的regression!
关注了就能看到更多这么棒的文章哦- DVB, header files, and user-space regressions By Jake Edge August 25, 2021 DeepL a ...
- OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)?
OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)? 图形硬件供应商,需要为显示适配器编,编写用户模式显示驱动程序.用户模式显示驱动程序,是由Microsoft Direct3D运行时加 ...
- linux 内核空间与用户空间 简介
本文以 32 位系统为例介绍内核空间(kernel space)和用户空间(user space). 内核空间和用户空间 对 32 位操作系统而言,它的寻址空间(虚拟地址空间,或叫线性地址空间)为 4 ...
- linux平台驱动运行空间,UIO(linux Userspace I/O子系统)用户空间设备驱动I/O技术介绍...
UIO(linux Userspace I/O子系统)用户空间设备驱动I/O技术介绍(由搜集整理) UIO(Userspace I/O)是运行在用户空间的I/O技术.Linux系统中一般的驱动设备都是 ...
最新文章
- 杨超越的声音+高晓松的脸~如此酸爽的技术,你值得拥有!
- Yum在线升级之网络(本地)服务器的搭建!
- 单片机modebus RTU通信实现,采用C语言,可适用于单片机,VC,安卓等(转)
- RandomizedSearchCV 和GridSearchCV
- PostGIS容器运行
- protocol buffer相关
- python 数组比较大小_python – 比较两个不同长度的numpy数组
- 不透水面提取操作实现
- LibreOJ 6283 数列分块入门 7(区间加区间乘区间求和)
- 一文读懂内生性问题之两阶段最小二乘法TSLS
- oem和odm是什么意思?oem与odm区别是什么?
- 计算机安全意识小故事,安全故事精选5篇
- 公众平台--扫描微信二维码,关注后自动登录
- luogu4182 [USACO18JAN] Lifeguards P (单调队列优化dp)
- 婚恋交友诈骗案例,交友要谨慎
- android 手机 平板同屏,酷乐视Q6投影仪Android手机/平板同屏方法汇总
- mysql别名引号与引用问题
- 铁路办公施工信息化管理系统软件平台
- 移动优盘linux系统下载,把Linux装进U盘 打造简洁移动系统
- matlab 克里金插值,克里金插值(arcgis克里金插值步骤)
热门文章
- 学深圳,垃圾随桶运走最好
- LINUX上安装gstreamer,解决video.h找不到的错误
- python判断中文函数_如何判断(或如何编写)一个没有副作用的python函数?
- tns无监听程序_成ORA-12560: TNS: 协议适配器错误的问题的原因
- 集群ddos_《DNS攻击防范科普系列2》 -DNS服务器怎么防DDoS攻击
- linux网络测试题,Linux 练习题-4网络 命令
- 怎么下载linux历史文件,快速学习Linux-Linux历史
- 软件开发计划_敏捷软件开发实践:估算与计划读书笔记125第23章 案例分析:Bomb Shelter Studio...
- python壁纸4k_别人用钱,而我用python爬虫爬取了一年的4K高清壁纸!真实用!
- react在线文件_在线IDE开发入门之从零实现一个在线代码编辑器