在 Minix 中添加对 utility.c 的新系统调用
Adding new system call to utility.c in Minix
我正在尝试在 Minix 中实现系统调用,但我无法理解我需要去哪里。这是我需要添加的系统调用,成功时为 returns 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 */
添加到 /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;
,但我不知道这有什么帮助。
感谢同学,终于搞定了。 proto.h 和 table.c 文件是正确的。必须将 mycall.c 中的所有 k
更改为 r
。最大的变化是 utility.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
我正在尝试在 Minix 中实现系统调用,但我无法理解我需要去哪里。这是我需要添加的系统调用,成功时为 returns 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 */
添加到 /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;
,但我不知道这有什么帮助。
感谢同学,终于搞定了。 proto.h 和 table.c 文件是正确的。必须将 mycall.c 中的所有 k
更改为 r
。最大的变化是 utility.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