|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Igor A. Valcov 2:5020/400 27 Jan 2005 01:57:37 To : All Subject : FreeBSD module programming & panic --------------------------------------------------------------------------------
Всем привет!
Пытаюсь написать один дравер, и возникла проблема.
Если просто символьное устройство создать, то всё нормально работает. Hо
как только добавляю kthread. Сразу возникает проблема.
kthread даже работает, всё нормально. Hо как дело доходит до kldunload,
сразу же Fatal trap 12: page fault.
Изучил множество драйверов из sys/dev. Вроде нигде криминально не
ошибся. Всё так. А вот почему такое происходит, никак н пойму.
И ещё вопрос. Я так понял, что функция, которую выполняет kthread не
диспетчеризируется, то есть пока она работает и не вызывается никаких
tsleep и ему подобных, sheduler не передаст управление никакому другому
процессу (на UP системе). Поскольку если там вставить бесконечный цикл,
то всё виснет намертво. Правильно я понял, и в чём ошибка вообще?
5.3-RELEASE-p5
#include <sys/types.h>
#include <sys/module.h>
#include <sys/errno.h>
#include <sys/param.h> /* defines used in kernel.h */
#include <sys/kernel.h> /* types used in module initialization */
#include <sys/conf.h> /* cdevsw struct */
#include <sys/uio.h> /* uio struct */
#include <sys/malloc.h>
#include <sys/kthread.h>
#include <sys/priority.h>
#define KPCL_FIFO_SIZE 4096
int kpcl_open(dev_t dev, int oflags, int devtype, struct proc *p);
int kpcl_close(dev_t dev, int fflag, int devtype, struct proc *p);
static struct cdevsw kpcl_cdevsw = {
.d_open = kpcl_open,
.d_close = kpcl_close,
.d_name = "kpcl",
.d_maj = 0,
.d_version = D_VERSION,
.d_flags = D_NEEDGIANT
};
typedef struct __kpcl_fifo {
char msg[KPCL_FIFO_SIZE];
int kf_beg;
int kf_end;
} kpcl_fifo_t;
static dev_t sdev;
static kpcl_fifo_t *kpcl_fifo;
MALLOC_DECLARE(M_KPCL_FIFO);
MALLOC_DEFINE(M_KPCL_FIFO, "fifobuffer", "FIFO buffer for KPCL");
//static struct proc *kpcl_thread_proc;
static int kpcl_thread_exit = 0;
static void
kpcl_thread (void *arg)
{
int i;
for (; kpcl_thread_exit != 1;) {
for (i = 0; i < 10; i++)
printf ("KPCL_THREAD CALLED\n");
msleep (&kpcl_fifo, NULL, PRIBIO, "kpcl_wait", 0);
}
kthread_exit (0);
}
static int
kpcl_loader(struct module *m, int what, void *arg)
{
int err = 0;
switch (what) {
case MOD_LOAD:
sdev = make_dev (&kpcl_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "kpcl");
MALLOC (kpcl_fifo, kpcl_fifo_t*, sizeof(kpcl_fifo_t), M_KPCL_FIFO,
M_ZERO | M_WAITOK);
kthread_create (kpcl_thread, NULL, NULL, 0, 0, "kpcl0");
printf ("KPCL successfully loaded.\n");
break;
case MOD_UNLOAD:
kpcl_thread_exit = 1;
wakeup (&kpcl_fifo);
destroy_dev (sdev);
FREE (kpcl_fifo, M_KPCL_FIFO);
printf("KPCL unloaded.\n");
break;
default:
err = EINVAL;
break;
}
return (err);
}
int
kpcl_open (dev_t dev, int oflags, int devtype, struct proc *p)
{
int err = 0;
wakeup (&kpcl_fifo);
printf ("Opened device \"KPCL\" successfully.\n");
return (err);
}
int
kpcl_close (dev_t dev, int fflag, int devtype, struct proc *p)
{
printf ("Closing device \"KPCL.\"\n");
return (0);
}
DEV_MODULE (kpcl, kpcl_loader, NULL);
--- ifmail v.2.15dev5.3
* Origin: CenterTelecom Voronezh ISP (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/631133d2604b.html, оценка из 5, голосов 10
|