Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 FreeBSD module programming & panic   Igor A. Valcov   27 Jan 2005 01:57:37 
 Re: FreeBSD module programming & panic   Gleb Smirnoff   27 Jan 2005 12:24:41 
 Re: FreeBSD module programming & panic   Igor A. Valcov   27 Jan 2005 21:56:55 
Архивное /ru.unix.bsd/631133d2604b.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional