标签: chardev

Linux 内核:设置通过 create_device() 创建的 /dev 文件的权限

我正在制作一个小型 Linux 模块,它是 char 设备的驱动程序。在我的代码中,我创建了设备类,而不是设备本身,因此在我的系统中创建了一个 /dev 文件。问题是/dev文件只有root权限,而用户对该文件既没有读、写也没有执行权限,我想更改/dev文件权限。

我在网上搜索了答案,发现是更改 udev 文件,但此解决方案在我的情况下不起作用,因为我需要在模块加载到内核时动态更改的权限。我正在编写的模块并不总是在我的机器上运行,因此我需要它来“动态”更改权限。

major_number_firewall = register_chrdev(0, device_name_firewall, &my_file_implementation_firewall);

device_class = class_create(THIS_MODULE, class_name_firewall);

log_file_device = device_create(device_class, NULL, MKDEV(major_number_firewall, MINOR_LOG), NULL, device_name_log_file);
Run Code Online (Sandbox Code Playgroud)

有没有修改权限的功能?

linux permissions linux-kernel chardev

3
推荐指数
1
解决办法
9315
查看次数

为什么 cat 调用 read() 两次就足够了?

我是 Linux 内核模块的新手。我正在根据网络课程学习字符驱动程序模块。我有一个非常简单的模块来创建/dev/chardevexample,我有一个问题需要了解:

当我这样做时echo "hello4" > /dev/chardevexample,我会write按预期看到执行一次。但是,当我这样做时cat /dev/chardevexample,我看到读取执行了两次

我在我的代码和课程材料中都看到了这一点。第一次返回了所有数据read(),为什么还要cat再次调用呢?

到目前为止我所做的所有事情如下:

  1. insmod chardev.ko加载我的模块
  2. echo "hello4" > /dev/chardevexample。这是写入,我在 dmesg 中看到它只发生一次
  3. cat /dev/chardevexample。这是读取的内容,并且dmesg显示它发生了两次。
  4. 我做到了strace cat /dev/chardevexample,而且我确实看到函数调用被调用两次以进行读取。中间也有写

    read(3, "hello4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 131072) = 4096
    write(1, "hello4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"...,    4096hello4) = 4096
    read(3, "", 131072)
    
    Run Code Online (Sandbox Code Playgroud)
  5. dmesg读取后(cat 命令)

    [909836.517402] DEBUG-device_read: To User  hello4 and bytes_to_do 4096 ppos 0 # Read #1 
    [909836.517428] DEBUG-device_read: Data send to app hello4, …
    Run Code Online (Sandbox Code Playgroud)

linux kernel kernel-module chardev

2
推荐指数
1
解决办法
1400
查看次数