- 'ring 0' и Написание модуля ядра на C/C++, proglammer, 00:16 , 20-Фев-05 (1)
господи... не "моду" а могу, и не "ом" а он.
- 'ring 0' и Написание модуля ядра на C/C++, Murr, 17:37 , 20-Фев-05 (3)
mymodule.c ---> #define __KERNEL__ #define MODULE#include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> static int mymodule_init() { printk("hello,world\n"); return 0; } static void mymodule_done() { } module_init(); module_exit(); ---> gcc -I/lib/modules/`uname -r`/build include mymodule.c -o mymodule.o -c ---> Если хочешь получить ассемблерный код, то замени "-c" на "-s". :)
- 'ring 0' и Написание модуля ядра на C/C++, Murr, 17:38 , 20-Фев-05 (4)
Пардон "-c" на "-S", конечно же.
- 'ring 0' и Написание модуля ядра на C/C++, proglammer, 11:56 , 21-Фев-05 (5)
gcc -I/lib/modules/`uname -r`/build include mymodule.c -o mymodule.o -c выдает: "gcc: cannot specify -o with -c or -S and multiple compilations" ---------- gcc -I/lib/modules/`uname -r`/build mymodule.c -o mymodule.o -c выдает: In file included from mymodule.c:5: /usr/include/linux/module.h:60: parse error before `atomic_t' /usr/include/linux/module.h:60: warning: no semicolon at end of struct or union /usr/include/linux/module.h:60: warning: no semicolon at end of struct or union /usr/include/linux/module.h:62: parse error before `}' /usr/include/linux/module.h:62: warning: data definition has no type or storage class /usr/include/linux/module.h:91: parse error before `}' ---------- закомментил union { atomic_t usecount; long pad; } uc; в module.hgcc выдал: /tmp/ccaA55N7.s: Assembler messages: /tmp/ccaA55N7.s:38: Error: missing expression /tmp/ccaA55N7.s:40: Error: missing expression я так понял - у меня говеный glibc-kernheaders*rpm ? или что?
- 'ring 0' и Написание модуля ядра на C/C++, Murr, 13:38 , 21-Фев-05 (6)
>gcc -I/lib/modules/`uname -r`/build include mymodule.c -o mymodule.o -c gcc -I/lib/modules/`uname -r`/build/include mymodule.c -o mymodule.o -c
- 'ring 0' и Написание модуля ядра на C/C++, proglammer, 16:09 , 21-Фев-05 (7)
Спасибо! :) совсем отупел я от работы, пора увольнятся. но тут загвоздка: теперь gcc -I/lib/modules/`uname -r`/build/include mymodule.c -o mymodule.o -c выдает: /tmp/ccQKp19t.s: Assembler messages: /tmp/ccQKp19t.s:38: Error: missing expression /tmp/ccQKp19t.s:40: Error: missing expression -------- я сделал так gcc -I/lib/modules/`uname -r`/build/include mymodule.c -o mymodule.o -S и исправил строчки 38/40 с .set init_module, .globl cleanup_module .set cleanup_module,на .set init_module,0 .globl cleanup_module .set cleanup_module,1 и попытался скомпилить вот что выдал ld ld: warning: cannot find entry symbol _start; defaulting to 08048074 a.out: In function `mymodule_init': a.out(.text+0xf): undefined reference to `printk' :(
- 'ring 0' и Написание модуля ядра на C/C++, Lamr, 17:20 , 21-Фев-05 (8)
>>gcc -I/lib/modules/`uname -r`/build include mymodule.c -o mymodule.o -c > >gcc -I/lib/modules/`uname -r`/build/include mymodule.c -o mymodule.o -c Чё, Murr, на пиво заработать решил? :-)) ну-ну
- 'ring 0' и Написание модуля ядра на C/C++, proglammer, 16:48 , 22-Фев-05 (9)
:) !!!!! спасибо пиплы! допер! радости полные штаны блин!!!!всего-то gcc -I/lib/modules/`uname -r`/build/include mymodule.c -o 0.s -S -----------------------0.s: .set init_module,0 .globl cleanup_module .set cleanup_module,0 ----------------------- gcc -I/lib/modules/`uname -r`/build/include 0.s -o mymodule.o -c все работает - вот тока insmod выдает: Warning: loading mymodule.o will taint the kernel: no license как от этого избавится а?
- 'ring 0' и Написание модуля ядра на C/C++, proglammer, 18:21 , 22-Фев-05 (10)
ну все! разобрался. короче для всех ламеров вроде меня выкладываю сл. код: файл mymod.c ------------------------------ #define __KERNEL__ #define MODULE #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #define DRIVER_AUTHOR "автор модуля" #define DRIVER_DESC "описание модуля"static int __init init_fisrt_mod(void) { printk(KERN_ALERT "Hello, world!\n"); return 0; } static void __exit cleanup_fisrt_mod(void) { printk(KERN_ALERT "Goodbye, world.\n"); } module_init(init_fisrt_mod); module_exit(cleanup_fisrt_mod); MODULE_LICENSE("GPL"); /* *эта хрень не дает insmod-у выводить: Warning: loading mymodule.o will taint the kernel: no license */ а то что ниже я пока не пробовал // MODULE_AUTHOR(DRIVER_AUTHOR); /* Автор модуля */ // MODULE_DESCRIPTION(DRIVER_DESC); /* Назначение модуля */ --------------------------------- чтобы это скомпилить должен быть установлен kernel-source*.rpm компилить так: gcc -I/lib/modules/`uname -r`/build/include mymod.c -o mymod.o -c --------------------------------- а те кто в С/С++ ноль, а в асме крут - делают так: gcc -I/lib/modules/`uname -r`/build/include mymod.c -o 0.s -S #дальше редактируем файл 0.s: #и компилим дальше gcc -I/lib/modules/`uname -r`/build/include 0.s -o mymod.o -c блин ну и долго`ж я мудился....
- 'ring 0' и Написание модуля ядра на C/C++, Simps, 19:25 , 22-Фев-05 (11)
>ну все! разобрался. >короче для всех ламеров вроде меня выкладываю сл. код: >файл mymod.c >------------------------------ >#define __KERNEL__ >#define MODULE >#include <linux/module.h> >#include <linux/kernel.h> >#include <linux/init.h> >#define DRIVER_AUTHOR "автор модуля" >#define DRIVER_DESC "описание модуля" > >static int __init init_fisrt_mod(void) >{ > printk(KERN_ALERT "Hello, world!\n"); > return 0; >} > >static void __exit cleanup_fisrt_mod(void) >{ > printk(KERN_ALERT "Goodbye, world.\n"); >} > >module_init(init_fisrt_mod); >module_exit(cleanup_fisrt_mod); > >MODULE_LICENSE("GPL"); >/* >*эта хрень не дает insmod-у выводить: >Warning: loading mymodule.o will taint the kernel: no license >*/ > >а то что ниже я пока не пробовал >// MODULE_AUTHOR(DRIVER_AUTHOR); /* Автор модуля */ >// MODULE_DESCRIPTION(DRIVER_DESC); /* Назначение модуля */ >--------------------------------- >чтобы это скомпилить должен быть установлен kernel-source*.rpm >компилить так: >gcc -I/lib/modules/`uname -r`/build/include mymod.c -o mymod.o -c >--------------------------------- >а те кто в С/С++ ноль, а в асме крут - делают >так: > >gcc -I/lib/modules/`uname -r`/build/include mymod.c -o 0.s -S >#дальше редактируем файл 0.s: >#и компилим дальше >gcc -I/lib/modules/`uname -r`/build/include 0.s -o mymod.o -c > >блин ну и долго`ж я мудился.... Да ты уже гуру в вопросе написания модулей для ядра =)
- 'ring 0' и Написание модуля ядра на C/C++, proglammer, 21:19 , 24-Фев-05 (12)
>Да ты уже гуру в вопросе написания модулей для ядра =) :) нее до гуру мне оччень далеко... я в осносном asm мучаю, и вообщем еще один вопрос - как из модуля запустить программу. я хотел через execve("/bin/prog");, execl и т.д. но во первых - insmod выдает: mymod.o: unresolved symbol execve и во вторых ведь при execve код вызвавшегоо процесса перезапишется, а ето лажа... ну а с fork-ом я конкретно обломался, как только вызвал - ядро повисло. а попытавшись сделать execve через асм pushl $0x7672732f #/srv - запускаемая прога movl %esp,%ebx movl $11,%eax xorl %ecx,%ecx xorl %edx,%edx int $0x80 опять обломался - ничего не произошло....
- 'ring 0' и Написание модуля ядра на C/C++, Murr, 20:42 , 25-Фев-05 (14)
>pushl $0x7672732f #/srv - запускаемая прога Строки должны быть 0-завершенные. В ядре используются ASCIIZ строки. >movl %esp,%ebx >movl $11,%eax >xorl %ecx,%ecx >xorl %edx,%edx >int $0x80 >опять обломался - ничего не произошло.... В ядре нужно быть очень аккуратным при попытках из ядра делать вещи, завязанные на контекст текущего процесса/нити. К тому же, не забывай, что если ты дергаешь ядреные функции не напрямую, а через intx80, то ты тем самым портишь стек ядра (если ты сделаешь это из init функции, то модуль не завершит инициализацию).
- 'ring 0' и Написание модуля ядра на C/C++, proglammer, 20:05 , 26-Фев-05 (15)
>В ядре нужно быть очень аккуратным при попытках из ядра делать вещи, >завязанные на контекст текущего процесса/нити. К тому же, не забывай, что >если ты дергаешь ядреные функции не напрямую, а через intx80, то >ты тем самым портишь стек ядра (если ты сделаешь это из >init функции, то модуль не завершит инициализацию). а из какой функции это делать?("main(){}"?), как вызывать функции напрямую, и как можно запустить прогу не испортив стек ядра? хочется знать все и сразу. :) ставлю виртуальную бутылку пива всем участникам беседы. :)
- 'ring 0' и Написание модуля ядра на C/C++, majordomo, 22:06 , 26-Фев-05 (16)
>>В ядре нужно быть очень аккуратным при попытках из ядра делать вещи, >>завязанные на контекст текущего процесса/нити. К тому же, не забывай, что >>если ты дергаешь ядреные функции не напрямую, а через intx80, то >>ты тем самым портишь стек ядра (если ты сделаешь это из >>init функции, то модуль не завершит инициализацию). > >а из какой функции это делать?("main(){}"?), как вызывать функции напрямую, >и как можно запустить прогу не испортив стек ядра? >хочется знать все и сразу. :) > >ставлю виртуальную бутылку пива всем участникам беседы. :) static void call(void* dummy){ int rv; static char * envp[] = { "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL }; char *argv[] = { "/sbin/watchdog", NULL }; rv = call_usermodehelper(argv[0],argv,envp,0); // можно что-нибудь сделать с rv... }
static DECLARE_WORK(work,call,0); void func() // где-то внутри модуля { schedule_work(&work); } static void __exit fini(void) // при выгрузке модуля { flush_scheduled_work(); } Код для 2.6, в 2.4 немного по-другому... В прошлом году мне на Lor подсказали, для iptables расширение писал, там и для 2.4 пример остался... - 'ring 0' и Написание модуля ядра на C/C++, proglammer, 21:21 , 27-Фев-05 (17)
>Код для 2.6, в 2.4 немного по-другому... а у меня какраз 2.4-18.3 да и скомпилить не получилось :( асм всетаки проще... и в модуле всего 2-е функции чтоли?(__init и __exit) я попробовал между ними " main(){ printk(KERN_ALERT "work.\n");} " вставить, и ничего не вышло. блин из меня программер как из горбачева балерина. а "Lor" это что за форум? - я на lor.ru зашел так это сайт оториноларингологии! оказался :) - 'ring 0' и Написание модуля ядра на C/C++, majordomo, 22:14 , 27-Фев-05 (18)
>>Код для 2.6, в 2.4 немного по-другому... >а у меня какраз 2.4-18.3 >да и скомпилить не получилось :( >асм всетаки проще... >и в модуле всего 2-е функции чтоли?(__init и __exit) >я попробовал между ними " main(){ printk(KERN_ALERT "work.\n");} " вставить, >и ничего не вышло. >блин из меня программер как из горбачева балерина. >а "Lor" это что за форум? - я на lor.ru зашел так >это сайт оториноларингологии! оказался :) 1) Почитайте литературу по ядру линукса, хотя бы вот это: http://jamesthornton.com/linux/lkmpg/ 2) lor == linux.org.ru Вот ссылка на нужный тред: http://www.linux.org.ru/profile/majordomo//view-message.jsp?... см. сообщение от idle 20.04.2004 18:09:13, да и вообще вес тред познавательный 8)
- 'ring 0' и Написание модуля ядра на C/C++, Link, 22:38 , 27-Фев-05 (19)
>блин из меня программер как из горбачева балерина. Вы бы для начала почитали хоть какую-нить плохонькую теорию, представление получили, над чем вообще работаете. А то всё это сильно напоминает шаманские пляски с бубном под мухоморами. Вот, например, замечательная книжка Морриса Баха,"Архитектура ОС UNIX" http://coolsoft.ru/lib/unix.txt.tgz ( смотреть можно так: tar zxfO unix.txt.tgz | less ) И вообще, завязывайте с линухом возюкаться - это мода, впустую время потратите. ИМХО beastie.ru - 'ring 0' и Написание модуля ядра на C/C++, proglammer, 23:19 , 27-Фев-05 (20)
>1) Почитайте литературу по ядру линукса, хотя бы вот это: >http://jamesthornton.com/linux/lkmpg/ я совершенно не знаю английского. а на lor сходил - хелпов там куча, буду читать.> И вообще, завязывайте с линухом возюкаться - это мода, впустую время >потратите. > ИМХО >beastie.ru книжку ессно скачал и буду читать. а про linux/unix споров много - на вкус и цвет товарищей нет. - 'ring 0' и Написание модуля ядра на C/C++, majordomo, 00:10 , 28-Фев-05 (21)
- 'ring 0' и Написание модуля ядра на C/C++, proglammer, 12:44 , 28-Фев-05 (22)
- 'ring 0' и Написание модуля ядра на C/C++, Murr, 20:31 , 25-Фев-05 (13)
> Чё, Murr, на пиво заработать решил? > > :-)) > > ну-ну На пиво мне в отличие от некоторых и зарплаты хватает. Насчет того кода - руки решил размять.
|