Linux内核 -- UIO (User-space I/O) 简介与使用笔记

UIO (User-space I/O) 简介

UIO (User-space I/O) 是 Linux 内核提供的一种机制,用于简化设备驱动的开发。它将设备的硬件资源(如内存映射、中断等)通过简单的接口暴露给用户空间程序,从而使用户可以在用户空间编写复杂的设备逻辑,而内核只需完成基础的资源管理工作。


内核态作用与实现

UIO 内核态的作用
  1. 硬件资源管理
    • 提供设备内存映射支持,将设备寄存器或内存映射到用户空间。
    • 注册和处理硬件中断(可选)。
  2. 中断通知
    • 将设备硬件中断转发给用户空间程序。
UIO 内核态的实现步骤
  1. 定义设备信息结构
    使用 struct uio_info 定义设备信息,包括中断号、内存地址等。

    static struct uio_info my_uio_info = {.name = "my_device",.version = "1.0",.irq = 42,                      // 中断号(若不需要中断,可设置为 UIO_IRQ_NONE).irq_flags = IRQF_SHARED,       // 中断标志.handler = my_irq_handler,      // 中断处理函数(可选).mem[0].addr = 0x40000000,      // 物理地址.mem[0].size = 0x1000,          // 内存大小.mem[0].memtype = UIO_MEM_PHYS, // 内存类型
    };
    
  2. 注册设备
    使用 uio_register_device 注册设备信息:

    static int __init my_uio_init(void) {return uio_register_device(NULL, &my_uio_info);
    }static void __exit my_uio_exit(void) {uio_unregister_device(&my_uio_info);
    }module_init(my_uio_init);
    module_exit(my_uio_exit);
    MODULE_LICENSE("GPL");
    
  3. 实现中断处理函数(可选)
    如果需要支持硬件中断,需要实现中断处理逻辑:

    static irqreturn_t my_irq_handler(int irq, struct uio_info *dev_info) {return IRQ_HANDLED; // 通知内核中断已处理
    }
    
注意事项
  • 如果设备不需要中断功能,可以将 irq 设置为 UIO_IRQ_NONE,并省略 handler
  • 内核态代码只需要完成资源管理工作,具体设备逻辑由用户空间程序完成。

用户态作用与实现

UIO 用户态的作用
  1. 设备访问:通过 /dev/uioX 文件与设备交互。
  2. 内存映射:使用 mmap 将设备内存映射到用户空间,直接操作设备寄存器。
  3. 中断处理:通过 read 调用等待中断事件。
用户态的实现步骤
  1. 打开设备文件

    int fd = open("/dev/uio0", O_RDWR);
    if (fd < 0) {perror("Failed to open /dev/uio0");return -1;
    }
    
  2. 内存映射
    使用 mmap 将设备内存映射到用户空间:

    void *reg_base = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (reg_base == MAP_FAILED) {perror("Failed to mmap");close(fd);return -1;
    }
    
  3. 处理中断
    通过 read 等待中断事件:

    unsigned int irq_count;
    while (1) {read(fd, &irq_count, sizeof(irq_count));printf("Interrupt received! Count: %d\n", irq_count);
    }
    
  4. 释放资源
    在程序结束时,释放映射的内存并关闭设备:

    munmap(reg_base, 0x1000);
    close(fd);
    

示例代码

内核态代码

以下是一个完整的内核态代码示例:

#include <linux/module.h>
#include <linux/uio_driver.h>static irqreturn_t my_irq_handler(int irq, struct uio_info *dev_info) {return IRQ_HANDLED;
}static struct uio_info my_uio_info = {.name = "my_device",.version = "1.0",.irq = 42,.irq_flags = IRQF_SHARED,.handler = my_irq_handler,.mem[0].addr = 0x40000000,.mem[0].size = 0x1000,.mem[0].memtype = UIO_MEM_PHYS,
};static int __init my_uio_init(void) {return uio_register_device(NULL, &my_uio_info);
}static void __exit my_uio_exit(void) {uio_unregister_device(&my_uio_info);
}module_init(my_uio_init);
module_exit(my_uio_exit);
MODULE_LICENSE("GPL");
用户态代码

以下是对应的用户态代码示例:

#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>int main() {int fd = open("/dev/uio0", O_RDWR);if (fd < 0) {perror("Failed to open /dev/uio0");return -1;}void *reg_base = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if (reg_base == MAP_FAILED) {perror("Failed to mmap");close(fd);return -1;}unsigned int irq_count;while (1) {read(fd, &irq_count, sizeof(irq_count));printf("Interrupt received! Count: %d\n", irq_count);}munmap(reg_base, 0x1000);close(fd);return 0;
}

注意事项

  1. 中断功能
    • 如果不需要中断功能,可以省略中断处理函数,并将 irq 设置为 UIO_IRQ_NONE
  2. 性能问题
    • 使用 UIO 时,中断和用户空间之间的切换会增加延迟,不适合高实时性场景。
  3. 安全性
    • UIO 将设备的硬件资源直接映射到用户空间,需确保用户空间程序的安全性,以防止资源滥用。

总结

UIO 是一种简化设备驱动开发的高效工具,适合处理简单设备或快速原型开发。在内核态中,开发者只需完成资源注册和中断处理(可选);在用户态中,程序通过 /dev/uioX 文件与设备交互,完成具体逻辑。

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

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

相关文章

数学建模助力干细胞研究,配体纳米簇如何影响干细胞命运

大家好&#xff01;今天来了解一篇关于对干细胞行为的可逆调控的研究——《Modularity-based mathematical modeling of ligand inter-nanocluster connectivity for unraveling reversible stem cell regulation》发表于《Nature Communications》。这项研究利用图论对细胞外基…

HTMLCSS:超炫丝滑的卡片水波纹效果

这段代码创建了一个卡片&#xff0c;卡片上有三个波动效果&#xff0c;这些波动效果通过 CSS 的keyframes 动画实现&#xff0c;创建了一个旋转的动画效果。这种效果适用于创建动态的视觉效果&#xff0c;例如音乐播放器的封面、动态背景或其他需要动态效果的界面元素。 演示效…

pytorch MoE(专家混合网络)的简单实现。

专家混合&#xff08;Mixture of Experts, MoE&#xff09;是一种深度学习模型架构&#xff0c;通常用于处理大规模数据和复杂任务。它通过将输入分配给多个专家网络&#xff08;即子模型&#xff09;&#xff0c;然后根据门控网络&#xff08;gating network&#xff09;的输出…

K8s证书过期

part of the existing bootstrap client certificate is expired: 2023-11-27 12:44:12 0000 UTC 查看运行日志&#xff1a; journalctl -xefu kubelet 重新生成证书&#xff1a; #重新生成证书 kubeadm alpha certs renew all #备份旧的配置文件 mv /etc/kubernetes/*.conf…

B端UI设计规范是什么?

一、B端UI设计规范是什么&#xff1f; B端UI设计规范是一套针对企业级应用界面设计的全面规则和标准&#xff0c;旨在确保产品界面的一致性、可用性和用户体验。 二、B端UI设计规范要素说明 B端UI设计的基本要素包括设计原则、主题、布局、颜色、字体、图标、按钮和控件、交互…

记录一次前端绘画海报的过程及遇到的几个问题

先看效果 使用工具 html2canvas import html2canvas from html2canvas// 绘画前的内容 我就不过多写了<div class"content" ref"contentRef" v-show"!imgShow"><img :src"getReplaceImg(friendObj.coverUrl)" alt"&qu…

mysql性能问题排查

生产环境 Mysql执行性能分析 问题排查思路通过 performance_schema 分析performance_schema 说明查询 performance_schema 所有表信息performance_schema 相关表 主要相关介绍events_statements_history 分析慢查询 和查询当时状态字段说明 问题排查思路 查询慢SQL日志查询SQL…

Jensen-Shannon Divergence:定义、性质与应用

一、定义 Jensen-Shannon Divergence&#xff08;JS散度&#xff09;是一种衡量两个概率分布之间差异的方法&#xff0c;它是Kullback-Leibler Divergence&#xff08;KL散度&#xff09;的一种对称形式。JS散度在信息论、机器学习和统计学等领域中具有广泛的应用。 给定两个概…

安全合规遇 AI 强援:深度驱动行业发展新引擎 | 倍孜网络CEO聂子尧出席ICT深度观察报告会!

12月24日&#xff0c;2025中国信通院深度观察报告会科技伦理与合规发展分论坛在北京举办。本次分论坛主题为“伦理先行&#xff0c;合规致远”&#xff0c;聚焦互联网广告合规治理、移动终端应用生态治理、短视频平台责任限度等前沿话题进行分享与探讨。工业和信息化部领导&…

harmony数据保存-数据持久化

preference的介绍 preference的使用 数据库 sqlite的使用 可以写sql语句用executsql进行增删改查. 也可以使用提供的接口&#xff08;insert&#xff0c;delete&#xff0c;update&#xff0c;query&#xff09;进行增删改查。

解锁高效密码:适当休息,让学习状态满格

一、“肝帝” 的困境 在当今竞争激烈的职场中&#xff0c;“肝帝” 现象屡见不鲜。超长工时仿佛成为了许多行业的 “标配”&#xff0c;从互联网企业的 “996”“007”&#xff0c;到传统制造业的轮班倒、无休无止的加班&#xff0c;员工们的工作时间被不断拉长。清晨&#xff…

c/c++ 无法跳转定义

背景 对于嵌入式开发离不开交叉编译工作&#xff0c;采用vccode远程到虚拟机开发来说&#xff0c;总会遇到一个函数跳转问题。下面针对运用开发如何设置vscode保证函数能正确跳转大函数定义。 一、安装c/c插件 安装C/C Extension Pack插件&#xff0c;这插件包含有几个插件。…

福特汽车物流仓储系统WMS:开源了,可直接下载

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。欢迎大家到本文底部评论区留言。 近日&#xff0c;福特汽车公司推出了其广受好评的仓库管理系统GreaterWMS&#xff08;更大仓库管理系统&#xff09;的开源版本&#xff0c;意味着各行…

去除 el-input 输入框的边框(element-ui@2.15.13)

dgqdgqdeMac-mini spid-admin % yarn list --pattern element-ui yarn list v1.22.22 └─ element-ui2.15.13 ✨ Done in 0.23s.dgqdgqdeMac-mini spid-admin % yarn list vue yarn list v1.22.22 warning Filtering by arguments is deprecated. Please use the pattern opt…

LLM漫谈(八)| OpenAI 12天直播集锦

声明&#xff1a;本文是收集了网上关于OpenAI 12天直播的博文&#xff0c;若有侵权&#xff0c;联系我删除&#xff0c;感谢各位博主的奉献。 此次 OpenAI 将发布会拆分为 12 天直播&#xff0c;是一次内容与形式的双重创新。这种形式通过延长发布周期&#xff0c;不断吸引观众…

SwiftUI 入门趣谈:在文本框(TextField)内限制数字的输入

概述 虽然 SwiftUI 本身提供了海量内置的原生视图供我们使用&#xff0c;但对于某些情况我们还需要根据实际需求“量体裁衣、专属定制”。 在日常的撸码场景中&#xff0c;我们有时需要限制文本框&#xff08;TextField&#xff09;中数字内容的输入&#xff0c;如何又简单又快…

unity使用代码在动画片段中添加event

unity使用代码在动画片段中添加event using UnityEngine;public static class AnimationHelper {/// <summary>/// 获取Animator状态对应的动画片段/// </summary>/// <param name"animator">Animator组件</param>/// <param name"…

初始JavaEE篇 —— 网络原理---传输层协议:深入理解UDP/TCP

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 UDP协议 参数解析&#xff1a; 校验和的计算 TCP协议 参数解析&#xff1a; 确认应答机制 超时重传 连接管理 三次握…

Apache Doris 创始人:何为“现代化”的数据仓库?

在 12 月 14 日的 Doris Summit Asia 2024 上&#xff0c;Apache Doris 创始人 & PMC 成员马如悦在开场演讲中&#xff0c;围绕“现代化数据仓库”这一主题&#xff0c;指出 3.0 版本是 Apache Doris 研发路程中的重要里程碑&#xff0c;他将这一进展总结为“实时之路”、“…

百度千帆平台构建AI APP的基础概念梳理

百度千帆平台构建AI APP的基础概念梳理 如果想制作大语言模型&#xff08;LLM&#xff09;相关的APP&#xff0c; 将利用百度的千帆平台在国内可能是最便捷的途径&#xff0c;因为百度开发了成熟的工作流&#xff0c;前些年还有些不稳定&#xff0c;现在固定下来了&#xff0c…