如何使用C正确实现kmalloc?

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

我在 Makefile、defs.h、kmalloc.c、sysproc.c、usys.S、syscall.h 和 syscall.c 中实现了 kmalloc。我有一个名为 test_1.c 的测试用例来测试我对 kmalloc 的实现。我从 xv6 获取源代码,应用我的实现和更改,然后在 qemu 上运行它。这是我的 github 存储库.

我执行./test-mmap.sh来知道我是否通过了测试用例。结果我没有通过,我得到了错误:“test_1.c: error: implicit declaration function of kmalloc”。但是我已经在正确的文件中正确地实现了kmalloc。我很困惑,我在这里错过了什么?

旁注:请不要关闭这个问题,我想在这篇文章中提供我的代码,但它会太长。如果我只提供其中的一部分,其他用户将很难帮助我。所以我认为最好提供我的 github repo 链接,因为其他用户可以更自由地阅读、克隆、fork 和调试。

c qemu xv6 kmalloc
1个回答
2
投票

编译时

test1.c
编译器(预处理器)包括这些文件:

#include "param.h"
#include "types.h"
#include "stat.h"
#include "user.h"
#include "fs.h"
#include "fcntl.h"
#include "syscall.h"
#include "traps.h"
#include "memlayout.h"

这些文件都没有 kmalloc()

explicit
声明,因此编译器在第 18 行看到它时抱怨 kmalloc()
implicit
声明。

kmalloc()
(第81行,在
defs.h
评论之后)有一个明确的
// jps - kmalloc.c
声明,但是
test1.c
没有包含该文件,所以编译器不知道它存在。

为了解决这个问题,要么在

#include "defs.h"
的顶部添加
test1.c
,要么在
test1.c
已经包含的东西中添加(例如,可能在
syscall.h
的顶部);或在
void* kmalloc(uint);
的顶部或
test1.c
已经包含的内容中添加明确的声明(“
test1.c
”)。

请注意,根据您解决问题的方式,您接下来可能(或可能不会)遇到“kfree() 的隐式声明”问题;可以用同样的方式解决。

© www.soinside.com 2019 - 2024. All rights reserved.