Почему ядро не позволяет работать с файловой системой также, как это возможно в пользовательских приложениях?
Для реализации данной задачи мне пришлось прибегать к обману ядра в отношении адресации его памяти. Но это и не красиво, и не хорошо.
И как лучше поступать в описанной ситуации?
Спасибо.
>Почему ядро не позволяет работать с файловой системой также, как это возможно
>в пользовательских приложениях?
>Для реализации данной задачи мне пришлось прибегать к обману ядра в отношении
>адресации его памяти. Но это и не красиво, и не хорошо.
>
>И как лучше поступать в описанной ситуации?
>Спасибо.Дважды прочитал, ничего не понял. Молодой человек, попробуйте высказаться яснее. И объясните мне неразумному, чем системные вызовы open и read отличаются в ядре и в пользовательских приложениях?
>>Почему ядро не позволяет работать с файловой системой также, как это возможно
>>в пользовательских приложениях?
>>Для реализации данной задачи мне пришлось прибегать к обману ядра в отношении
>>адресации его памяти. Но это и не красиво, и не хорошо.
>>
>>И как лучше поступать в описанной ситуации?
>>Спасибо.
>
>Дважды прочитал, ничего не понял. Молодой человек, попробуйте высказаться яснее. И объясните
>мне неразумному, чем системные вызовы open и read отличаются в ядре
>и в пользовательских приложениях?Не уверен, но они должны отличаться, хотя бы проверкой прав, и т.п.
Все таки user space API - это тебе не kernel.
потому что для общения ядра с юзерспейс есть ioctl
>потому что для общения ядра с юзерспейс есть 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;
}
Так чего?
Кто-нибудь прольет свет на мою темную голову?
>Так чего?
>Кто-нибудь прольет свет на мою темную голову?
за такой код нужно отрывать йатца ИМХО. нет слов.по делу: а зачем вам понадобилось читать что-то из ядра?
если для конфигурации какого-нибудь драйверка, то гораздо грамотнее написать утилитку, которая будет читать этот файл и отдавать содержимое конф. структуры драйверу через IOCTL.
>>Так чего?
>>Кто-нибудь прольет свет на мою темную голову?
>
>
>за такой код нужно отрывать йатца ИМХО. нет слов.
>
>по делу: а зачем вам понадобилось читать что-то из ядра?
>если для конфигурации какого-нибудь драйверка, то гораздо грамотнее написать утилитку, которая будет
>читать этот файл и отдавать содержимое конф. структуры драйверу через IOCTL.
>
За что яйца-то?
>>Так чего?
>>Кто-нибудь прольет свет на мою темную голову?
>
>
>за такой код нужно отрывать йатца ИМХО. нет слов.
>
>по делу: а зачем вам понадобилось читать что-то из ядра?
>если для конфигурации какого-нибудь драйверка, то гораздо грамотнее написать утилитку, которая будет
>читать этот файл и отдавать содержимое конф. структуры драйверу через IOCTL.
>
Тема замята?
>>>Так чего?
>>>Кто-нибудь прольет свет на мою темную голову?
>>
>>
>>за такой код нужно отрывать йатца ИМХО. нет слов.
>>
>>по делу: а зачем вам понадобилось читать что-то из ядра?
>>если для конфигурации какого-нибудь драйверка, то гораздо грамотнее написать утилитку, которая будет
>>читать этот файл и отдавать содержимое конф. структуры драйверу через IOCTL.
>>
>
>
>Тема замята?нет
>>>>Так чего?
>>>>Кто-нибудь прольет свет на мою темную голову?
>>>
>>>
>>>за такой код нужно отрывать йатца ИМХО. нет слов.
>>>
>>>по делу: а зачем вам понадобилось читать что-то из ядра?
>>>если для конфигурации какого-нибудь драйверка, то гораздо грамотнее написать утилитку, которая будет
>>>читать этот файл и отдавать содержимое конф. структуры драйверу через IOCTL.
>>>
>>
>>
>>Тема замята?
>
>нетсам сейс пробовал подобный код
f_dentry->d_inode->i_size - возвращает 0 (правда файл находится на proc FS)на ext3 такого нет - все читается
>>>>>Так чего?
>>>>>Кто-нибудь прольет свет на мою темную голову?
>>>>
>>>>
>>>>за такой код нужно отрывать йатца ИМХО. нет слов.
>>>>
>>>>по делу: а зачем вам понадобилось читать что-то из ядра?
>>>>если для конфигурации какого-нибудь драйверка, то гораздо грамотнее написать утилитку, которая будет
>>>>читать этот файл и отдавать содержимое конф. структуры драйверу через IOCTL.
>>>>
>>>
>>>
>>>Тема замята?
>>
>>нет
>
>сам сейс пробовал подобный код
>f_dentry->d_inode->i_size - возвращает 0 (правда файл находится на proc FS)
>
>на ext3 такого нет - все читаетсяВсе правильно.
>>>>Так чего?
>>>>Кто-нибудь прольет свет на мою темную голову?
>>>
>>>
>>>за такой код нужно отрывать йатца ИМХО. нет слов.
>>>
>>>по делу: а зачем вам понадобилось читать что-то из ядра?
>>>если для конфигурации какого-нибудь драйверка, то гораздо грамотнее написать утилитку, которая будет
>>>читать этот файл и отдавать содержимое конф. структуры драйверу через IOCTL.
>>>
>>
>>
>>Тема замята?
>
>нет
Кстати, автор, тут ошибка:
length_readed = f->f_op->read(f, &size, 1024, &f->f_pos);
>>>>>Так чего?
>>>>>Кто-нибудь прольет свет на мою темную голову?
>>>>
>>>>
>>>>за такой код нужно отрывать йатца ИМХО. нет слов.
>>>>
>>>>по делу: а зачем вам понадобилось читать что-то из ядра?
>>>>если для конфигурации какого-нибудь драйверка, то гораздо грамотнее написать утилитку, которая будет
>>>>читать этот файл и отдавать содержимое конф. структуры драйверу через IOCTL.
>>>>
>>>
>>>
>>>Тема замята?
>>
>>нет
>
>
>Кстати, автор, тут ошибка:
>length_readed = f->f_op->read(f, &size, 1024, &f->f_pos);
Где? Если про 1024, так это только пример, а не отлаженный код :)
Можно заменить на "sizeof(any_struct)".
>Где? Если про 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);
>
>>Где? Если про 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);
Может быть. Писал по памяти.
>Может быть. Писал по памяти.ну а в остальном все верно, я полагаю, именно так и рекомендуют поступать все мануалы видимые мною