2014-11-03 87 views
9

我试图在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没有添加到内核系统调用。

我在做什么错?

+0

查看内核日志或检查uname以确保您正在运行新版本。也许检查system.map,看看你的添加是否包含在内核中。 – 2014-11-03 18:44:54

+0

内核相同之前/之后的'uname'我找不出来(两者都是'kernel 3.13.0-37-generic')。 – 2014-11-03 18:52:19

+0

与'sys_hello'系统调用相关的'dmesg'没有登录! – 2014-11-03 18:54:25

回答

6

问题出自第6步到最后一步(编译内核)。

第5步之后,我们要做以下步骤:我的系统上

6-编译这个内核

配置我试着下面的命令内核:

# make menuconfig 

在上述命令后,出现一个弹出窗口,我确定选择了ext4,然后保存。

然后创建新的内核DEB文件,我们必须:

# make -j 5 KDEB_PKGVERSION=1.arbitrary-name deb-pkg 

它将/usr/src/创建一些deb文件。

之后,我们需要安装它们:

# dpkg -i linux*.deb 

它会在系统上安装新的内核。

现在,重新启动您的系统。系统重启后,你可以找到新的内核是否安装与否:

$ uname -r 

如果你想知道你的新的系统调用加入到内核或不只需键入:

$ cat /proc/kallsyms | grep <system call name> 

在我的案例:

$ cat /proc/kallsyms | grep hello 

以下输出表明你的系统调用成功添加到内核:

0000000000000000 T sys_hello