【问题标题】:character device driver's offset in read operation字符设备驱动程序在读取操作中的偏移量
【发布时间】:2020-01-09 20:35:54
【问题描述】:

static ssize_t read(struct file *file, char  *buff, size_t len, loff_t *offset)
{
    printk(KERN_INFO "write\n");
    return    simple_read_from_buffer(buff, len, offset, ker_buff, SIZE);
}

static ssize_t write(struct file *file, const char  *buff, size_t len, loff_t *offset)
{
    printk(KERN_INFO "read\n");
    printk(KERN_INFO "your offset is:%lu\n",(long)offset);

    return      simple_write_to_buffer(ker_buff, SIZE, offset, buff, len);
}

当我执行echo "hi" > /dev/device_name 时,我得到了输出:

read
your offset is 0 as output.`

为什么我得到 0?

在手册页中,它被称为用户的偏移位置。

谁能解释一下offset有什么用?

【问题讨论】:

  • 您正在打印一个地址!尝试打印*offset 而不是(long)offset
  • 您是否希望 offset 具有不同的价值?
  • 您真的打印的是(long)offset 而不是(long)*offset?如果是这样,offset 指针似乎是NULL,但只有驱动程序的open 文件处理程序调用stream_open() 时才会出现这种情况。需要注意的是simple_read_from_buffer()simple_write_to_buffer() 无条件地取消引用offset 指针,所以如果offsetNULL 则会导致内核Oops。

标签: c linux-device-driver


【解决方案1】:

“偏移位置”是文件中用户空间代码正在读取或写入的位置。当您执行echo "hi" > /dev/device_name 时,您正在写入文件的开头,即位置 0。您可以使用例如echo "hi" | dd of=/dev/device_name seek=2000

来测试从命令行写入不同的位置

注意:您需要自己更新。如果用户空间代码写入 4000 字节,则应将 *offset 增加 4000。否则,如果在此之后再写入 4000 字节,*offset 仍将为 0,并且它们将覆盖前 4000 字节而不是下一个 4000。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-19
    • 2013-06-27
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    相关资源
    最近更新 更多