我正在尝试添加一个简单的helloworld
系统调用kernel 3.13.0-37-generic
在 64 位系统上。
我将尝试逐步展示到目前为止我所做的事情:
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/
to :
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
在文件末尾添加以下行:
-最后一行号是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
.
Then :
# cd /usr/src/linux-3.13/
# make
需要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;
}
Then :
# gcc hello.c
# ./a.out
输出是:
System call sys_hello returned -1
问题到底是-1
。它必须返回0
not -1
.
似乎sys_hello
不添加到内核系统调用。
我究竟做错了什么?