подскажите, при сборке Код (Text): ... #include <linux/sched.h> ... static int exec_on_proc(unsigned int CPUs) { cpu_set(CPUs, cpu_mask); sched_setaffinity(0, cpu_mask); return 0; } make выдаёт:WARNING: "sched_setaffinity" [/root/...ko] undefined!, и соответственно модуль не загружается. пробовал syscalls.h/sys_sched_setaffinity - тоже самое.
set_cpus_allowed() http://www.linux-m32r.org/lxr/http/source/kernel/sched.c#L5020 не забудь увеличить счечик ссылок на процесс (get_task_struct()) перед вызовом
t00x Код (Text): static int exec_on_proc(unsigned int CPUs) { struct task_struct * task = current; get_task_struct(task); cpu_set(CPUs, cpu_mask); set_cpus_allowed(task, cpu_mask); put_task_struct(task); return 0; }
спасибо, про ядро вообще мало написано, исходники разве что 8) однако make ругается: WARNING: "__put_task_struct" [/root/...ko] undefined!
хм да, __put_task_struct() не экспортируется ну тогда так Код (Text): if (!atomic_dec_and_test(&task -> usage)) { /* OK */ } else { /* тут надо каким-то образом освободить структуру ;) */ }
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 загружается и параметры передаются.
kemodule.c Код (Text): #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/sched.h> static unsigned int useCPU = 1; module_param (useCPU, int, S_IRUSR | S_IWUSR | S_IROTH); MODULE_PARM_DESC (useCPU, "CPU"); cpumask_t cpu_mask; static int exec_on_proc(unsigned int CPUs) { struct task_struct* task = current; get_task_struct(task); cpu_set(CPUs, cpu_mask); set_cpus_allowed(task, cpu_mask); put_task_struct(task); return 0; } static int ke_init (void) { printk(KERN_ALERT "CPU param: %d\n", useCPU); exec_on_proc(useCPU); printk(KERN_ALERT "kemodule loaded."); return 0; } static void ke_exit (void) { printk(KERN_ALERT "Unloading kemodule...Ok.\n"); } module_init(ke_init); module_exit(ke_exit); Makefile: Код (Text): obj-m := kemodule.o AS = as EXTRA_CFLAGS =-O0 "-Wa,-a,--listing-lhs-width=3,--64,-march=generic64" KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) M=$(PWD) modules некуда добавлять, модуль не собирается.
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-символов
уж лучше адрес __put_task_struct() получить через System.map и передать в качестве параметра модулю Код (Text): # insmod $MODULE_FILE address=`cat $SYSTEM_MAP_FILE | grep $FUNCTION_NAME | cut -d ' ' -f 1`