Виртуальный файл Linux в качестве драйвера устройства - PullRequest
2 голосов
/ 13 января 2012

Я пишу драйвер устройства char linux для имитации файла.Данные хранятся в массиве, и я хочу реализовать обработчик «read-file» ...

static ssize_t data_read(struct file *f, char __user *buf, size_t count, loff_t *f_pos){
char *msg_pointer;
int bytes_read = 0;

if(vault.storage==NULL)
    return -EFAULT;

msg_pointer = vault.storage + *f_pos;

while (count && (*f_pos < vault.size) ) {
    put_user(*(msg_pointer++), buf++);
    count--;
    bytes_read++;
    ++*f_pos;
}

return bytes_read;
}

vault.storage - указатель на создание kmalloc.Если я тестирую код, копируя с помощью dd, он работает как положено, но когда я хочу открыть файл с помощью C

if((fp_data = open("/dev/vault0", O_RDWR)) < 0){
    perror("could not open file.\n");
}

err = write(fp_data, "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", 36);

if (err < 0){
    perror("failed to write to sv \n");
} 

read(fp_data, buffer, 36);
read(fp_data, buffer, 36);

, первая команда чтения возвращает 4 .. вторая 0 - как это возможно?

Ответы [ 2 ]

3 голосов
/ 13 января 2012

write, выполняемое для файла, не гарантирует запись всех байтов, запрошенных атомарно ... это зарезервировано для канала или FIFO, только когда запрошенное количество записи меньше PIPE_BUF в размере.Например, write может быть прервано сигналом после записи некоторых байтов, и будут другие случаи, когда write не будет выводить полное количество запрошенных байтов перед возвратом.Поэтому вам следует проверить количество записанных байтов перед чтением любой информации в буфер, чтобы убедиться, что вы пытаетесь выполнить повторное чтение того же количества записанных байтов.

0 голосов
/ 18 января 2012

Вставьте printk в вызов data_read, напечатайте счетчик и напечатайте то, что возвращается пользователю (проверьте значение bytes_read). Bytes_read возвращается к вызову read () в пространстве использования. Убедитесь, что вы возвращаете правильное значение. И вы также можете распечатать Fpos и проверить, что происходит.

Здесь я предполагаю, что функции чтения и записи драйверов вызываются правильно, я имею в виду, что старшие и младшие номера файла вашего устройства принадлежат вашему драйверу

...