Здравствуйте. Возникла задача - прочесть параметры, с которыми запущено ядро из загружаемого модуля. Вернее, не ядро, запущенное из модуля, а в одном из модулей ядра мне ядерные параметры получить надо. В исходниках ядра нашел функцию, которая, возможно, умеет это делать. Вот она:
include/linux/mm.h: int get_cmdline(struct task_struct *task, char *buffer, int buflen);
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/mm.h>
MODULE_LICENSE( "GPL" );
static int __init getcmdline_init(void)
{
char buf[128];
get_cmdline(0,buf,128);
printk("cmd: %s\n", buf);
printk("cmd: Hello\n");
return 0;
}
static void __exit getcmdline_exit(void)
{
}
module_init(getcmdline_init);
module_exit(getcmdline_exit);
Собираю таким Makefile-ом:
CURRENT = $(shell uname -r)
KDIR = /lib/modules/`uname -r`/build
PWD = $(shell pwd)
obj-m += getcmdline.o
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
При сборке получаю варнинг:
WARNING: "get_cmdline" [/root/fun/getcmdline/getcmdline.ko] undefined!
insmod: ERROR: could not insert module getcmdline.ko: Unknown symbol in module
$ grep get_cmdline /proc/kallsyms
ffffffff81181790 T get_cmdline
В незапакованном ядре она тоже присутствует:
$ nm -n /lib/modules/3.18.4-1-selinux/build/vmlinux | grep get_cmdline
ffffffff81181790 T get_cmdline
В чем здесь магия? Ведь printk, который объявлен в ядре точно так же, я использую безо всяких дополнительных определений. Подскажите пожалуйста, почему функцию увидеть не могу?