我试图在64位系统上添加一个简单的helloworld
系统调用kernel 3.13.0-37-generic
。在64位系统上添加新的系统调用到Linux Kernel 3.13
我会尽量表现出我做了什么至今一步一步:
1 - 我已经下载内核源:
sudo apt-get source linux-image-3.13.0-37-generic
之后,内核源文件提取到/usr/src/
2-定义新的系统调用sys_hello()
:
我创建了一个目录中hello
名在内核源代码目录/usr/src/linux-3.13/
我开了一hello.c
文件hello
目录下面的内容:
#include <linux/kernel.h>
asmlinkage long sys_hello(void)
{
printk(“Hello world\n”);
return 0;
}
然后,我创建了一个Makefile
具有以下内容的hello目录:
obj-y := hello.o
3-添加hello目录到内核的Makefile
我改变了下面一行在/usr/src/linux-3.13/Makefile
:
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
到:
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ hello/
4-添加新的系统调用sys_hello()
进入系统调用表(syscall_64。TBL文件)
因为我使用的是64位系统,我需要改变syscall_64.tbl
文件中:
/usr/src/linux-3.13/arch/x86/syscalls/syscall_64.tbl
添加在文件末尾以下行:
-Last行号是313
314 common hello sys_hello
5添加新的系统调用sys_hello()
在系统调用的头文件
vim /usr/src/linux-3.13/include/linux/syscalls.h
我添加以下行到文件的末尾只是在最底层的#ENDIF语句之前:
asmlinkage long sys_hello(void);
6-这个编译我的系统上的内核
配置我试着下面的命令内核:
sudo make menuconfig
上述命令后,出现一个弹出窗口,我确定ext4
被选中,然后save
。
然后:
# cd /usr/src/linux-3.13/
# make
它tooks 2〜3小时。
之后:
# make modules_install install
在那之后,我重新启动我的系统。
7测试系统调用(问题是在这里)
重新启动后,我在家里文件夹中创建一个文件名与hello.c
内容如下:
#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
long int amma = syscall(314); // 314 is the number of sys_hello line in `syscall_64.tbl`
printf(“System call sys_hello returned %ld\n”, amma);
return 0;
}
然后:
# gcc hello.c
# ./a.out
输出结果为:
System call sys_hello returned -1
问题确切地是-1
。它必须返回0
而不是-1
。
看起来像sys_hello
没有添加到内核系统调用。
我在做什么错?
查看内核日志或检查uname以确保您正在运行新版本。也许检查system.map,看看你的添加是否包含在内核中。 – 2014-11-03 18:44:54
内核相同之前/之后的'uname'我找不出来(两者都是'kernel 3.13.0-37-generic')。 – 2014-11-03 18:52:19
与'sys_hello'系统调用相关的'dmesg'没有登录! – 2014-11-03 18:54:25