'Hello World' Syscall Example еррор

Тема в разделе "WASM.UNIX", создана пользователем varnie, 26 окт 2007.

  1. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    hell-o! собираю тут сабж по туториалу одного весьма уважаемого ресурса и натыкаюсь на еррор:
    весь код примера:
    Код (Text):
    1. #include <sys/types.h>
    2. #include <sys/param.h>
    3. #include <sys/proc.h>
    4. #include <sys/module.h>
    5. #include <sys/sysent.h>
    6. #include <sys/kernel.h>
    7. #include <sys/systm.h>
    8.  
    9.  /*this is the function which represents our system call*/
    10. static int
    11. hello (struct proc *p, void *arg)
    12. {
    13. printf ("hello kernel\n"); return 0;
    14. }
    15. /*on FreeBSD every system call is described by a sysent structure, which holds the corresponding system call function (here hello) and the appropriate count of arguments (here 0)*/
    16.  
    17. static struct sysent hello_sysent = {  //<--видимо тут ругается
    18.     0, /* sy_narg */
    19.     hello /* sy_call */
    20. };
    21.  /*every system call has a certain number (called slot or offset on BSD). This number represents the index in the global sysent list holding every syscall. BSD is able to search a free slot for a syscall (by setting it to NO_SYSCALL) which is used here.*/
    22.  
    23.  static int offset = NO_SYSCALL;
    24.  /*this function can be compared to the init_module & cleanup_module functions on Linux. The differentiation is done via the cmd variable.*/
    25.  
    26.  static int load (struct module *module, int cmd, void *arg)
    27. { int error = 0;
    28.  /*what do we have?*/
    29. switch (cmd)
    30.  {
    31.  /*we have a load*/
    32. case MOD_LOAD :
    33. printf ("syscall loaded at %d\n", offset); break;
    34. /*we have an unload*/
    35. case MOD_UNLOAD : printf ("syscall unloaded from %d\n", offset); break;
    36. default : error = EINVAL; break;
    37.  }
    38. return error;
    39.  } /*This is the most tricky part of this module. That macro will install the module and calls the required functions. We will take a deeper look at this later.*/
    40. SYSCALL_MODULE(syscall, &offset, &hello_sysent, load, NULL);
    собираю через make след. Makefile-ом:
    люди мудрые, подскажите, что я не учел итд?
    спасибо
     
  2. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    сейчас глянул на екзамплы в /usr/share/examples/kld/syscall/module/syscall.c.
    там имеем следующее:
    Код (Text):
    1. static int
    2. hello (struct thread *td, void *arg)
    3. {
    4.         printf ("hello kernel\n");
    5.         return 0;
    6. }
    а также в /sys/sys/sysent.h имеем следующее:
    Код (Text):
    1. typedef int sy_call_t(struct thread *, void *);
    2.  
    3. struct sysent {     /* system call table */
    4.     int sy_narg;    /* number of arguments */
    5.     sy_call_t *sy_call; /* implementing function */
    6.     au_event_t sy_auevent;  /* audit event associated with syscall */
    7. };
    выходит проблема была в некорректной ф-ции в екзампле (out-of-date example?), т.к. выше в посте у ф-ции аргумент первый совсем другого типа.
    досадно, что мало актуальных статей!!! все приходится приводить в нормальный вид в соответствии с текущими апдейтнутыми рулесами етц етц.. :dntknw:(