Добавление нового системного вызова в утилиту. c в Minix - PullRequest
1 голос
/ 02 марта 2020

Я пытаюсь реализовать системный вызов в Minix, и у меня возникают проблемы с пониманием, где мне нужно go. Это системный вызов, который мне нужно добавить, который возвращает 0 в случае успеха и -1 в случае неудачи, а также возвращает a+b, a-b и a*b:

int mycall(int a, int b, int *sum, int *difr, int *prod);

Что я сделал:

  • main. c:
#include <stdio.h>
int main()
{
    int a, b, d, p, r, s;
    a = 3;
    b = 2;
    int mycall(int a, int b, int *s, int *d, int *p);
    r = mycall(a, b, &s, &d, &p);
    fprintf(stderr, "%d,%d,%d,%d\n", r, s, d, p);
    return 0;
}
  • добавил mycall. c в тот же каталог (данный код содержит опечатки, я предполагаю, что k должно быть r):
#include <lib.h>
int mycall(int a, int b, int *sum, int *difr, int *prod)
{
    message m;
    int r;

    m.m1_i1 = a;
    m.m1_i2 = b;

    k = _syscall(MM, 58, &m);
    if(r < 0) return -1;
    *sum = m.m1_i1;
    *difr = m.m1_i2;
    *prod = m.m1_i3;
    return k;
}
  • добавлено в /usr/mm/proto.h:
    _PROTOTYPE( int do_mycall, (void));
  • добавлено do_mycall /* 58 = unused */ to /usr/mm/table.c

Все, что нужно сделать, это реализовать вызов в /usr/mm/utility.c. Это то, что у меня есть:

PUBLIC int do_mycall()
{
    int a, b;
    a = mm_in.m1_i1;
    b = mm_in.m1_i2;

    /* my guess */
    mm_in.m1_i1 = a+b;
    mm_in.m1_i2 = a-b;
    mm_in.m1_i3 = a*b;

    /* mp_reply is in mproc struct of this process */

    return OK;
}

Текущий код при запуске (после перестройки ядра) выдает -1,0,0,0, что неверно, но я не уверен, что делать дальше. При открытии mproc.h я вижу message mp_reply;, но я не знаю, как это помогает.

1 Ответ

0 голосов
/ 06 марта 2020

Наконец-то все заработало благодаря однокласснику. Файлы proto.h и table. c являются правильными. Пришлось изменить все k на r в mycall. c. Большое изменение было в утилите. c и том, как я перестроил образ.

utility.c код:

PUBLIC int do_mycall()
{
    int a, b;
    a = mm_in.m1_i1;
    b = mm_in.m1_i2;

    mproc[mm_in.m_source].mp_reply.m1_i1 = a+b;
    mproc[mm_in.m_source].mp_reply.m1_i2 = a-b;
    mproc[mm_in.m_source].mp_reply.m1_i3 = a*b;

    return OK;

}

Перестройка образа (в Minix):

> make hdboot        (KEEP NOTE OF VERSION NUMBER AT END OF SCRIPT!)
> shutdown

В мониторе загрузки Minix (QEMU):

d0p0>set
# change image to /minix/(YOUR VERSION)
# change net on image to ...;image=/minix/(YOUR VERSION NUMBER)
# save
d0p0>boot
...