I’m writing a basic char device driver for Linux kernel. For this, the code flow I have considered is as follows:
alloc_chrdev_region()
-> to use dynamic allocation of major numberclass_create()
-> to create device class in sysfsdevice_creat()
-> to create device under /dev/cdv_init()
-> to initialize char device structurecdev_add()
-> to add my device structure in kernel
I have added read, write, open, release methods in code.
When I try to read device file under /dev/ my read method is called. But when I try to write on /dev/ file using echo it gives error
“bash: /dev/scull: Permission denied”
I have checked permissions of file using ls -l
, and I have permissions to read or write on this file.
This problem occurs for every device driver module I have written. It works well in on another machine.
I’m working on ubuntu 15.10, custom compiled kernel 4.3.0
the result of
ls -l /dev/scull
:crw------- 1 root root 247, 0 Dec 30 18:06 /dev/scull
the exact command I used to open the file
$ sudo echo 54 > /dev/scull
the source code for the open implementation
ssize_t scull_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos){ pr_alert("Device Writtenn"); return 0; }
Behavior I’m seeking here is, I should be able to see 'Device Written'
in dmesg
ouput?
Advertisement
Answer
I assume that you are normally not root on your bash shell. Then this command line
sudo echo 54 > /dev/scull
does not what you think. The command is executed in two steps:
- The bash setups the output redirection, i.e., it tries to open
/dev/scull
with the current user privileges. - The command
sudo echo 54
is executed whereasstdout
is connected to the file.
As you have no write-permissions as non-root user, the first step fails and the bash reports
“bash: /dev/scull: Permission denied”
You must already be root
to setup the output redirection. Thus execute
sudo -i
which gives you an interactive shell with root privileges. The you can execute
echo 54 > /dev/scull
within that root shell.