Понимание loff_t *offp для файловых_операций

Я разрабатываю драйвер устройства, который просто читает и записывает в буфер символов. Однако мой вопрос касается двух функций в структуре file_operationsreadи write. Я не совсем понимаю, что такое loff_t *offp. Я знаю, что для операций чтения и записи *offpявляется смещением файла, означающим текущую позицию чтения/записи файла, однако я даже не уверен, что значит писать или читать в/ из файла устройства.

Из того, что я понял, и вот как я пишу и читаю с моего устройства, я создаю структуру, которая представляет мое устройство, которое я называю my_char_struct, как показано ниже.

struct my_char_structure{
    struct cdev my_cdev;
    struct semaphore sem;
    char *data;
    ssize_t data_size;
    unsigned int access_key;
    unsigned long size;
};

Это статическая структура, которая инициализируется и указывает на нее, когда мой драйвер insmodкак таковой.

static dev_t dev_num;
static struct my_char_structure Dev;

int start_mod(void){
    //Because we are dealing with a fictitious device, I want
    //the driver to create my two devices with arbitrarily 
    //assigned major numbers.
    struct my_char_structure *my_dev = &Dev;
    int err;

    alloc_chrdev_region(&dev_num, FIRST_MINOR, COUNT, DEVICE_NAME);

    sema_init(&(my_dev->sem),1);

    cdev_init(&(my_dev->my_cdev), &fops);
    my_dev->my_cdev.owner = THIS_MODULE;
    my_dev->my_cdev.ops = &fops;// fops is my file operations struct

    err = cdev_add(&my_dev->my_cdev, dev_num, COUNT);
    if(err<0)
        printk(KERN_ALERT "There was an error %d.",err);
    printk(KERN_ALERT " insmod to major number %d",MAJOR(dev_num));

    return 0;   
}

module_init(start_mod);

Когда мое устройство открыто, я просто делаю указатель на открытый файл, чтобы он указывал на ту статическую структуру, которую я установил во время module_init(start_mod), как таковую...

int dev_open(struct inode *in_node, struct file *filp){
    static struct my_char_structure *my_dev;
    my_dev = container_of(in_node->i_cdev, struct my_char_structure, my_cdev);
    printk(KERN_ALERT "The device number is %d",iminor(in_node));
    if(!my_dev)
        printk(KERN_ALERT "something didn't work. my_dev not initialized.");
    filp->private_data = my_dev;
    return 0;
}

Что мои методы чтения и записи изменяют исходную структуру Dev, на которую я указал в своих открытых файлах. Все, что я копирую_в_пользователяиз своей структуры, является тем, что пользователь считает записанным на устройство, и тем, что я копирую_из_пользователяпользователь думает, что пишет.Но помимо изменения исходной структуры Dev, идея позиции или смещения в файле не имеет смысла, если только она не относится к указателю на буферизованную память в ядре для какой-то произвольной структуры или типа. Это единственная интерпретация смещения файла, которая у меня есть... правильно ли это? Это то, к чему здесь относится loff_t *offp?

write(struct file *filp, const char __user *buff, size_t count, loff_t *offp)
read(struct file *filp, char __user *buff, size_t count, loff_t *offp)

(при условии, что я правильно понял) Когда вызывается какая-то файловая_операция, такая как чтение/запись, а я лично не установил *offp, какое значение первоначально установлено для loff_t *offp?

Если в последней файловой_операции offp = некоторый_произвольный_адрес (потому что я так сказал), будет ли установлено значение offp при повторном вызове этой операции?

Что произойдет, если у меня будут запущены другие операции file_opens, будет ли она установлена ​​на то, что оставила последняя операция file_operation, или она сохранит вкладку той операции file_open, которую она использовала, и заменит *offp на то, что было в file_open?

Концепция символьного устройства для меня слишком абстрактна, когда кажется, что само устройство даже не хранит информацию, как файл, а скорее его драйвер, который сохраняет информацию. Надеюсь, я объяснил свою туманность и проясню все, что кажется мне двусмысленным.

21
задан Mateusz Piotrowski 29 August 2017 в 16:51
поделиться