Модератор: Модераторы разделов
kernel_mode
Сообщения: 347
Статус: infinity++
ОС: Gentoo(desktop)/Arch(laptop)
Сообщение
kernel_mode » 05.12.2006 23:41
Вот решил занаться созданием модуля для ядра, начал с простого:
Код: Выделить всё
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#define MODULE_AUTOR "kernel_mode"
#define MODULE_DESC "sample kernel module"
static int __init init_module(void)
{
printk(KERN_ALERT "hello");
return 0;
}
static void __exit cleanup_module(void)
{
printk(KERN_ALERT "Goodbye!");
}
MODULE_LICENSE("GPL");
MODULE_AUTOR(MODULE_AUTOR);
MODULE_DESCRIPTION(MODULE_DESC);
Вывод make:
Код: Выделить всё
[root@myhost Modules]# make -C /usr/src/linux-`uname -r` SUBDIRS=$PWD modules
make: Entering directory `/usr/src/linux-2.6.18-ARCH'
CC [M] /home/kernel_mode/Projecs/Modules/hello-2.o
/home/kernel_mode/Projecs/Modules/hello-2.c:11: error: static declaration of 'init_module' follows non-static declaration
include/linux/module.h:65: error: previous declaration of 'init_module' was here
/home/kernel_mode/Projecs/Modules/hello-2.c:17: error: static declaration of 'cleanup_module' follows non-static declaration
include/linux/module.h:66: error: previous declaration of 'cleanup_module' was here
/home/kernel_mode/Projecs/Modules/hello-2.c:22: error: expected identifier or '(' before string constant
make[1]: *** [/home/kernel_mode/Projecs/Modules/hello-2.o] Ошибка 1
make: *** [_module_/home/kernel_mode/Projecs/Modules] Ошибка 2
make: Leaving directory `/usr/src/linux-2.6.18-ARCH'
[root@myhost Modules]#
Что-то я никак понять не могу в чём ошибся...
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks
Сообщение
Alxn1 » 06.12.2006 00:24
Может быть, что данные функции не должны быть статическими? Похоже, что на это ругается GCC.
makss
Сообщения: 226
ОС: Win+ Lin
Сообщение
makss » 06.12.2006 00:34
//файл hello_knz.c
#include <linux/kernel.h>
#include <linux/module.h>
int init_module(void)
{
printk("<1>Hello, world\n");
return 0;
};
void cleanup_module(void)
{
printk("<1>Good bye cruel world\n");
}
MODULE_LICENSE(“GPL”);
==================================================
Для компиляции такого модуля можно использовать следующий Makefile. Не забудьте поставить символ табуляции перед строкой, начинающейся с $(CC) ... .
==================================================
FLAGS = -c -Wall -D__KERNEL__ -DMODULE
PARAM = -I/lib/modules/$(shell uname -r)/build/include
hello_knz.o: hello_knz.c
$(CC) $(FLAGS) $(PARAM) -o $@ $^
это из книжки
не воспринимайте Linux c позиции Windows, учитесь использовать командную строку
kernel_mode
Сообщения: 347
Статус: infinity++
ОС: Gentoo(desktop)/Arch(laptop)
Сообщение
kernel_mode » 06.12.2006 07:36
makss писал(а): ↑ 06.12.2006 00:34
//файл hello_knz.c
#include <linux/kernel.h>
#include <linux/module.h>
int init_module(void)
{
printk("<1>Hello, world\n");
return 0;
};
void cleanup_module(void)
{
printk("<1>Good bye cruel world\n");
}
MODULE_LICENSE("GPL");
==================================================
Для компиляции такого модуля можно использовать следующий Makefile. Не забудьте поставить символ табуляции перед строкой, начинающейся с $(CC) ... .
==================================================
FLAGS = -c -Wall -D__KERNEL__ -DMODULE
PARAM = -I/lib/modules/$(shell uname -r)/build/include
hello_knz.o: hello_knz.c
$(CC) $(FLAGS) $(PARAM) -o $@ $^
это из книжки
А в The Linux Module Programming gude было написано протото сделать такой Makefile:
obj-m += hello-2.o
И такой make:
make -C /usr/src/linux-`uname -r` SUBDIRS=$PWD modules
Наверное Makefile нправильно написал, днём проверю.
=====
Всё исправил. Нужно было static убрать. (а компилируется и с вышеописанным Makefile'ом)
makss
Сообщения: 226
ОС: Win+ Lin
Сообщение
makss » 06.12.2006 12:49
Всё исправил. Нужно было static убрать. (а компилируется и с вышеописанным Makefile'ом)
в ядре 2.6 можно и с таким makefile
obj-m += hello-2.o
более ранние версии требуют другой подход
не воспринимайте Linux c позиции Windows, учитесь использовать командную строку
kernel_mode
Сообщения: 347
Статус: infinity++
ОС: Gentoo(desktop)/Arch(laptop)
Сообщение
kernel_mode » 06.12.2006 16:18
makss писал(а): ↑ 06.12.2006 12:49
Всё исправил. Нужно было static убрать. (а компилируется и с вышеописанным Makefile'ом)
в ядре 2.6 можно и с таким makefile
obj-m += hello-2.o
более ранние версии требуют другой подход
Извиняюсь, не знал
(да и я пока не драйвера "Hello World All-In-One Driver" для всех ядер начиная с 2.2 пишу ^_^ , а вообще спаибо, пригодится)