Библиотека сайта rus-linux.net
Модули ядра из нескольких файлов
Иногда имеет смысл разделить модуль на несколько файлов. В этом случае Вы должны делать следующее:
- 1.
- Во всех исходных файлах добавьте строку
#define __NO_VERSION__
. Это важно, потому чтоmodule.h
обычно включает определениеkernel_version
, глобальная переменная версии ядра для которой компилируется модуль. Если Вы нуждаетесь вversion.h
, Вы должны включить его непосредственно, потому чтоmodule.h
не будет делать этого после указания__NO_VERSION__
. - 2.
- Скомпилируйте все исходные файлы как обычно.
- 3.
- Объедините все объектные файлы в один. Под x86 это делается командой:
ld -m elf_i386 -r -o
<имя_модуля
>.o
<1-ый исходный файл
>.o
<2-ой исходный файл
>.o
.
Пример такого модуля:
/* start.c * Copyright (C) 1999 by Ori Pomerantz * * "Hello, world" - the kernel module version. * This file includes just the start routine */ /* The necessary header files */ /* Standard in kernel modules */ #include <linux/kernel.h> /* We're doing kernel work */ #include <linux/module.h> /* Specifically, a module */ /* Deal with CONFIG_MODVERSIONS */ #if CONFIG_MODVERSIONS==1 #define MODVERSIONS #include <linux/modversions.h> #endif /* Initialize the module */ int init_module() { printk("Hello, world - this is the kernel speaking\n"); /* If we return a non zero value, it means that * init_module failed and the kernel module * can't be loaded */ return 0; }
/* stop.c * Copyright (C) 1999 by Ori Pomerantz * * "Hello, world" - the kernel module version. This * file includes just the stop routine. */ /* The necessary header files */ /* Standard in kernel modules */ #include <linux/kernel.h> /* We're doing kernel work */ #define __NO_VERSION__ /* This isn't "the" file * of the kernel module */ #include <linux/module.h> /* Specifically, a module */ #include <linux/version.h> /* Not included by * module.h because * of the __NO_VERSION__ */ /* Deal with CONFIG_MODVERSIONS */ #if CONFIG_MODVERSIONS==1 #define MODVERSIONS #include <linux/modversions.h> #endif /* Cleanup - undid whatever init_module did */ void cleanup_module() { printk("Short is the life of a kernel module\n"); }
# Makefile for a multifile kernel module CC=gcc MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX hello.o: start.o stop.o ld -m elf_i386 -r -o hello.o start.o stop.o start.o: start.c /usr/include/linux/version.h $(CC) $(MODCFLAGS) -c start.c stop.o: stop.c /usr/include/linux/version.h $(CC) $(MODCFLAGS) -c stop.c
1999-05-19