【发布时间】:2013-05-06 19:42:27
【问题描述】:
在我们的系统中,我们在/dev/mem 文件上使用mmap() 来访问内存映射的硬件设备。但是,使用此设备文件需要以超级用户模式 (sudo) 运行应用程序才能写入物理设备。我们正在寻找摆脱这种限制的方法。
据说可以更改设备文件的访问权限。但是,这不是推荐的解决方案。
我们的一个建议是,我们可以复制/dev/mem 设备,更改其写入权限,然后在新设备上使用mmap(),而不是为硬件编写新的、完整的内核模式设备驱动程序。
阅读了一些手册页,我找到了mknod 命令。所以我用它创建了一个特殊的文件,emem,具有与/dev/mem 文件相似的属性(尤其是设备的主要和次要版本)。在我的程序中使用新文件,我仍然需要duso。因此,我将其属性更改为完全的 r/w 权限,但并没有改变对 sudo 的需求。
接下来,我尝试将dev/mem本身的权限更改为0777,但也没有用。
这会导致以下问题:
对
sudo权限的需求是来自使用mmap()还是来自它映射的特定设备?如果是前者,如何消除?
如果是后者,我怎样才能复制
/dev/mem功能,并拥有完整权限?
【问题讨论】:
-
正确的方法是制作一个内核存根驱动程序,它允许仅访问所需的特定资源,或者以root身份运行一个用户空间守护进程来代理请求以相同的限制过滤。
-
@ChrisStratton - 谢谢。从长远来看,编写一个合适的驱动程序是我的意图。现在,由于缺乏时间(以及内核模式编程方面的经验),我正在寻找一种方便的解决方法。
-
复制设备节点是没有意义的,因为它会产生与修改现有节点权限相同的问题和后果。
标签: linux linux-device-driver mmap hardware-interface memory-mapping