LINUX.ORG.RU

Все те же сисколлы....


0

0

Доброе время суток.
Либо я гоню, либо одно из двух. Объясните юродивому, в чем косяк. Вот кусочек кода ядерного модуля:
int init_module()
{
char buff[] = {"This is a testing kernal module\n"};
struct file* f = filp_open("/tttt/kmodule.log",O_CREAT | O_WRONLY,0);
f->f_op->write(f, (char*)buff, strlen(buff),&f->f_pos);
filp_close(f,NULL);
return 0;
}
В результате его выполнения создается файл /tttt/kmodule.log, пустой. То есть в него ничего не записалось. Ни на этапе компиляции, ни на этапе загрузки/выполнения ни ошибок , ни варнингов не проявилось. Так в чем косяк??? Что я не так делаю???

To Murr: /usr/src/linux/kernel/acct.c я смотрел

Все сделано грамотно за исключением одного момента.
Буфера ты передаешь в адресном пространстве ядра, поэтому при попытке скопировать данные из этих буферов обламывается assert, сверяющий current->addrlim с 0xc0000000.

Чтобы обойти это есть две замечательных вызова, которым нужно оборачивать write -
set_fs(KERNEL_DS);
f->f_op->...
set_fs(USER_DS);

Успехов!

Murr ★★
()
Ответ на: комментарий от SnakePAN

Да, когда ты передаешь буфер в какую-либо "несистемную" функцию нужно менять addrlim.

Если не уверен является ли функция "системной" или нет - все равно можешь менять - ничего страшного не будет. Главное - не забывать его вернуть обратно ;)

Кстати, во многих ОС в прототипах добавляют пустые идентификаторы вроде "__user" или "__kernel", в Linux этого к сожалению нет, но по ходу делать быстро разберешься какие буфера принимают какие функции. :)

Murr ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.