【问题标题】:How to duplicate a Linux device file?如何复制 Linux 设备文件?
【发布时间】:2013-05-06 19:42:27
【问题描述】:

在我们的系统中,我们在/dev/mem 文件上使用mmap() 来访问内存映射的硬件设备。但是,使用此设备文件需要以超级用户模式 ​​(sudo) 运行应用程序才能写入物理设备。我们正在寻找摆脱这种限制的方法。

据说可以更改设备文件的访问权限。但是,这不是推荐的解决方案。

我们的一个建议是,我们可以复制/dev/mem 设备,更改其写入权限,然后在新设备上使用mmap(),而不是为硬件编写新的、完整的内核模式设备驱动程序。

阅读了一些手册页,我找到了mknod 命令。所以我用它创建了一个特殊的文件,emem,具有与/dev/mem 文件相似的属性(尤其是设备的主要和次要版本)。在我的程序中使用新文件,我仍然需要duso。因此,我将其属性更改为完全的 r/w 权限,但并没有改变对 sudo 的需求。

接下来,我尝试将dev/mem本身的权限更改为0777,但也没有用。

这会导致以下问题:

  1. sudo 权限的需求是来自使用mmap() 还是来自它映射的特定设备?

  2. 如果是前者,如何消除?

  3. 如果是后者,我怎样才能复制 /dev/mem 功能,并拥有完整权限?

【问题讨论】:

  • 正确的方法是制作一个内核存根驱动程序,它允许访问所需的特定资源,或者以root身份运行一个用户空间守护进程来代理请求以相同的限制过滤。
  • @ChrisStratton - 谢谢。从长远来看,编写一个合适的驱动程序是我的意图。现在,由于缺乏时间(以及内核模式编程方面的经验),我正在寻找一种方便的解决方法。
  • 复制设备节点是没有意义的,因为它会产生与修改现有节点权限相同的问题和后果。

标签: linux linux-device-driver mmap hardware-interface memory-mapping


【解决方案1】:

根据http://www.raspberrypi.org/phpBB3/viewtopic.php?f=29&t=22515

要打开 /dev/mem,您需要在 设备文件和安全能力 CAP_SYS_RAWIO,或者是 root。 没有办法解决这个问题,因为对内存的完全访问允许 不仅仅是GPIO。它具有巨大的安全隐患。

这大概是在mem 设备驱动程序中检查的。

解决方案是为需要能够访问/dev/mem 的用户提供CAP_SYS_RAWIO 能力,并将他们放入kmem 用户组(对设备具有读取权限)。

【讨论】:

  • 正确:在当前内核中,/dev/mem 上的 open 调用被检查为:return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;。见drivers/char/mem.c
  • 谢谢。所以,这意味着我不能为此目的使用/dev/mem。那么,如何复制设备驱动程序本身,并根据我的需要进行设置?
  • .. 等等 - 根据@duskwuff 的说法,如果我理解正确的话,这种保护已被纳入驱动程序代码本身,对吧?
  • 您可以重新编译内核并修改该行。但请参阅我的更新答案。
  • 通过 setuid/sudo 允许 LD_LIBRARY_PATH 是一个巨大的安全漏洞,因为它允许您将标准 C 库替换为可以执行任何操作的版本。您应该将您需要的内容封装在程序中,并将它们设置为 setuid。
猜你喜欢
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 2021-08-25
相关资源
最近更新 更多