Пейджинговый запрос ядра не выполняется в try_module_get () - PullRequest
2 голосов
/ 02 ноября 2010

Следующий код завершается ошибкой в ​​одном из моих модулей Linux-ядра

printk("This module: %p\n",THIS_MODULE);
DEBUG_USE_COUNT(p);
printk("This module refcount: %d\n", module_refcount(THIS_MODULE));
DEBUG_USE_COUNT(p);
if (!try_module_get(THIS_MODULE)) {
    printk_stderr("can't get module\n");
    return -EFAULT;
}

Сам код работает в обычной среде, но когда я пытаюсь выполнить его в функции, вызываемой из другого модуля, он завершается с ошибкой подкачки. (другому модулю передается указатель на соответствующую функцию во время инициализации) Есть идеи, почему модуль не может увеличить свой счетчик ссылок, вызываемый из другого модуля? Существуют ли какие-либо особые ограничения, применимые к вызову try_get_module?

[ 7888.065029] BUG: unable to handle kernel paging request at fa69206
8
[ 7888.067470] IP: [<f926a2b6>] _ZL18open_station_sharePKcP23__camac_
kernel_open_argP4file+0x84/0x8ec [camac_k0607_lsi6] //function in question, calling try_module_get()
[ 7888.069014] Call Trace:
[ 7888.069014]  [<c10ac2b7>] ? __kmalloc+0x104/0x110
[ 7888.069014]  [<c12518f5>] ? printk+0xe/0x11
[ 7888.069014]  [<f90fae79>] ? T.633+0x46/0x4b [camac_mx]
[ 7888.069014]  [<f90fb07e>] ? camac_mx_ioctl+0x200/0x228 [camac_mx] //function of another module that calls the one in question
[ 7888.069014]  [<c10ba415>] ? vfs_ioctl+0x58/0x72
[ 7888.069014]  [<c10ba966>] ? do_vfs_ioctl+0x492/0x4d6
[ 7888.069014]  [<c109007b>] ? shmem_parse_options+0x167/0x281
[ 7888.069014]  [<c10ae69e>] ? fd_install+0x1b/0x38
[ 7888.069014]  [<c10ae88b>] ? do_sys_open+0xc8/0xdd
[ 7888.069014]  [<c10ba9ee>] ? sys_ioctl+0x44/0x64
[ 7888.069014]  [<c100305b>] ? sysenter_do_call+0x12/0x28

Было бы также неплохо, если бы кто-нибудь объяснил мусор на верхней части печатной стопки. В кросс-модульном вызове не должно быть никаких функций. Три верхние функции в стеке для меня не имеют смысла.

1 Ответ

1 голос
/ 10 ноября 2010

THIS_MODULE может принимать значение NULL, если конкретный исходный файл скомпилирован в ядро, а не как часть модуля, а module_refcount не нравится получение NULL.

Кроме того, использование C ++ в модулях ядране рекомендуется, так как это может помешать во всем (подумайте об исключениях и тому подобном).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...