Linux UIO机制--用户空间I / O操作方法

2023-05-16

目录

         前言

关于UIO

UIO 的工作原理:


前言

于许多类型的设备,创建Linux内核驱动程序是过分的。真正需要的只是某种方式来处理中断并提供对设备存储空间的访问。控制设备的逻辑不必一定要在内核之内,因为设备不需要利用内核提供的任何其他资源。这样的一种常见的设备类别是用于工业I / O卡的设备。

为了解决这种情况,设计了用户空间I / O系统(UIO)。对于典型的工业I / O卡,只需要一个非常小的内核模块。驱动程序的主要部分将在用户空间中运行。这简化了开发并降低了内核模块中严重错误的风险。

请注意,UIO不是通用驱动程序接口。已经被其他内核子系统(例如网络,串行或USB)良好处理的设备不适合使用UIO驱动程序。最适合UIO驱动程序的硬件满足以下所有条件:

  • 设备具有可以映射的内存。通过写入该存储器可以完全控制该设备。
  • 设备通常会产生中断。
  • 该设备不适合标准内核子系统之一。

关于UIO

如果您将UIO用作卡的驱动程序,则将获得以下信息:

  • 只需编写和维护一个小的内核模块。
  • 使用您习惯的所有工具和库在用户空间中开发驱动程序的主要部分。
  • 驱动程序中的错误不会使内核崩溃。
  • 无需重新编译内核即可进行驱动程序更新。

UIO 的工作原理:

        UIO分成2个部分,主要是内核部分和用户空间部分, 在内核部分主要是实现硬件寄存器的内存映射(struct uio_info -> struct uio_mem)及读写操作, 在用户空间部分,将uio设备的uio_mem映射到本地(mmap), 这样就可以实现在用户空间访问硬件设备寄存器的目的, 再通过设备的控制逻辑,就可以实现硬件设备的驱动。 

一个UIO设备驱动的主要任务有两个:

        1. 存取设备的内存 UIO 核心实现了mmap()可以处理物理内存(physical memory),逻辑内存(logical memory),虚拟内存(virtual memory)UIO驱动的编写是就不需要再考虑这些繁琐的细节。 如果有些设备的总线不是PCI总线, 那么仍需要做相关的处理   
        2.
处理设备产生的中断 对于设备中断的应答必须在内核空间进行。所以在内核空间有一小部分代码 用来应答中断和禁止中断,但是其余的工作全部留给用户空间处理。  
        如果用户空间要等待一个设备中断,它只需要简单的阻塞在对 /dev/uioXread()操作上。当设备产生中断时,read()操作立即返回。UIO 也实现了poll()系统调用,你可以使用  select()来等待中断的发生。select()有一个超时参数可以用来实现有限时间内等待中断。   对设备的控制还可以通过/sys/class/uio下的各个文件的读写来完成。你注册的uio设备将会出现在该目录下。假如你的uio设备是uio0那么映射的设备内存文件出现在 /sys/class/uio/uio0/maps/mapX,对该文件的读写就是对设备内存的读写。

 

如果觉得写得不错,烦请微信搜索公众号 "郑州行疆户外" 了解程序员的户外业余喜好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux UIO机制--用户空间I / O操作方法 的相关文章

随机推荐

  • git错误:unable to auto-detect email address

    idea 用git更新的时候报错 详细错误信息如下 Tried to save uncommitted changes in stash before Update but failed with an error stash file D
  • SpringBoot 测试类无法自动注入@Autowired

    原来的测试类的注解 xff1a 64 RunWith SpringRunner class 64 SpringBootTest 一直没法自动注入 xff0c 后来在 64 SpringBootTest xff0c 加入启动类Applicat
  • ##单片机和linux学习的关系,为什么学习linux?希望成为linux驱动工程师?

    我们知道单片机是要学习的 xff0c 那么怎么去学习单片机 xff1f 在上一课我们说不要使用老一套的方法学习 xff0c 实际上是指的两个问题 第一 xff1a 选择什么开发板 xff1b 第二 xff1a 使用什么开发工具 xff1b
  • [ROS连载学习篇 1 ]基于树莓派3B+的Ubuntu mate16.04安装

    前言 xff1a 笔者是一名在读本科生 xff0c 专业为电气工程及其自动化 xff0c 因个人兴趣加入学校一工作室学习ROS xff0c 但学校内设备有限 xff0c 配套的学习硬件只有树莓派3B 43 xff0c 在笔者大量查翻网页论坛
  • 推荐一些学习嵌入式经典的书籍

    在学习嵌入式的过程中 xff0c 到现在为止 xff0c 我还是看了有一部分书了 不得不说 xff0c 很多书就像经典一样 xff0c 永远不会过时 等到你再去品味的时候 xff0c 又会有新的体会 学无止境 xff01 学习也是一种不断积
  • 安装配置Ubuntu-22.04于WSL2的图形化界面

    WSL2安装可以参考微软的官方教程 xff0c 已经很简单了 xff1a 安装 WSL Microsoft Learn 注意部分网络环境在安装时可能需要科学上网 至于Ubuntu 22 04可以在应用商店里找到 xff0c 也可以使用以下命
  • Android中的自定义注解(反射实现-运行时注解)

    预备知识 xff1a Java注解基础 Java反射原理 Java动态代理 一 布局文件的注解 我们在Android开发的时候 xff0c 总是会写到setContentView方法 xff0c 为了避免每次都写重复的代码 xff0c 我们
  • Android 开发的技术方向

    xff11 应用开发 xff12 源码级开发 分为系统应用开发 xff0c Framework开发 xff0c 底层浏览器内核开发 xff0c 音视频编码开发 虚拟机开发 底层驱动开发等系统ROM相关的开发 3 安全 逆向 xff0c 病毒
  • Java内存优化和性能优化的几点建议

    1 没有必要时请不用使用静态变量 使用Java的开发者都知道 xff0c 当某个对象被定义为stataic变量所引用 xff0c 这个对象所占有的内存将不会被回收 有时 xff0c 开发者会将经常调用的对象或者变量定义为static xff
  • Linux系统安装docker并用ssh登录docker容器

    说明 xff1a 我使用的是Centos安装docker 第一步 xff1a 安装docker sudo yum install y yum utils sudo yum config manager add repo https down
  • 码云使用简介

    1 xff0c 何为码云 xff1f 码云属于中国的一个代码托管平台 xff0c 由 OSCHINA NET推出 简单说 xff0c 相当于GitHub的精简版 xff0c 对像小编这样英文盲显得更为友善 xff01 2 xff0c 下载及
  • Centos7搭建KVM虚拟化环境

    如果觉得写得不错 xff0c 烦请微信搜索公众号 34 郑州行疆户外 34 了解程序员的户外业余喜好 1 查看系统版本 root 64 openstack cat etc centos release CentOS Linux releas
  • Linux字符驱动之主设备号与次设备号

    drv demo c include lt linux version h gt include lt linux init h gt include lt linux module h gt include lt linux pci h
  • linux 更新内核,安装内核树

    https www cnblogs com williamjie p 10723919 html
  • x86计算CPU频率示例

    include lt stdio h gt include lt stdlib h gt include lt assert h gt include lt stdint h gt include lt string h gt includ
  • SM2 签名预处理操作

    如果觉得写得不错 xff0c 烦请微信搜索公众号 34 郑州行疆户外 34 了解程序员的户外业余喜好 转载 xff1a https www xuebuyuan com 1473900 html 一般情况下 xff0c 计算数字签名时应执行以
  • dataset中shuffle()、repeat()、batch()用法

    import numpy as np import tensorflow as tf np random seed 0 x 61 np random sample 11 2 make a dataset from a numpy array
  • Linux内核模块编程,多源码Makefile编写

    https mp csdn net console editor html 107838044 在学习内核模块编程的时候遇到了一些由于Makefile书写不正确导致的问题 一个 c源文件的Makefile按照网上的大部分资料介绍那样是没有问
  • 分组加密, 算法模式(ECB CBC CFB OFB)

    如果觉得写得不错 xff0c 烦请微信搜索公众号 34 郑州行疆户外 34 了解程序员的户外业余喜好 块加密 块加密 xff0c 英文Block Cyper xff0c 又称分组加密 xff0c 是一种常见的对称加密 xff0c 具有代表性
  • Linux UIO机制--用户空间I / O操作方法

    目录 前言 关于UIO UIO 的工作原理 前言 于许多类型的设备 xff0c 创建Linux内核驱动程序是过分的 真正需要的只是某种方式来处理中断并提供对设备存储空间的访问 控制设备的逻辑不必一定要在内核之内 xff0c 因为设备不需要利