2015-06-23 2 views
1

Я пишу свой первый модуль ядра, и это простой модуль ядра Hello World. Следующее руководство tldp говорит, что insmod не загружает модуль, если функция init_module возвращает ненулевое значение. Он работает как ожидалось, возвращая некоторое отрицательное число, но, экспериментируя, я заметил, что insmod загружает мой модуль, даже когда возвращаемое значение положительно.insmod not throwing error for a return return

Пожалуйста, объясните почему?

Например, если я вернусь -185, insmod сразу говорит, что он не может загрузить модуль.

Но когда я вернусь 185, он информирует о подозрительном возврате, но все еще загружает модуль. Это журнал для «возвращения 185».

[19398.947857] do_init_module: 'hello_1'->init suspiciously returned 185, it should follow 0/-E convention 
do_init_module: loading module anyway... 
[19398.947859] CPU: 0 PID: 11812 Comm: insmod Tainted: P   OE 3.19.0-15-generiC#15-Ubuntu 
[19398.947860] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 
[19398.947861] ffffffffc06c3000 ffff880059347d98 ffffffff817c2205 0000000000000007 
[19398.947862] ffffffffc06c3018 ffff880059347ee8 ffffffff810f9a2d ffffffff810f51d0 
[19398.947864] ffff8800db64ad10 ffff880059347e40 ffffffffc06c3018 ffffffffc0391000 
[19398.947865] Call Trace: 
[19398.947869] [<ffffffff817c2205>] dump_stack+0x45/0x57 
[19398.947872] [<ffffffff810f9a2d>] load_module+0x160d/0x1ce0 
[19398.947873] [<ffffffff810f51d0>] ? store_uevent+0x40/0x40 
[19398.947875] [<ffffffff810fa276>] SyS_finit_module+0x86/0xb0 
[19398.947877] [<ffffffff817c934d>] system_call_fastpath+0x16/0x1b 

И это печатается на консоли для "возвращения -185"

insmod: ERROR: could not insert module hello-1.ko: Unknown error 185 

ответ

0

init_module функция должна возвращать либо 0 или отрицательный код ошибки. Вы можете обработать возвращаемое положительное значение как ведущее к undefined behaviour.

Текущее ядро ​​интерпретирует положительное значение как success, но выводит предупреждение в системный журнал. Этот журнал можно прочитать, используя dmesg.