我正在为Linux内核编写一个基本的char设备驱动程序。为此,我考虑的代码流如下:
alloc_chrdev_region()
->使用主号码的动态分配class_create()
->在sysfs中创建设备类device_creat()
->在/dev/下创建设备/cdv_init()
->初始化字符设备结构cdev_add()
->在内核中添加我的设备结构
我在代码中添加了读、写、打开和发布方法。
当我尝试在/dev/下读取设备文件时,会调用我的读取方法。但当我尝试使用echo在/dev/文件上写入时,它会出现错误
"bash:/dev/scull:权限被拒绝"
我已经使用ls -l
检查了文件的权限,并且我有权读取或写入此文件。
我编写的每个设备驱动程序模块都会出现此问题。它在另一台机器上运行良好。
我正在开发ubuntu 15.10,自定义编译的内核4.3.0
-
ls -l /dev/scull
:的结果crw------- 1 root root 247, 0 Dec 30 18:06 /dev/scull
-
我用来打开文件的确切命令
$ sudo echo 54 > /dev/scull
-
开放实现的源代码
ssize_t scull_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos){ pr_alert("Device Writtenn"); return 0; }
我在这里寻求的行为是,我应该能够在dmesg
输出中看到'Device Written'
?
我假设您通常不是bash shell的root用户。然后这个命令行
sudo echo 54 > /dev/scull
不是你想的那样。该命令分两步执行:
- bash设置输出重定向,即尝试使用当前用户权限打开
/dev/scull
- 命令CCD_ 11被执行,而CCD_
由于您作为非root用户没有写权限,第一步失败,bash报告
"bash:/dev/scull:权限被拒绝"
您必须已经是root
才能设置输出重定向。从而执行
sudo -i
它为您提供了一个具有root权限的交互式shell。您可以执行
echo 54 > /dev/scull
在根壳内。
我知道线程太老了,无法回答,但如果有人想知道另一种方法而不切换到根用户,这里有解决方案:
sudo bash -c 'echo "54" > /dev/my_dev'
我想注意的是,在您的系统上,只有root(文件所有者)具有读/写权限。您的(正常)用户帐户没有!因此,另一个(快速)解决方案是授予所有用户读/写权限。
这可能不是最安全的解决方案!只能在测试环境中执行此操作
sudo chmod a+rw /dev/scull
但现在你用你的用户帐户测试你的模块(没有sudo)
echo "hello, world!" > /dev/scull
cat < /dev/scull
您可以在使用命令进行root操作时执行此操作
sudo su
然后进入/dev
文件夹并输入命令(将数据保存到/dev/scull
中)。
cd /dev
echo 54 > scull