You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UIO设备/dev/uio0读取返回EIO错误的问题求助

解决UIO设备read()返回EIO错误的方案

核心问题定位

UIO设备的read()调用返回EIO(输入/输出错误),大概率是中断配置不正确导致的——你使用定时器调用uio_event_notify()模拟中断,属于自定义中断场景,而非硬件触发的真实中断,若内核侧uio_info结构体的中断类型配置错误,会导致read操作的等待逻辑异常。

具体修复步骤

1. 修正内核侧uio_info的中断配置

必须将uio_info的irq字段设置为UIO_IRQ_CUSTOM,明确告知内核这是自定义中断,无需绑定硬件中断线:

struct uio_info uio_info = {
    .name = "uio-hotplug",
    .version = "1.0",
    .mmap = uio_hotplug_mmap,
    .irq = UIO_IRQ_CUSTOM, // 关键配置:标记为自定义中断
    .irq_flags = 0, // 自定义中断场景无需硬件irq标志
};

// 注册UIO设备时传入该结构体
int ret = uio_register_device(dev, &uio_info);
if (ret) {
    pr_err("UIO device registration failed\n");
    return ret;
}

2. 定时器回调中维护中断计数

调用uio_event_notify()前,需要递增uio_info->count字段——用户态read()返回的就是这个计数值,同时确保通知逻辑正确:

static void timer_callback(struct timer_list *t) {
    struct uio_info *info = from_timer(info, t, timer);
    
    info->count++; // 递增中断计数
    uio_event_notify(info); // 触发用户态read的唤醒
    
    // 重启定时器(按需调整间隔)
    mod_timer(&info->timer, jiffies + msecs_to_jiffies(1000));
}

3. 调整用户态open模式

将open()的参数从O_RDONLY改为O_RDWR,部分内核版本的UIO驱动对只读模式的兼容性有限:

fd = open("/dev/uio0", O_RDWR);
if (fd < 0) {
    perror("error when opening");
    return EXIT_FAILURE;
}

4. 验证共享内存分配的正确性

确保shared_mem_buffer是连续物理内存(virt_to_phys()仅对连续物理内存的虚拟地址有效):

  • 若用__get_free_pages分配:
shared_mem_buffer = (void *)__get_free_pages(GFP_KERNEL, get_order(4096));
if (!shared_mem_buffer) {
    pr_err("Failed to allocate shared memory\n");
    return -ENOMEM;
}
  • 若用kmalloc分配(需确保内存连续):
shared_mem_buffer = kmalloc(4096, GFP_KERNEL);
if (!shared_mem_buffer) {
    pr_err("Failed to allocate shared memory\n");
    return -ENOMEM;
}

5. 驱动卸载时的资源清理

确保注销UIO设备并释放内存,避免资源泄漏:

uio_unregister_device(&uio_info);
// 对应分配方式释放内存
free_pages((unsigned long)shared_mem_buffer, get_order(4096));
// 或 kfree(shared_mem_buffer);

验证步骤

  1. 重新编译内核驱动并加载
  2. 编译用户态程序并运行
  3. 查看内核日志(dmesg)确认无错误输出
  4. 观察用户态程序是否能正常打印中断计数值

内容的提问来源于stack exchange,提问作者Frantz Dimitri TAPAMO DEMENOU

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:34:55