我需要在Minix中创建一个系统调用来完成家庭作业。我已经完成了大部分设置,但由于某种原因,系统调用的实际调用的函数没有被正确找到。 (原谅任何不好的措辞选择,我不确定最好的解释这个词)。
我在mylib.h
(和/usr/include
)中创建了/usr/src/include
,其代码如下:
#include <lib.h>
#include <unistd.h>
#include <stdio.h>
int mycall(){
message m;
return (_syscall(PM_PROC_NR, MYCALL, &m));
}
我还将mylib.h
添加到相应的Makefile
。
我在MYCALL
中定义了/usr/src/include/minix/callnr.h
,我已将do_mycall
添加到/usr/src/servers/pm/table.h
中的相应广告位。
我已将int do_mycall(void);
添加到/usr/src/servers/pm/proto.h
,我在misc.c
中添加了一个简单的函数声明。
int do_mycall(void){
printf("I've been called");
return 0;
}
我也尝试将它放在它自己的.c
文件中,我将其添加到该目录中的Makefile
。
我在make
和/usr/src/servers/pm/
以及/usr/src/include
中的make includes
中执行了/usr/src/releasetools
。
但是,当我调用mycall()
并捕获返回值时,它为-1。
我添加了一些打印件,我可以告诉mylib.h
中的函数被调用,并且MYCALL被正确定义为table.h
中的索引,table.h
应该正确地do_mycall
行(虽然我真的不知道如何在执行时测试它)。所以,我只能说_syscall
,do_mycall
没有正确映射到它的函数。
我尝试使用photo.h
中的代码替换misc.c
中的原型(因此原型会丢失),但没有任何不同之处,make
没有抱怨。
任何人都可以帮我弄清楚造成这种情况的原因,或者我如何缩小断开连接的位置?
如果有人知道_syscall
的定义在哪里,那可能会有所帮助,因为我可能会在其中添加一些打印件以确定它到底有多远。
答案 0 :(得分:1)
我无法找到具体原因,但在耗尽了我能找到的所有选项后,问题似乎与我的虚拟机有关。我重复了我在VMware Player上设置系统调用所做的一切,而不是VirtualBox,一切正常。