我目前正在尝试通过 WSL 在 xv6 中运行测试程序(直接从 https://github.com/mit-pdos/xv6-public 下载)。看起来像这样:
#include "types.h"
#include "stat.h"
#include "user.h"
#include "spinlock.h"
int main(int argc, char *argv[]) {
struct spinlock lock;
initlock(&lock, "lock");
int x1 = getreadcount();
int rc = fork();
int total = 0;
int i;
for (i = 0; i < 100000; i++) {
char buf[100];
acquire(&lock);
(void) read(4, buf, 1);
release(&lock);
}
if (rc > 0) {
(void) wait();
int x2 = getreadcount();
total += (x2 - x1);
printf(1, "%d\n", total);
}
exit();
我加锁是为了保证测试正确进行,避免并发问题。但每次我运行“make qemu-gdb”(在 Ubuntu 上)时,它都会给出错误消息:
error: implicit declaration of function ‘initlock’...
用于 initlock、获取和释放。我不知道到底出了什么问题。 “spinlock.h”头文件不包含函数的声明,但这似乎是 xv6 的规则,因为它们也没有出现在它的其他版本中。有人可以帮忙吗?
我尝试将“initlock”、“acquire”和“release”声明放入自旋锁头文件中,但对于每个函数,它仅将错误更改为“对`initlock'的未定义引用”。和Makefile有关系吗?
“spinlock.h”头文件不包含函数声明
只需 grep xv6 源代码中缺少的函数名称即可显示您需要的声明位于
defs.h
。
...将每个函数的错误更改为“未定义的对‘initlock’的引用”
xv6 是一个内核,它似乎没有设计为链接到用户空间可执行文件。
你要么需要