URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6062
[ Назад ]

Исходное сообщение
"чтение файла из ядра в Linux"

Отправлено Al , 08-Янв-07 00:24 
Почему ядро не позволяет работать с файловой системой также, как это возможно в пользовательских приложениях?
Для реализации данной задачи мне пришлось прибегать к обману ядра в отношении адресации его памяти. Но это и не красиво, и не хорошо.
И как лучше поступать в описанной ситуации?
Спасибо.

Содержание

Сообщения в этом обсуждении
"чтение файла из ядра в Linux"
Отправлено newser , 08-Янв-07 00:28 
>Почему ядро не позволяет работать с файловой системой также, как это возможно
>в пользовательских приложениях?
>Для реализации данной задачи мне пришлось прибегать к обману ядра в отношении
>адресации его памяти. Но это и не красиво, и не хорошо.
>
>И как лучше поступать в описанной ситуации?
>Спасибо.

Дважды прочитал, ничего не понял. Молодой человек, попробуйте высказаться яснее. И объясните мне неразумному, чем системные вызовы open и read отличаются в ядре и в пользовательских приложениях?


"чтение файла из ядра в Linux"
Отправлено JetSnaiL , 08-Янв-07 18:49 
>>Почему ядро не позволяет работать с файловой системой также, как это возможно
>>в пользовательских приложениях?
>>Для реализации данной задачи мне пришлось прибегать к обману ядра в отношении
>>адресации его памяти. Но это и не красиво, и не хорошо.
>>
>>И как лучше поступать в описанной ситуации?
>>Спасибо.
>
>Дважды прочитал, ничего не понял. Молодой человек, попробуйте высказаться яснее. И объясните
>мне неразумному, чем системные вызовы open и read отличаются в ядре
>и в пользовательских приложениях?

Не уверен, но они должны отличаться, хотя бы проверкой прав, и т.п.
Все таки user space API - это тебе не kernel.


"чтение файла из ядра в Linux"
Отправлено ppp , 09-Янв-07 00:54 
потому что для общения ядра с юзерспейс есть ioctl

"чтение файла из ядра в Linux"
Отправлено Al , 09-Янв-07 22:16 
>потому что для общения ядра с юзерспейс есть ioctl
Хорошо. Ну файл как прочитать?
Я это делаю примерно так:

static int sec_read_config_file(const char *fread) {
    int length_to_read, length_readed, i;
    char *buffer = NULL;
    struct file * f = NULL;
    mm_segment_t orig_fs;

    int err;
    
    f = filp_open(fread, O_RDONLY, 00);
    if (IS_ERR(f))
    {
    printk(KERN_ALERT "Error opening file.\n");
    goto error_out;
    }

    if (!f || !f->f_op || !f->f_op->read)
    goto error_out;
    
    length_to_read = f->f_dentry->d_inode->i_size;
    buffer = kmalloc(length_to_read+1, GFP_KERNEL);
    if(buffer == NULL)
    printk(KERN_ALERT "Error allocating buffer\n");

    f->f_pos = 0;

////////////////////////////////////////
//  ВНИМАНИЕ!!!!
//  Ключевой момент!!!

    orig_fs = get_fs();
    set_fs(KERNEL_DS);
////////////////////////////////////////

    any_struct *as;
    as = kmalloc(sizeof(any_struct), GFP_KERNEL);

    size_t size = 0;
    length_readed = f->f_op->read(f, &size, 1024, &f->f_pos);

    fput(f);
        
    kfree(buffer);
    
    return 0;

error_out:
    printk(KERN_ALERT "File (write object) is a NULL pointer!!! (%c) \n", f);
    return -1;
}


"чтение файла из ядра в Linux"
Отправлено Al , 10-Янв-07 21:01 
Так чего?
Кто-нибудь прольет свет на мою темную голову?

"чтение файла из ядра в Linux"
Отправлено int_0dh , 11-Янв-07 22:14 
>Так чего?
>Кто-нибудь прольет свет на мою темную голову?


за такой код нужно отрывать йатца ИМХО. нет слов.

по делу: а зачем вам понадобилось читать что-то из ядра?
если для конфигурации какого-нибудь драйверка, то гораздо грамотнее написать утилитку, которая будет читать этот файл и отдавать содержимое конф. структуры драйверу через IOCTL.


"чтение файла из ядра в Linux"
Отправлено Al , 12-Янв-07 19:53 
>>Так чего?
>>Кто-нибудь прольет свет на мою темную голову?
>
>
>за такой код нужно отрывать йатца ИМХО. нет слов.
>
>по делу: а зачем вам понадобилось читать что-то из ядра?
>если для конфигурации какого-нибудь драйверка, то гораздо грамотнее написать утилитку, которая будет
>читать этот файл и отдавать содержимое конф. структуры драйверу через IOCTL.
>


За что яйца-то?


"чтение файла из ядра в Linux"
Отправлено Berserk , 18-Янв-07 19:09 
>>Так чего?
>>Кто-нибудь прольет свет на мою темную голову?
>
>
>за такой код нужно отрывать йатца ИМХО. нет слов.
>
>по делу: а зачем вам понадобилось читать что-то из ядра?
>если для конфигурации какого-нибудь драйверка, то гораздо грамотнее написать утилитку, которая будет
>читать этот файл и отдавать содержимое конф. структуры драйверу через IOCTL.
>


Тема замята?


"чтение файла из ядра в Linux"
Отправлено Al , 18-Янв-07 19:26 
>>>Так чего?
>>>Кто-нибудь прольет свет на мою темную голову?
>>
>>
>>за такой код нужно отрывать йатца ИМХО. нет слов.
>>
>>по делу: а зачем вам понадобилось читать что-то из ядра?
>>если для конфигурации какого-нибудь драйверка, то гораздо грамотнее написать утилитку, которая будет
>>читать этот файл и отдавать содержимое конф. структуры драйверу через IOCTL.
>>
>
>
>Тема замята?

нет


"чтение файла из ядра в Linux"
Отправлено Berserk , 18-Янв-07 19:31 
>>>>Так чего?
>>>>Кто-нибудь прольет свет на мою темную голову?
>>>
>>>
>>>за такой код нужно отрывать йатца ИМХО. нет слов.
>>>
>>>по делу: а зачем вам понадобилось читать что-то из ядра?
>>>если для конфигурации какого-нибудь драйверка, то гораздо грамотнее написать утилитку, которая будет
>>>читать этот файл и отдавать содержимое конф. структуры драйверу через IOCTL.
>>>
>>
>>
>>Тема замята?
>
>нет

сам сейс пробовал подобный код
f_dentry->d_inode->i_size - возвращает 0 (правда файл находится на proc FS)

на ext3 такого нет - все читается


"чтение файла из ядра в Linux"
Отправлено Al , 18-Янв-07 21:22 
>>>>>Так чего?
>>>>>Кто-нибудь прольет свет на мою темную голову?
>>>>
>>>>
>>>>за такой код нужно отрывать йатца ИМХО. нет слов.
>>>>
>>>>по делу: а зачем вам понадобилось читать что-то из ядра?
>>>>если для конфигурации какого-нибудь драйверка, то гораздо грамотнее написать утилитку, которая будет
>>>>читать этот файл и отдавать содержимое конф. структуры драйверу через IOCTL.
>>>>
>>>
>>>
>>>Тема замята?
>>
>>нет
>
>сам сейс пробовал подобный код
>f_dentry->d_inode->i_size - возвращает 0 (правда файл находится на proc FS)
>
>на ext3 такого нет - все читается

Все правильно.


"чтение файла из ядра в Linux"
Отправлено Berserk , 18-Янв-07 19:31 
>>>>Так чего?
>>>>Кто-нибудь прольет свет на мою темную голову?
>>>
>>>
>>>за такой код нужно отрывать йатца ИМХО. нет слов.
>>>
>>>по делу: а зачем вам понадобилось читать что-то из ядра?
>>>если для конфигурации какого-нибудь драйверка, то гораздо грамотнее написать утилитку, которая будет
>>>читать этот файл и отдавать содержимое конф. структуры драйверу через IOCTL.
>>>
>>
>>
>>Тема замята?
>
>нет


Кстати, автор, тут ошибка:
length_readed = f->f_op->read(f, &size, 1024, &f->f_pos);


"чтение файла из ядра в Linux"
Отправлено Al , 18-Янв-07 21:20 
>>>>>Так чего?
>>>>>Кто-нибудь прольет свет на мою темную голову?
>>>>
>>>>
>>>>за такой код нужно отрывать йатца ИМХО. нет слов.
>>>>
>>>>по делу: а зачем вам понадобилось читать что-то из ядра?
>>>>если для конфигурации какого-нибудь драйверка, то гораздо грамотнее написать утилитку, которая будет
>>>>читать этот файл и отдавать содержимое конф. структуры драйверу через IOCTL.
>>>>
>>>
>>>
>>>Тема замята?
>>
>>нет
>
>
>Кстати, автор, тут ошибка:
>length_readed = f->f_op->read(f, &size, 1024, &f->f_pos);
Где? Если про 1024, так это только пример, а не отлаженный код :)
Можно заменить на "sizeof(any_struct)".



"чтение файла из ядра в Linux"
Отправлено Berserk , 18-Янв-07 21:44 

>Где? Если про 1024, так это только пример, а не отлаженный код
>:)
>Можно заменить на "sizeof(any_struct)".

совсем не 1024
f->f_op->read(f, &size, 1024, &f->f_pos);
второй аргумент буфер а не size
примерно так
br = filp->f_op->read(filp,buf,10,&filp->f_pos);


"чтение файла из ядра в Linux"
Отправлено Al , 18-Янв-07 21:58 
>
>>Где? Если про 1024, так это только пример, а не отлаженный код
>>:)
>>Можно заменить на "sizeof(any_struct)".
>
>совсем не 1024
>f->f_op->read(f, &size, 1024, &f->f_pos);
>второй аргумент буфер а не size
>примерно так
>br = filp->f_op->read(filp,buf,10,&filp->f_pos);
Может быть. Писал по памяти.



"чтение файла из ядра в Linux"
Отправлено Berserk , 18-Янв-07 22:07 

>Может быть. Писал по памяти.

ну а в остальном все верно, я полагаю, именно так и рекомендуют поступать все мануалы видимые мною