Учусь программировать под Юникс. Использую FreeBSD 7.0.Пишу модуль для ядра.
Мейкфайл такой:
KMOD = neomodule
SRCS = neomodule.c
.include <bsd.kmod.mk>Исходник такой:
#include <sys/time.h>
#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/module.h>
#include <sys/kernel.h>
#include <sys/systm.h>int usleep(useconds_t microseconds);
static int eh(struct module* module, int event, void* arg)
{
switch(event)
{
case MOD_LOAD:
uprintf("\n... TOC, TOC, NEO ...\n");
usleep(1);
uprintf("\n... FOLLOW THE WHITE RABBIT ...\n");
//usleep(1);
break;
case MOD_UNLOAD:
uprintf("\n... MATRIX HAS YOU ...\n");
//usleep(1);
break;
default:
return EOPNOTSUPP;
};return 0;
}static moduledata_t neomodule_conf = {"neomodule",eh,NULL};
DECLARE_MODULE(neomodule,neomodule_conf,SI_SUB_DRIVERS,SI_ORDER_MIDDLE);
При компиляции и загрузке выдается следующее:
SKYNET^ make
Warning: Object directory not changed from original /root/neomodule
@ -> /usr/src/sys
machine -> /usr/src/sys/i386/include
cc -O2 -fno-strict-aliasing -pipe -D_KERNEL -DKLD_MODULE -std=c99 -nostdinc -I. -I@ -I@/contrib/altq -finline-limit=8000 --param inline-unit-growth=100 --param large-function-growth=1000 -fno-common -mno-align-long-strings -mpreferred-stack-boundary=2 -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3 -ffreestanding -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual -Wundef -Wno-pointer-sign -fformat-extensions -c neomodule.c
ld -d -warn-common -r -d -o neomodule.kld neomodule.o
:> export_syms
awk -f /sys/conf/kmod_syms.awk neomodule.kld export_syms | xargs -J% objcopy % neomodule.kld
ld -Bshareable -d -warn-common -o neomodule.ko neomodule.kld
objcopy --strip-debug neomodule.koSKYNET^ kldload -v ./neomodule.ko
kldload: can't load ./neomodule.ko: No such file or directoryПроблема в том что файл модуля есть и он скомпилен, но юникс упорно пишет что такого файла нету. При этом это происходит только если в исходном коде есть вызов usleep(1);. Как только я убираю вызов этой функции все загружается идеально. Но мне нужно для теста вызвать задержку в одну секунду. Что мне делать чтобы система видела файлы stdlib.h, stdio.h и другие?
Раньше я программировал под Винду, так что извините за глупый вопрос.
The kernel functions ndelay, udelay, and mdelay serve well for short delays, delaying
execution for the specified number of nanoseconds, microseconds, or milliseconds
respectively.* Their prototypes are:
#include <linux/delay.h>
void ndelay(unsigned long nsecs);
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);Используй mdelay()
И ни каких stdlib.h и т.д. d kernele просто нет
>[оверквотинг удален]
>execution for the specified number of nanoseconds, microseconds, or milliseconds
>respectively.* Their prototypes are:
>#include <linux/delay.h>
>void ndelay(unsigned long nsecs);
>void udelay(unsigned long usecs);
>void mdelay(unsigned long msecs);
>
>Используй mdelay()
>
>И ни каких stdlib.h и т.д. d kernele просто нетСпасибо, а где можно достать хорошую инфу про то что есть в ядре и что там можно использовать?
linux device drivers для начала
h--p://lwn.net/images/pdf/LDD3/
погугли :)
>linux device drivers для начала
>h--p://lwn.net/images/pdf/LDD3/
>погугли :)Вообще-то человек про FreeBSD спрашивает. Но третий вариант да, никто не отменял.
Ещё помогает - сорцы читать. Конечно, лучше какой-нибудь попроще найти. А ещё лучше, похожий на то, что пытаешься написать - всё-равно, писать что-угодно или всё сразу - занятие IMHO бесперспективное.
>
>Спасибо, а где можно достать хорошую инфу про то что есть в
>ядре и что там можно использовать?По архитектуре ядра FreeBSD на русском есть книга МакКузика и Ко. "FreeBSD. Архитектура и реализация" (перевод, правда, отвратительный). После того, как придет понимание архитектуры, смотришь примеры настоящих модулей из /usr/src/sys
По ядру Linux литературы больше, в том числе на русском языке. Мне понравилась "Разработка ядра Linux" Роберта Лав. И, опять же, примеры настоящих модулей из исходников ядра.
>The kernel functions ndelay, udelay, and mdelay serve well for short delays,
>delaying
>execution for the specified number of nanoseconds, microseconds, or milliseconds
>respectively.* Their prototypes are:
>#include <linux/delay.h>^^^^^^^^^^^^^^^^^^^^^^^^^^
Вопрос собственно о FreeBSD.
http://www.freebsd.org/cgi/man.cgi?query=sleep&apropos=0&sek...