помогите создать новый системный вызов.. плиз :(

Тема в разделе "WASM.UNIX", создана пользователем Necromancer13, 6 авг 2008.

  1. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    Здравствуйте :)

    Хочу создать новый системный вызов. я уже пробовал, но не получалось...

    Я хочу, чтоб в параметрах вызову передавался адрес строки , куда скопировать строку "Hello!"

    сначала добавил в arch/x86/ia32/ia32entry.S:

    Код (Text):
    1.         ........
    2.         .quad sys_epoll_pwait
    3.         .quad compat_sys_utimensat      /* 320 */
    4.         .quad compat_sys_signalfd
    5.         .quad sys_timerfd_create
    6.         .quad sys_eventfd
    7.         .quad sys32_fallocate
    8.         .quad compat_sys_timerfd_settime        /* 325 */
    9.         .quad compat_sys_timerfd_gettime
    10.         .quad sys_necrosyscall                               /* ЭТ Я ДОБАВИЛ
    11.         ......
    дальше добавил в include/asm/unistd_32.h:

    Код (Text):
    1. ......
    2. #define __NR_tee                315
    3. #define __NR_vmsplice           316
    4. #define __NR_move_pages         317
    5. #define __NR_getcpu             318
    6. #define __NR_epoll_pwait        319
    7. #define __NR_utimensat          320
    8. #define __NR_signalfd           321
    9. #define __NR_timerfd_create     322
    10. #define __NR_eventfd            323
    11. #define __NR_fallocate          324
    12. #define __NR_timerfd_settime    325
    13. #define __NR_timerfd_gettime    326
    14. #define __NR_necrosyscall          327    /* ВОТ ТУТ ДОБАВИЛ */
    15. .......
    дальше само тело сист. вызова пишу в kernel/sys.c:

    Код (Text):
    1. asmlinkage long sys_necrosyscall (char *dst)
    2. {
    3.       char buf[50];
    4.       strcpy(buf, "Hello!");
    5.       copy_to_user(dst, buf, strlen(buf));
    6.       return 121;      
    7. }
    пересобрал ядро...

    теперь проверяю системный вызов:

    Код (Text):
    1. #include <stdio.h>
    2.  
    3. #define __NR_necrosyscall 327
    4.  
    5. int main(void)
    6. {
    7.      int r;
    8.      char temp[50];
    9.      r = syscall(__NR_necrosyscall, temp);
    10.      printf("%s\n", temp);
    11.      printf("syscall возвратил %d\n", r);
    12.      return 0;
    13. }
    компилирую, запускую..
    выводит:

    Похоже, syscall вообще не запрегистрировался :dntknw: я делаю так, как описано в книге Р. Лава, только не все совпадает с тем, как в книге описано, похоже, сорцы ядра с того времени оч изменились. хотя у меня тоже 2.6 , которое в книге и описывается.

    помогите создать нормальный syscall , плиз..

    И кстати.. еще вопрос.. интересно очень... макрос syscall где определен? если это вообще макрос.

    PS. тему уже эту создавла сегодня утром, только че-то ее не вижу нигде ^_^. или это у меня браузер заглючил, написал что тема создалась или тему удалили О_о
     
  2. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    уже вроде разобрался с проблемой :))

    надо было не в arch/x86/ia32/ia32entry.S добавлять, а в arch/x86/kernel/syscall_table_32.S
     
  3. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    Necromancer13
    Про это в опеннете все досканально расписано