сборка модуля

Тема в разделе "WASM.UNIX", создана пользователем t00x, 2 июн 2008.

  1. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    подскажите, при сборке
    Код (Text):
    1. ...
    2. #include <linux/sched.h>
    3. ...
    4. static int exec_on_proc(unsigned int CPUs) {
    5.     cpu_set(CPUs, cpu_mask);
    6.     sched_setaffinity(0, cpu_mask);
    7.  
    8.     return 0;
    9. }
    make выдаёт:WARNING: "sched_setaffinity" [/root/...ko] undefined!, и соответственно модуль не загружается.
    пробовал syscalls.h/sys_sched_setaffinity - тоже самое.
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
  3. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    почему PID = 0?
     
  4. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
  5. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    t00x
    Код (Text):
    1. static int exec_on_proc(unsigned int CPUs) {
    2.     struct task_struct * task = current;
    3.         get_task_struct(task);
    4.         cpu_set(CPUs, cpu_mask);
    5.     set_cpus_allowed(task, cpu_mask);
    6.         put_task_struct(task);
    7.     return 0;
    8. }
     
  6. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    насколько я вижу в статье ни слова нет про ядро ;)
     
  7. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    спасибо, про ядро вообще мало написано, исходники разве что 8)

    однако make ругается: WARNING: "__put_task_struct" [/root/...ko] undefined!
     
  8. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    хм
    да, __put_task_struct() не экспортируется
    ну тогда так
    Код (Text):
    1. if (!atomic_dec_and_test(&task -> usage)) {
    2. /* OK */
    3. } else {
    4. /* тут надо каким-то образом освободить структуру ;) */
    5. }
     
  9. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    insmod: error inserting, в /var/log/messages: Unknown symbol set_cpus_allowed.

    make проходит без ошибок и предупреждений, если в Makefile включить опцию
    EXTRA_CFLAGS =-O0 "-Wa,-a", при сборке появляется:
    UNDEFINED SYMBOLS
    printk
    set_cpus_allowed
    param_set_int
    param_get_int


    P.S. в общем, без set_cpus_allowed загружается и параметры передаются.
     
  10. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    t00x
    добавь в модуль
    Код (Text):
    1. MODULE_LICENSE("GPL");
     
  11. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    kemodule.c
    Код (Text):
    1. #include <linux/module.h>
    2. #include <linux/moduleparam.h>
    3. #include <linux/kernel.h>
    4. #include <linux/init.h>
    5. #include <linux/sched.h>
    6.  
    7. static unsigned int useCPU = 1;
    8. module_param (useCPU, int, S_IRUSR | S_IWUSR | S_IROTH);
    9. MODULE_PARM_DESC (useCPU, "CPU");
    10.  
    11. cpumask_t cpu_mask;
    12.  
    13. static int exec_on_proc(unsigned int CPUs) {
    14.     struct task_struct* task = current;
    15.  
    16.     get_task_struct(task);
    17.     cpu_set(CPUs, cpu_mask);
    18.     set_cpus_allowed(task, cpu_mask);
    19.     put_task_struct(task);
    20.  
    21.     return 0;
    22. }
    23.  
    24. static int ke_init (void) {
    25.         printk(KERN_ALERT "CPU param: %d\n", useCPU);
    26.     exec_on_proc(useCPU);
    27.         printk(KERN_ALERT "kemodule loaded.");
    28.  
    29.         return 0;
    30. }
    31.  
    32. static void ke_exit (void) {
    33.         printk(KERN_ALERT "Unloading kemodule...Ok.\n");
    34. }
    35.  
    36. module_init(ke_init);
    37. module_exit(ke_exit);
    Makefile:
    Код (Text):
    1. obj-m := kemodule.o
    2. AS = as
    3. EXTRA_CFLAGS =-O0 "-Wa,-a,--listing-lhs-width=3,--64,-march=generic64"
    4. KDIR  := /lib/modules/$(shell uname -r)/build
    5. PWD   := $(shell pwd)
    6. default:
    7.     $(MAKE) -C $(KDIR) M=$(PWD) modules
    некуда добавлять, модуль не собирается.
     
  12. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    что значит некуда добавлять?
    после module_exit(ke_exit) добавь MODULE_LICENSE("GPL")
     
  13. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    rei3er
    угу, подходящее решение. но почему?
     
  14. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    set_cpus_allowed() экспортирована через EXPORT_SYMBOL_GPL(set_cpus_allowed)
    в процессе инициализации модуля идет определение адресов внешних символов (resolve_symbol() http://www.linux-m32r.org/lxr/http/source/kernel/module.c#L946)
    в случае, если в модуле не определена лицензия (MODULE_LICENSE), по-умолчанию считается, что модуль проприетарный и флаг TAINT_PROPRIETARY_MODULE в module->taints установливается
    поэтому общее условие !(mod->taints & TAINT_PROPRIETARY_MODULE) в resolve_symbol() не выполняется
    в __find_symbol() (http://www.linux-m32r.org/lxr/http/source/kernel/module.c#L172) параметр gplok = 0, поэтому вызов lookup_symbol() не осуществляется для таблицы экспортируемых GPL-символов
     
  15. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    rei3er
    понятно.
    кстати сделал EXPORT_SYMBOL для __put_task_struct();
     
  16. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    для экспорта необходимо модификация кода ядра (добавление EXPORT_SYMBOL) и его _перекомпиляция_
     
  17. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    ИМХО простейший способ, экспортировать и пересобрать ядро.
     
  18. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    угу
    и потом модуль будет работать только у тебя ;)
     
  19. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    уж лучше адрес __put_task_struct() получить через System.map и передать в качестве параметра модулю
    Код (Text):
    1. # insmod $MODULE_FILE address=`cat $SYSTEM_MAP_FILE | grep $FUNCTION_NAME | cut -d ' ' -f 1`