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
相关产品推荐
相关产品推荐

