我正在尝试在内核3.19中导入新的系统调用。我按照here给出了教程!
这是我通过系统调用实现因子计算的简单代码。
#include <linux/kernel.h>
asmlinkage long sys_fact(int a)
{
int n;
int c;
for(n = 1;n <= a;n++)
c = c * n;
printk(KERN_INFO "Factorial calculated!\n");
return((long) c);
}
当我尝试编译C代码时,我收到了对sys_fact错误的未定义引用。 我正在使用此系统调用的程序如下。
#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
int n;
printf("Enter a number to calculate it's factorial\n");
scanf("%d", &n);
printf("Factorial of %d = %d\n", n, sys_fact(9));
return 0;
}
我的系统是64位ubuntu 14.04,我根据我的系统按照上面提到的教程。
另外,我在安装内核时已经结合了以下命令,我认为这是安装内核时没有出错的原因。
make && make modules_install && make install
内核安装花了2-3个小时,现在我很沮丧。 请帮忙!!
我对syscall_64.tbl进行了编辑(最后四个条目)。
320 common kexec_file_load sys_kexec_file_load
321 common bpf sys_bpf
322 64 execveat stub_execveat
323 common fact sys_fact
答案 0 :(得分:2)
原因是虽然您可能正在使用新内核运行,但#include标头和C库仍然是旧的,因此他们对您新添加的系统调用一无所知。所以你不能指望定义sys_fact。
正如@SantoshA所建议的那样,网站http://linuxseekernel.blogspot.in/2014/07/adding-system-call-in-x86-qemu.html建议将syscall()函数与系统调用号一起使用。
答案 1 :(得分:1)
您的新syscall
没有libc api,请尝试使用syscall(323, args ...)
调用它,如教程中所示。
只是检查你是否已经使用新内核启动了?您可以按照安装步骤here进行操作。或者使用像Qemu这样的模拟器可能更容易,因此您不必重新启动。