自旋锁函数在 xv6 中生成错误 - 如何修复“函数的隐式声明”?

问题描述 投票:0回答:1

我目前正在尝试通过 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有关系吗?

c windows-subsystem-for-linux xv6 spinlock implicit-declaration
1个回答
0
投票

“spinlock.h”头文件不包含函数声明

只需 grep xv6 源代码中缺少的函数名称即可显示您需要的声明位于

defs.h

...将每个函数的错误更改为“未定义的对‘initlock’的引用”

xv6 是一个内核,它似乎没有设计为链接到用户空间可执行文件。

你要么需要

  1. 使您的代码成为 xv6 的一部分,将其全部构建在一起,然后在 qemu 下运行,或者
  2. 构建一个包含您想要的 xv6 代码的库(.a 或其他),然后将您的可执行文件与其链接
© www.soinside.com 2019 - 2024. All rights reserved.