我是初学C和Linux开发人员,所以如果这听起来很混乱,我很抱歉。
我设法通过更新syscall_64.tbl成功创建一个非常简单的系统调用,将asmlinkage方法定义添加到syscalls.h,将文件夹添加到main makefile并创建一个只有一行的makefile:
obj-y := syscall.o
在此之前没有问题,我编译了Linux源代码并且它有效。我想建立一个更高级的系统调用。所以我在vmx.c中添加了一个函数(在arch / x86 / kvm中):
void myFunction(void){
//Some code
}
EXPORT_SYMBOL(myFunction);
并在vmx.h中定义它(它在arch / x86 / include / asm中):
void myFunction(void);
现在问题就开始了。我将vmx.h包含在我的syscall.c文件中并调用了此函数。我得到了一个未定义的对myFunction的引用"当我尝试编译Linux源代码时。我究竟做错了什么?这是我的syscall.c:
#include <linux/kernel.h>
#include <linux/syscalls.h>
#include <asm/vmx.h>
asmlinkage long sys_customsyscall(const char *test)
{
printk(KERN_ALERT "Test: %s,\n", test);
myFunction();
return 0;
}
答案 0 :(得分:2)
在您完成的事情之后,如果您在vmx.c
中使用您的功能,则需要考虑下一件事,然后在Linux/arch/x86/kvm/Makefile
中您可以看到这样的事情
kvm-intel-y += vmx.o pmu_intel.o
因此,在编译时确保,您使用的是intel的配置,而不是amd,否则它将无法与源代码一起编译!如果它是amd你可以在svm.c
内定义它。
使用它,确保在make menuconfig中也启用了Virtualization
此外,您的函数原型,定义/声明不应属于任何#ifdef或类似的,直到您确定该块为止。
还要检查vmx.h,在定义时添加了extern
个关键字。
答案 1 :(得分:1)
您需要导出该符号,以便其他组件可以引用该符号,添加
EXPORT_SYMBOL(myFunction);