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

mmap映射UIO设备失败:返回无效指针地址(错误:No such device)

问题排查:UIO设备mmap失败(错误:No such device)

问题描述

尝试将/dev/uio0映射到用户空间时,mmap调用失败,返回MAP_FAILED(值为0xffffffff),错误信息为mmap: No such device。相关代码如下:

打开UIO设备代码

fd = open(DEVICE, O_RDWR);
if (fd < 0) {
    perror("open");
    return -1;
}

mmap映射代码

map = mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (map == MAP_FAILED) {
    perror("mmap");
    close(fd);
    return -1;
}

排查步骤

  • 验证UIO设备有效性
    检查/sys/class/uio/uio0/目录下的文件,确认设备对应有效的硬件:

    • 查看/sys/class/uio/uio0/name,确认是预期的硬件驱动名称;
    • 检查/sys/class/uio/uio0/maps/目录下的子项(如map0),确认存在可映射的内存区域,通过cat /sys/class/uio/uio0/maps/map0/size获取该区域的实际大小。
  • 确认MAP_SIZE参数正确性
    mmap的MAP_SIZE必须与UIO设备暴露的内存区域大小一致,且必须是页大小对齐的值(可通过getpagesize()获取系统页大小)。如果MAP_SIZE超过了实际可映射的内存大小,或者未对齐,会导致映射失败。

  • 检查mmap的offset参数
    UIO设备的每个内存映射区域对应不同的mmap offset,格式为i * getpagesize(),其中i是映射区域的索引(从0开始)。如果设备有多个映射区域,使用错误的offset会导致找不到对应设备区域,触发"No such device"错误。

  • 排查权限问题
    虽然open调用成功,但当前用户可能没有足够权限访问UIO设备的内存区域。尝试用sudo运行程序,或者修改/dev/uio0的权限(如chmod 666 /dev/uio0)验证是否为权限问题。

  • 检查内核配置与驱动状态

    • 确认内核已开启CONFIG_UIO配置项(可通过zcat /proc/config.gz | grep CONFIG_UIO查看);
    • 确认对应硬件的驱动已正确注册UIO设备,可通过dmesg | grep uio查看内核日志,检查是否有UIO设备注册的相关信息。
  • 验证设备文件的真实性
    虽然open成功,但/dev/uio0可能是一个空的设备节点(比如手动创建但未对应实际驱动)。通过udevadm info /dev/uio0查看设备节点的关联信息,确认其绑定到有效的UIO驱动。

内容的提问来源于stack exchange,提问作者Bar Ifrah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:57:15