设备驱动程序大概可分为两种: 内核驱动程序及用户空间驱动程序。

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

【转】用户空间编写驱动程序相关推荐

  1. 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序

    嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...

  2. 浅入浅出 Android 安全:第三章 Android 本地用户空间层安全

    第三章 Android 本地用户空间层安全 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 本地用户空间层在 Android ...

  3. V4L2用户空间和kernel层driver的交互过程

    这篇文章详细分析了V4L2用户空间和kernel层driver的交互过程,目的只有一个: 更清晰的理解V4L2视频驱动程序的系统结构,驱动编程方法,为以后开发视频驱动打好基础 既然从用户层出发探究驱动 ...

  4. 用户空间与内核空间,进程上下文与中断上下文[总结]【转】

    转自:http://blog.csdn.net/lizuobin2/article/details/51791863 本文转载自:http://www.cnblogs.com/Anker/p/3269 ...

  5. 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 ...

  6. linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间

    linux驱动程序一般工作在内核空间,但也可以工作在用户空间.下面我们将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们. Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,L ...

  7. LWN:DVB与头文件和用户空间的regression!

    关注了就能看到更多这么棒的文章哦- DVB, header files, and user-space regressions By Jake Edge August 25, 2021 DeepL a ...

  8. OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)?

    OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)? 图形硬件供应商,需要为显示适配器编,编写用户模式显示驱动程序.用户模式显示驱动程序,是由Microsoft Direct3D运行时加 ...

  9. linux 内核空间与用户空间 简介

    本文以 32 位系统为例介绍内核空间(kernel space)和用户空间(user space). 内核空间和用户空间 对 32 位操作系统而言,它的寻址空间(虚拟地址空间,或叫线性地址空间)为 4 ...

  10. linux平台驱动运行空间,UIO(linux Userspace I/O子系统)用户空间设备驱动I/O技术介绍...

    UIO(linux Userspace I/O子系统)用户空间设备驱动I/O技术介绍(由搜集整理) UIO(Userspace I/O)是运行在用户空间的I/O技术.Linux系统中一般的驱动设备都是 ...

最新文章

  1. 杨超越的声音+高晓松的脸~如此酸爽的技术,你值得拥有!
  2. Yum在线升级之网络(本地)服务器的搭建!
  3. 单片机modebus RTU通信实现,采用C语言,可适用于单片机,VC,安卓等(转)
  4. RandomizedSearchCV 和GridSearchCV
  5. PostGIS容器运行
  6. protocol buffer相关
  7. python 数组比较大小_python – 比较两个不同长度的numpy数组
  8. 不透水面提取操作实现
  9. LibreOJ 6283 数列分块入门 7(区间加区间乘区间求和)
  10. 一文读懂内生性问题之两阶段最小二乘法TSLS
  11. oem和odm是什么意思?oem与odm区别是什么?
  12. 计算机安全意识小故事,安全故事精选5篇
  13. 公众平台--扫描微信二维码,关注后自动登录
  14. luogu4182 [USACO18JAN] Lifeguards P (单调队列优化dp)
  15. 婚恋交友诈骗案例,交友要谨慎
  16. android 手机 平板同屏,酷乐视Q6投影仪Android手机/平板同屏方法汇总
  17. mysql别名引号与引用问题
  18. 铁路办公施工信息化管理系统软件平台
  19. 移动优盘linux系统下载,把Linux装进U盘 打造简洁移动系统
  20. matlab 克里金插值,克里金插值(arcgis克里金插值步骤)

热门文章

  1. 学深圳,垃圾随桶运走最好
  2. LINUX上安装gstreamer,解决video.h找不到的错误
  3. python判断中文函数_如何判断(或如何编写)一个没有副作用的python函数?
  4. tns无监听程序_成ORA-12560: TNS: 协议适配器错误的问题的原因
  5. 集群ddos_《DNS攻击防范科普系列2》 -DNS服务器怎么防DDoS攻击
  6. linux网络测试题,Linux 练习题-4网络 命令
  7. 怎么下载linux历史文件,快速学习Linux-Linux历史
  8. 软件开发计划_敏捷软件开发实践:估算与计划读书笔记125第23章 案例分析:Bomb Shelter Studio...
  9. python壁纸4k_别人用钱,而我用python爬虫爬取了一年的4K高清壁纸!真实用!
  10. react在线文件_在线IDE开发入门之从零实现一个在线代码编辑器