UIO:用户空间驱动2007

原文网址:https://lwn.net/Articles/232575

原文作者:corbet

原文时间:2007年5月2日

用户空间驱动这个概念已经有很长时间了,这一次有一个补丁版本已经提交到了Linux2.6.22,这个版本的补丁就是UIO。【因为用户空间驱动的接口已经发生一些改变,需要重新讨论一下。】

和前面几个版本补丁一样,UIO并没有完全消除内核态代码。这部份内核代码实现了一个非常精简的内核模块,主要功能包括:设备的设置,PCI配置空间的访问,中断处理函数的注册。UIO框架下的中断处理过程分为内核态和用户态两部分:内核态部分非常精简主要用于设备的中断确认;用户态部分完成后面主体工作。

UIO驱动中内核态部分的编程要用到<linux/uio_driver.h>头文件。如果是PCI设备,内核驱动模块需要按照常规方法将自己注册成标准PCI驱动,并通过PCI驱动的probe()调用过程,对uio_info数据结构进行初始化:

    /*描述映射到用户空间的IO memory区*/struct uio_mem {/*我认为addr是地址描述,具体的地址类型参见memtype*/unsigned long addr;unsigned long size;/*三种类型:*   UIO_MEM_PHY,   物理地址 *   UIO_MEM_LOGICAL,  内核逻辑地址,通常是kmalloc分配的*   UIO_MEM_VIRTUAL   内核虚拟地址,通常是vmalloc_user分配的*/int memtype;/*internal_addr是ioremap返回的内核态虚拟地址*/void __iomem *internal_addr; /* ... */};struct uio_info {/*驱动名字和版本号,可以通过sysfs文件系统访问到*/char			*name;char			*version; struct uio_mem	mem[MAX_UIO_MAPS];/*中断号*/long			irq;/*传递给request_irq的标志*/unsigned long	irq_flags;void			*priv;/*handler主要是进行中断确认*/irqreturn_t (*handler)(int irq, struct uio_info *dev_info);int (*mmap)(struct uio_info *info, struct vm_area_struct *vma);int (*open)(struct uio_info *info, struct inode *inode);int (*release)(struct uio_info *info, struct inode *inode);/* Internal stuff omitted */};

一旦uio_info和uio_mem结构体定义好了,驱动模块的probe()函数要调用下面注册函数:

int uio_register_device(struct device *parent, struct uio_info *info);

注册函数中的parent指针可以直接指向pci_dev->dev,即PCI设备的标准设备结构体。当卸载内核模块的精简驱动时,驱动模块的remove()函数要调用下面注销函数:

void uio_unregister_device(struct uio_info *info);

另外还有一个通告函数,用于当事件发生时通知UIO核心层【我们有时候又成为协议层,或者框架层】。虽然真实中断发生时并不调用这个通告函数,但uio_event_notify()可以用于在某些情况下模拟中断。

void uio_event_notify(struct uio_info *info);

从用户空间来看,第一个UIO驱动的设备结点为/dev/uio0。用户空间驱动程序首先要open这个设备结点;然后读该设备获取一个整型返回值,这个返回值就是设备的中断计数器数值;如果这个读操作被阻塞,那就说明自从上一次读完成一来一直没有发生中断。文件描述符也可以传递给poll()函数【UIO的读操作是支持POLL机制的】。

内核驱动部分描述的IO memory区域通过mmap()调用映射到用户空间。这个接口有些奇怪:如果想映射第N块内存区域,输入参数offset应该是页长度的N倍。例如,在页长度为4KB的系统中,第一个内存区域的offset为0,第二个内存区域的offset为4096,后面以此类推。Once that is figured out, though, everything is pretty straightward【一旦上面的内容搞定,一切都水到渠成】。

下面我们讨论UIO的局限性。UIO的内核驱动部分仅仅实现了字符驱动;还没有提供块设备驱动或者网络设备驱动。用户空间不可能实现DMA操作。但是对于那些使用PIO操作和中断处理的驱动来说,所有必要的代码都已经准备好了。UIO补丁代码中还实现了一个驱动的例子。Thomas Gleixner介绍,UIO最初的补丁实现了68个ioctl命令,代码超过了5000行。相关的用户空间代码也超过了3000行。最新的补丁在内核态只有156行代码,用户态只有3000行代码。

Andrew Morton对UIO补丁还是保留了自己的意见:

我对整个UIO思想还有点犹豫。我们其实是鼓励大家将设备驱动开源,并移植到内核态;而不是鼓励大家将自己的驱动程序闭源....

作者回答道:it's not really about doing proprietary drivers, though some of that will undoubtedly go on.还是有很多人,尤其是嵌入式领域,基于原型设计目的,希望在用户空间实现驱动程序。UIO可以帮助他们按照标准的方式去实现用户态驱动,而不是让他们自由发挥在内核创造自己的钩UIO很可能会合并到Linux2.6.22中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FFMPEG用过的命令记录

转换输入的H264文件参数&#xff0c;其中 b&#xff1a;100k比特率 r&#xff1a;帧率 g&#xff1a;I帧间隔 profilte :编码档次high level:3 -x264opts “bframes0” 去除B帧&#xff0c;或者 -bf 0 -bsf:v “filter_unitsremove_types6” 过滤type为6的帧&#xff0c;既SEI帧…

php-golang-jsonrpc2.0 rpc-codec/jsonrpc2和tivoka/tivoka实践

golang代码&#xff1a; package main import ( "context" "net" "net/rpc" "github.com/powerman/rpc-codec/jsonrpc2" ) type App struct{} type Res struct { Code int json:"code" Msg string json:"msg&quo…

系列二、RocketMQ简介

一、概述 RocketMQ是一款阿里巴巴开源的消息中间件。2016年11月28日&#xff0c;阿里巴巴向Apache软件基金会捐赠RabbitMQ&#xff0c;成为Apache孵化项目。2017年9月25日&#xff0c;Apache宣布RocketMQ孵化成为Apache顶级项目&#xff08;TLP&#xff09;&#xff0c;成为国内…

树莓派微型web服务器——阶段设计报告

文章目录 1. 需求分析1.1 功能需求1.1.1 访问需求1.1.2 自定义域名需求1.1.3 下载公共文件需求1.1.4 用户体验需求 1.2 技术需求1.2.1 操作系统指令1.2.2 技术栈1.2.3 内网穿透 1.3 性能需求1.3.1 处理能力1.3.2 内存1.3.3 存储空间 2. 可行性分析2.1 硬件方面2.2 软件方面 3. …

[Tools: Camera Conventions] NeRF中的相机矩阵估计

参考&#xff1a;NeRF代码解读-相机参数与坐标系变换 - 知乎 在NeRF中&#xff0c;一个重要的步骤是确定射线&#xff08;rays&#xff09;的初始点和方向。根据射线的初始点和方向&#xff0c;和设定射线深度和采样点数量&#xff0c;可以估计该射线成像的像素值。估计得到的…

flutter:animate_do(flutter中的Animate.css)

简介 做过web开发的应该大部分人都知道Animate.css&#xff0c;它为开发者提供了一系列预定义的动画效果&#xff0c;可以通过简单的CSS类来实现各种动画效果。而animate_do 相当于flutter中的Animate.css,它提供了很多定义好的动画效果 基本使用 官方地址 https://pub-web.…

如何启用路由器dhcp?快解析如何内网穿透?

一、什么是DHCP&#xff1f; 动态主机设置协议&#xff08;DHCP&#xff09;是一种使网络管理员能够集中管理和自动分配 IP 网络地址的通信协议。在网络中&#xff0c;每个联网设备都需要分配独有的 IP 地址。并当有新计算机移到网络中的其它位置时&#xff0c;能自动收到新的…

数据结构之常见排序算法

文章目录 1.排序概念2.10种排序比较3.排序算法3.1直接插入排序&#xff08;元素越有序&#xff0c;越高效&#xff09;3.2希尔排序序( 缩小增量排序 )3.3直接选择排序3.5堆排序3.6冒泡排序3.8快速排序 递归实现&#xff08;无序使用最好&#xff09;3.8.1挖坑法 &#xff08;建…

我的第一个后端项目(环境搭建,Springboot项目,运行,接口验证)

一. 安装Java开发工具包&#xff08;JDK&#xff09;&#xff1a; 访问Java Software | OracleOracle官方网站&#xff0c;下载适合你操作系统的最新版本的JDK。安装JDK并设置好JAVA_HOME环境变量。 二. 安装集成开发环境&#xff08;IDE&#xff09;&#xff1a; 推荐使用In…

全方位对比 Postgres 和 MongoDB (2023 版)

本文为「数据库全方位对比系列」第二篇&#xff0c;该系列的首部作品为「全方位对比 Postgres 和 MySQL (2023 版)」 为何对比 Postgres 和 MongoDB 根据 2023 年 Stack Overflow 调研&#xff0c;Postgres 已经成为最受欢迎和渴望的数据库了。 MongoDB 曾连续 4 年 (2017 - …

【高级数据结构】树状数组

目录 树状数组1 &#xff08;单点修改&#xff0c;区间查询&#xff09; 树状数组1 &#xff08;单点修改&#xff0c;区间查询&#xff09; 洛谷&#xff1a;树状数组1https://www.luogu.com.cn/problem/P3374 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行…

MySQL案例——多表查询以及嵌套查询

系列文章目录 MySQL笔记——表的修改查询相关的命令操作 MySQL笔记——MySQL数据库介绍以及在Linux里面安装MySQL数据库&#xff0c;对MySQL数据库的简单操作&#xff0c;MySQL的外接应用程序使用说明 文章目录 系列文章目录 前言 一 创建数据库 1.1 创建一个部门表 1.…

【运维】Linux 跨服务器复制文件文件夹

【运维】Linux 跨服务器复制文件文件夹 如果是云服务 建议用内网ip scp是secure copy的简写&#xff0c;用于在Linux下进行远程拷贝文件的命令&#xff0c;和它类似的命令有cp&#xff0c;不过cp只是在本机进行拷贝不能跨服务器&#xff0c;而且scp传输是加密的。可能会稍微影…

机器学习基础 数据集、特征工程、特征预处理、特征选择 7.27

机器学习基础 1. 数据集 2. 特征工程 3. 学习分类 4. 模型 5. 损失函数 6. 优化 7. 过拟合 8. 欠拟合数据集 又称资料集、数据集合或者资料集合&#xff0c;是一种由数据所组成的集合特征工程 1. 特征需求 2. 特征设计 3. 特征处理特征预处理、特征选择、特征降维 4. 特征验…

C++网络编程 TCP套接字基础知识,利用TCP套接字实现客户端-服务端通信

1. TCP 套接字编程流程 1.1 概念 流式套接字编程针对TCP协议通信&#xff0c;即是面向对象的通信&#xff0c;分为服务端和客户端两部分。 1.2 服务端编程流程&#xff1a; 1&#xff09;加载套接字库&#xff08;使用函数WSAStartup()&#xff09;&#xff0c;创建套接字&…

【Python机器学习】实验04(2) 机器学习应用实践--手动调参

文章目录 机器学习应用实践1.1 准备数据此处进行的调整为&#xff1a;要所有数据进行拆分 1.2 定义假设函数Sigmoid 函数 1.3 定义代价函数1.4 定义梯度下降算法gradient descent(梯度下降) 此处进行的调整为&#xff1a;采用train_x, train_y进行训练 1.5 绘制决策边界1.6 计算…

Spring AOP 中,切点有多少种定义方式?

在 Spring AOP 中&#xff0c;我们最常用的切点定义方式主要是两种&#xff1a; 使用 execution 进行无侵入拦截。使用注解进行拦截。 这应该是是小伙伴们日常工作中使用最多的两种切点定义方式了。但是除了这两种还有没有其他的呢&#xff1f;今天松哥就来和大家聊一聊这个话…

安全运维 -- splunk 集群配置归档

0x00 背景 splunk 集群索引服务器容量满了以后&#xff0c;为了防止数据丢失&#xff0c;需要对旧数据进行归档保存。 0x01 原理 指定一台大容量服务器&#xff0c;创建共享文件夹&#xff0c;并将集群里的所有indexer指向这个归档共享目录。 0x02 实施 集群的每个indexer都…

Python音频和视频格式转换

1.音频转换 使用Python中的一些库来进行音频格式转换。其中一个常用的库是pydub。首先&#xff0c;你需要安装pydub库。你可以使用以下命令来安装它&#xff1a; pip install pydub安装完成后&#xff0c;你可以使用以下代码来进行音频格式转换&#xff1a; from pydub impo…

Linux-Shell

1.什么是Bash shell(壳) Bash Shell是一个命令解释器&#xff0c;它在操作系统的最外层&#xff0c;负责用户程序与内核进行交互操作的一种接口&#xff0c;将用户输入的命令翻译给操作系统&#xff0c;并将处理后的结果输出至屏幕。 通过xshell连接&#xff0c;就是打开了一…