【发布时间】:2020-06-14 08:45:32
【问题描述】:
我正在尝试在 Minix 中实现系统调用,但我无法理解我需要去哪里。这是我需要添加的系统调用,它在成功时返回 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;,但我不知道这有什么帮助。
【问题讨论】:
-
我不确定这里出了什么问题,但我建议你彻底阅读他们的系统调用页面并查看它的实现。
-
只是为了看看代码哪里出错了,我在utility.c函数中输入了一个
printf()却什么也没得到,所以我认为这个调用永远不会到达那里,这可以解释我为什么会这样虽然我不确定错误发生在哪里,但没有得到正确的结果。 -
我想知道
printf()之类的函数是否可以在系统调用中工作。考虑到它的 MT 内核,也许确实如此。请在此处发布您的回复。 Minix 的代表性严重不足。 -
根据这个exercise,他们表明他们可以使用
printf(),所以我认为我可以,虽然我不确定他们使用的是哪个版本的Minix(我使用的是2),或者如果那会导致差异。 Minix 的代表性不足。很难找到任何帮助。我可能最终会与我的教授交谈,一旦我开始工作,请在此处发布答案,以防其他人发现自己处于我的位置。 -
经过将近一个小时的搜索,我终于找到了 mproc 结构文件(不知道它在
/usr/src/mm/mproc.h中),我知道使用mproc->mp_reply.m1_i1(例如)但即使在分配值之后我仍然得到相同的输出。我认为我的问题是该函数永远不会被调用,尽管我不确定需要在哪里建立链接......
标签: c system-calls minix