Смещение драйвера символьного устройства в операции чтения - PullRequest
0 голосов
/ 09 января 2020

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?

На странице руководства это упоминается как позиция смещения пользователя.

Может кто-нибудь объяснить мне, в чем польза от смещения?

1 Ответ

1 голос
/ 09 января 2020

«Позиция смещения» - это позиция в файле, где код пользовательского пространства читает или записывает. Когда вы делаете echo "hi" > /dev/device_name, вы записываете в начало файла, которое является позицией 0. Вы можете проверить запись в другую позицию из командной строки, используя, например, echo "hi" | dd of=/dev/device_name seek=2000

Примечание. : вам нужно обновить самостоятельно . Если код пользовательского пространства записывает 4000 байтов, вы должны увеличить * смещение на 4000. В противном случае, если они записывают еще 4000 байтов после этого, * смещение все равно будет 0, и они перезапишут первые 4000 байтов вместо следующих 4000.

...