更改IOctl cdev的默认权限

时间:2020-03-04 11:40:47

标签: c linux linux-kernel ioctl chardev

我正在从Android设备上的本机OpenGL框架添加IOctl调用,这样我就可以通过跟踪内核模块在内核中记录帧信息。在我的内核模块中,我为IOctl调用创建了cdev,但是问题是我的开发人员的默认权限是6000,并且由于用户级IOctl调用来自非root用户进程,因此{{1} }调用无法打开open调用所需的文件解密器。

我的cdev方法非常标准,如下所示(注意ioctl是尝试修复权限,请参见this)。

devnode

类似地,将杂项开发与static dev_t dev; static struct cdev c_dev; static struct class *cl; static char *device_node(struct device *dev, umode_t *mode) { if(!mode) return NULL; *mode=0666; return kasprintf(GFP_KERNEL, "%s", dev_name(dev)); } static int IOctlInit(void) { int ret; struct device *dev_ret; if((ret = alloc_chrdev_region(&dev, FIRST_MINOR, MINOR_CNT, EGL_SYSLOGGER_NAME))) return ret; cdev_init(&c_dev, &syslog_EGL_fops); if((ret = cdev_add(&c_dev, dev, MINOR_CNT)) < 0) return ret; if(IS_ERR( cl = class_create(THIS_MODULE, EGL_SYSLOGGER_NAME "char"))) { cdev_del(&c_dev); unregister_chrdev_region(dev, MINOR_CNT); return PTR_ERR(cl); } cl->devnode = device_node; if(IS_ERR(dev_ret = device_create(cl, NULL, dev, NULL, EGL_SYSLOGGER_NAME))) { class_destroy(cl); cdev_del(&c_dev); unregister_chrdev_region(dev, MINOR_CNT); return PTR_ERR(cl); } return 0; } 一起使用时,我也遇到相同的问题

.mode=0666

两种方法都可以在运行static struct miscdevice misc_dev = { .minor = MISC_DYNAMIC_MINOR, .name = EGL_SYSLOGGER_NAME, .fops = &syslog_EGL_fops, /** .mode = S_IRWXUGO, */ .mode = 0666, }; static `enter code here`int IOctlInit(void) { int ret; ret = misc_register(&misc_dev); if(ret) printk("Unable to register EGL IOctl misc dev\n"); printk("Misc dev registered\n"); return 0; } 时起作用,但是我希望找到不需要这种干预的解决方案。根据{{​​3}}的说法,杂项开发方法应该可以解决我的问题,但我没有成功。

我不确定我错过了什么,将不胜感激一些技巧。

欢呼

0 个答案:

没有答案