【发布时间】:2012-08-04 12:07:17
【问题描述】:
我最近在工作中继承了一些代码,这是旧的 2.4.X linux 内核驱动程序,我的任务是让它们在更新的 2.6 或更高版本的内核上工作。我在带有 3.1.10 内核的 OpenSUSE 12.1 上运行。
我已将 register_chrdev() 中的原始代码更新为使用 class_create()/device_create() 调用,并且我可以看到我的设备正确显示在 /dev 中。我当前的问题是我的设备的权限被设置为 r/w 仅供用户使用:
crw------- 1 root root 244, 0 Aug 7 07:57 gcanain
我知道我可以通过命令行“chmod”文件,或者我可以设置 udev 权限...但是无论如何可以通过编程方式执行此操作,这样当我发出 insmod 命令时,将安装 dev是否已经制定了正确的规则?
是否有任何可能存在的 API 可供我调用来执行此操作,这些创建 API 之一中我缺少的任何选项?
澄清一下,我不想使用 udev 规则的部分原因是我不提前知道设备驱动程序的名称。设备驱动程序是在循环中生成的,因此名称会附加一个数字,nNumDevs 几乎可以是任何东西:
for (i = 0; i < nNumDevs; i++) {
strcpy(Modname,GC_ANAIN_MODULE_NAME);
strcat(Modname,"%d");
device_create(c1, NULL, MKDEV(nMajor, GC_ANAIN_MINOR_VERSION+i), NULL, Modname, i);
}
【问题讨论】:
-
我认为你应该继续使用
udev。设备权限通常是本地管理员的权限,他们可能对访问有与设备驱动程序作者不同的想法。您可以在/etc/udev/rules.d或其他内容中删除默认设置。 -
明白,但我们(我的小组)是系统的管理员,所以如果我希望所有东西都有 777,我可以这样做。此外,我在使用 rules.d(在原始描述中更新)时遇到问题,因为设备驱动程序的名称是动态创建的……除非我误解了如何使用 udev。
-
@Mike:但 udev 规则可以使用通配符来匹配设备名称 (
KERNEL=="foo*"),也可以匹配驱动程序名称 (DRIVERS=="bar")。 -
@Mike 你解决了这个问题吗?我需要为 android 内核做同样的事情吗?
-
你能接受答案吗?
标签: c permissions linux-device-driver