我正在为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:Permission denied"
我已经检查了文件的权限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
输出中?
我假设你通常不是你的bash shell的root.然后这个命令行
sudo echo 54 > /dev/scull
不是你的想法.该命令分两步执行:
bash设置输出重定向,即它尝试/dev/scull
使用当前用户权限打开.
sudo echo 54
执行该命令,然后stdout
连接到该文件.
由于您没有作为非root用户的写入权限,因此第一步失败并且bash报告
"bash:/ dev/scull:Permission denied"
您必须已经root
设置输出重定向.这样执行
sudo -i
它为您提供了具有root权限的交互式shell.你可以执行
echo 54 > /dev/scull
在那个root shell中.