UIO(linux Userspace I/O子系统)用户空间设备驱动I/O技术介绍(由www.169it.com搜集整理) UIO(Userspace I/O)是运行在用户空间的I/O技术。Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程...

UIO(linux Userspace I/O子系统)用户空间设备驱动I/O技术介绍(由www.169it.com搜集整理)

UIO(Userspace

I/O)是运行在用户空间的I/O技术。Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可,而UIO则是将驱动的很少

一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能!使用UIO可以避免设备的驱动程序需要随着内核的更新而更新的问题.通

过UIO的运行原理图可以看出,用户空间下的驱动程序比运行在内核空间的驱动要多得多,UIO框架下运行在内核空间的驱动程序所做的工作很简单,常做的只

有两个:分配和记录设备需要的资源和注册uio设备和必须在内核空间实现的小部分中断应答函数,经过实践表明后面的工作也是可以省略的!我们认为uio内

核空间的程序所做的越少越好,在用户空间能完成的我们就不需要放在内核空间做(比如说响应中断),这样假如内核有变化,uio框架中的驱动维护也是比较简

单。

Linux UIO 驱动模型(图)

uio驱动的内核部分,用户空间部分,和uio 框架以及内核内部函数的关系图

uio驱动重要的数据结构:

struct uio_device {

struct module       *owner;

struct device       *dev; //在__uio_register_device中初始化

int         minor; // 次设备id号,uio_get_minor

atomic_t        event; //中断事件计数

struct fasync_struct    *async_queue;//该设备上的异步等待队列//

// 关于 “异步通知“ //参见LDD3第六章

wait_queue_head_t   wait; //该设备上的等待队列,在注册设备时(__uio_register_device)初始化

int         vma_count;

struct uio_info     *info;// 指向用户注册的uio_info,在__uio_register_device中被赋值的

struct kobject      *map_dir;

struct kobject      *portio_dir;

};

/*

* struct uio_info - UIO device capabilities

* @uio_dev:        the UIO device this info belongs to

* @name:       device name

* @version:        device driver version

* @mem:        list of mappable memory regions, size==0 for end of list

* @port:       list of port regions, size==0 for end of list

* @irq:        interrupt number or UIO_IRQ_CUSTOM

* @irq_flags:      flags for request_irq()

* @priv:       optional private data

* @handler:        the device‘s irq handler

* @mmap:       mmap operation for this uio device

* @open:       open operation for this uio device

* @release:        release operation for this uio device

* @irqcontrol:     disable/enable irqs when 0/1 is written to /dev/uioX

*/

struct uio_info {

struct uio_device   *uio_dev; // 在__uio_register_device中初始化

const char      *name; // 调用__uio_register_device之前必须初始化

const char      *version; //调用__uio_register_device之前必须初始化

struct uio_mem      mem[MAX_UIO_MAPS];

struct uio_port     port[MAX_UIO_PORT_REGIONS];

long            irq; //分配给uio设备的中断号,调用__uio_register_device之前必须初始化

unsigned long       irq_flags;// 调用__uio_register_device之前必须初始化

void            *priv; //

irqreturn_t (*handler)(int irq, struct uio_info *dev_info); //uio_interrupt中调用,用于中断处理

// 调用__uio_register_device之前必须初始化

int (*mmap)(struct uio_info *info, struct vm_area_struct *vma); //在uio_mmap中被调用,

// 执行设备打开特定操作

int (*open)(struct uio_info *info, struct inode *inode);//在uio_open中被调用,执行设备打开特定操作

int (*release)(struct uio_info *info, struct inode *inode);//在uio_device中被调用,执行设备打开特定操作

int (*irqcontrol)(struct uio_info *info, s32 irq_on);//在uio_write方法中被调用,执行用户驱动的

//特定操作。

};

UIO的内核部分和用户空间的工作

内核空间

UIO的少量运行在内核空间的驱动所做的工作有哪些呢?

(1)分配和记录设备需要的资源和注册uio设备

在设备的探测函数中:

- 使能PCI 设备

- 申请资源

- 读取并记录配置信息

- 注册uio设备// uio_register_device()

// uio_8139d_pci_probe & uio_8139d_handler

(2)必须*在内核空间实现的小部分中断应答函数

用户空间的关键操作

1关键操作

2.响应硬件中断

int32_t irq_count;

int fd = open("/dev/uio0", O_RDWR);

/* Map the register regions to proccess‘s virtual memspace */

void * access = mmap(NULL, 4096,

// 寄存器的读写操作,可用过普通内存读写的方式完成

PROT_READ | PROT_WRITE,

MAP_SHARED, fd, 0);// [1]

while (read(fd, &irq_count, 4) == 4) {[2]

printf("Interrupt number %d\n", irq_count);

原文:http://www.cnblogs.com/SZLLQ2000/p/5257475.html

linux dev uio,linux UIO相关推荐

  1. linux /dev/snd,linux – / dev / tcp去了哪里?

    参见英文答案 > /dev/tcp not found????????????????????????????????????1个 >????????????/dev/tcp not pr ...

  2. python 测试linux dev文件,Linux测试开发人员要掌握的Linux命令有哪些?

    今天小编要跟大家分享的文章是关于Linux测试开发人员要掌握的学习Linux和 一.文件和目录相关 文件和目录相关 1.进入目录--cd cd /usr/local //进入/usr/local这个目 ...

  3. linux dev urandom,Linux random vs urandom 区别

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? /dev/random In Unix-like operating systems, /dev/random is a ...

  4. linux dev nfc,linux下的nfc开发

    首先科普一下nfc技术到底是什么,度娘来给我们解释一下,NFC. 下面讲的nfc的开发方式libnfc. 为了参加全国物联网大赛,被接触了这个叫做NFC开发的难题,度娘了许久,没有什么现成的资料可查, ...

  5. linux /dev目录

    http://blog.chinaunix.net/u3/94284/showart_1982242.html linux /dev目录 linux /dev目录 dev 是设备(device)的英文 ...

  6. linux, sysrq,acpi,apci,uio,subsystem daemon

    linux, sysrq,acpi,apci Linux设备模型   一.sysfs文件系统: sysfs文件系统是Linux2.6内核引入的,它被看成是与proc.devfs和devpty等同类别的 ...

  7. Linux /dev目录详解和Linux系统各个目录的作用

    Linux /dev目录详解和Linux系统各个目录的作用 标签: linuxtcpfunctionclassfirefoxtimer 2012-01-11 23:08 45517人阅读 评论(2) ...

  8. 内存属于linux文件吗,linux下的/dev/shm是什么? 内存 文件系统

    linux下的/dev/shm是什么? /dev/shm/是linux下一个目录,/dev/shm目录不在磁盘上,而是在内存里,因此使用linux /dev/shm/的效率非常高,直接写进内存. 我们 ...

  9. linux安装dev命令,Linux安装与基础命令

    首先准备一个liunx镜像和一台安装好虚拟机的电脑. 配置好虚拟机,选在稍后安装.选择镜像文件,开启虚拟机进行安装. 配置yum源.首先插入光盘.由于是虚拟机,用的光盘镜像, 在/mnt/下面创建一个 ...

最新文章

  1. 全文!《2018中国IoT报告》!
  2. dump导入oracle需要提前建表吗_数据库dump导入
  3. python+appium判断元素存在_python自动化测试应用--Appium元素篇
  4. ICLR 2020 | 多模态下使用图片信息显著增强机器翻译效果
  5. 摄影测量--后方交会
  6. 丰田pcs可以关闭吗_论安全性能,广汽丰田TNGA车型如何?
  7. 生活中的数学 —— 操场几何学
  8. css3弹性盒模型flex快速入门与上手(align-content与align-items)
  9. 最新基于高德地图的android进阶开发(1)获取 Map API Key
  10. 每日一题/015/tr(AB)=tr(BA)/反对称矩阵的充要条件/如果 AA‘=-A^2,那么是反对称矩阵
  11. 慕课软件质量保证与测试(第十章.课后作业)
  12. S32K144 S32K148 UDS诊断 BOOTLOADER开发 ISO14229 15765 软件定 基于UDS协议的CAN总线Bootloader设计 具体价格以咨询为主 UDS 诊断
  13. 基于python+qt5考研倒计时器
  14. 微信小程序-TabBar用法
  15. python累乘怎么写_Python3 实现列表元素求累和,求累乘
  16. CentOS安装NTFS-3G读写Windows 10的移动NTFS磁盘
  17. Python数据分析与实战挖掘
  18. 【转】c# 图片压缩 (非图片大小变化)----使得显示效果差点,但是图片占用空间需要变小
  19. 线程池 (通俗易懂)
  20. 惠普服务器开机显示系统恢复选项,惠普一键恢复出厂设置【操作办法】

热门文章

  1. php的sic考试,关于V9项目M2 SIC考试题调查分析
  2. 世界是平的读后感(转,整理)
  3. 论文《Depth Estimation From a Light Field Image Pair With a Generative Model》学习
  4. zinnia下user各自的category
  5. SpringBoot实现小程序微信支付统一下单
  6. 30大优秀logo设计详解
  7. Zeno节点系统中的C++最佳实践
  8. 重拾Python学习(六)----------面向对象高级编程
  9. 计算机管理员英语怎么说,电脑管理员英文是什么?管理员英文怎么写?
  10. Vue-Router路由重复点击报错