我正在为Linux内核编写基本的char设备驱动程序。 为此,我考虑的代码流如下:
alloc_chrdev_region()
- >使用主要号码的动态分配class_create()
- >在sysfs中创建设备类device_creat()
- >在/ dev / cdv_init()
- >初始化char设备结构cdev_add()
- >在内核中添加我的设备结构我在代码中添加了read,write,open,release方法。
当我尝试在/ dev /下读取设备文件时,调用read方法。 但是当我尝试使用echo在/ dev / file上写入时会出现错误
" 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 Written\n");
return 0;
}
我在这里寻找的行为是,我应该能够在'Device Written'
输出中看到dmesg
吗?
答案 0 :(得分:7)
我认为你通常不是bash shell的root用户。然后这个命令行
sudo echo 54 > /dev/scull
不是你的想法。该命令分两步执行:
/dev/scull
。sudo echo 54
,而stdout
已连接到文件。由于您没有非root用户的写入权限,因此第一步失败,bash报告
" bash:/ dev / scull:权限被拒绝"
您必须已root
才能设置输出重定向。因此执行
sudo -i
为您提供具有root权限的交互式shell。你可以执行
echo 54 > /dev/scull
在那个root shell中。
答案 1 :(得分:1)
我知道线程太旧而无法回答但是如果有人想要在不切换到root用户的情况下知道替代方法,这里是解决方案:
sudo bash -c 'echo "54" > /dev/my_dev'
答案 2 :(得分:1)
我想指出,在您的系统上,只有root(文件所有者)具有读/写权限。您的(普通)用户帐户还没有!因此,另一个(快速)解决方案是为所有用户提供读/写权限。
可能这不是最安全的解决方案!仅在您的测试环境中这样做!
sudo chmod a+rw /dev/scull
但是现在您可以使用用户帐户(没有sudo)测试模块了
echo "hello, world!" > /dev/scull
cat < /dev/scull
答案 3 :(得分:0)
您可以在使用命令
执行root操作时执行此操作sudo su
然后进入/dev
文件夹并输入您的命令(将数据保存到/dev/scull
)。
cd /dev
echo 54 > scull