Я пытаюсь реализовать системный вызов в Minix, и у меня возникают проблемы с пониманием, где мне нужно go. Это системный вызов, который мне нужно добавить, который возвращает 0 в случае успеха и -1 в случае неудачи, а также возвращает a+b
, a-b
и a*b
:
int mycall(int a, int b, int *sum, int *difr, int *prod);
Что я сделал:
#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;
, но я не знаю, как это помогает.