Ham*_*ava 10 linux system-calls linux-kernel
我正在尝试在64位系统上添加一个简单的helloworld系统调用kernel 3.13.0-37-generic.
我会尽力展示我到目前为止所做的一步一步:
1-我通过以下方式下载了内核源代码:
sudo apt-get source linux-image-3.13.0-37-generic
Run Code Online (Sandbox Code Playgroud)
之后,将内核源文件解压缩到 /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;
}
Run Code Online (Sandbox Code Playgroud)
然后我Makefile在hello目录中创建了一个包含以下内容:
obj-y := hello.o
Run Code Online (Sandbox Code Playgroud)
3-将hello目录添加到内核的Makefile中
我更改了以下内容/usr/src/linux-3.13/Makefile:
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
Run Code Online (Sandbox Code Playgroud)
至 :
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ hello/
Run Code Online (Sandbox Code Playgroud)
4-将新系统调用添加sys_hello()到系统调用表(syscall_64.tbl文件)中
因为我使用64位系统,我需要改变syscall_64.tbl文件:
/usr/src/linux-3.13/arch/x86/syscalls/syscall_64.tbl
Run Code Online (Sandbox Code Playgroud)
在文件末尾添加以下行:
- 最后一行是 313
314 common hello sys_hello
Run Code Online (Sandbox Code Playgroud)
5- sys_hello()在系统调用头文件中添加新系统调用
vim /usr/src/linux-3.13/include/linux/syscalls.h
Run Code Online (Sandbox Code Playgroud)
我在最底层的#endif语句之前的文件末尾添加了以下行:
asmlinkage long sys_hello(void);
Run Code Online (Sandbox Code Playgroud)
6-在我的系统上编译这个内核
要配置内核,我尝试了以下命令:
sudo make menuconfig
Run Code Online (Sandbox Code Playgroud)
在上面的命令后出现一个弹出窗口,我确保ext4选中了然后save.
然后 :
# cd /usr/src/linux-3.13/
# make
Run Code Online (Sandbox Code Playgroud)
花了2~3个小时.
之后 :
# make modules_install install
Run Code Online (Sandbox Code Playgroud)
之后,我重启了我的系统.
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;
}
Run Code Online (Sandbox Code Playgroud)
然后 :
# gcc hello.c
# ./a.out
Run Code Online (Sandbox Code Playgroud)
输出是:
System call sys_hello returned -1
Run Code Online (Sandbox Code Playgroud)
问题到底是什么-1.它必须0不返回-1.
似乎sys_hello没有添加到内核系统调用.
我究竟做错了什么?
问题是从第6步到最后一步(编译内核).
在第5步之后,我们必须执行以下步骤:
6-在我的系统上编译这个内核
要配置内核,我尝试了以下命令:
# make menuconfig
Run Code Online (Sandbox Code Playgroud)
在上面的命令后出现一个弹出窗口,我确保选择了ext4然后保存.
然后DEB从新内核创建文件我们必须:
# make -j 5 KDEB_PKGVERSION=1.arbitrary-name deb-pkg
Run Code Online (Sandbox Code Playgroud)
它将创建一些deb文件/usr/src/.
之后我们需要安装它们:
# dpkg -i linux*.deb
Run Code Online (Sandbox Code Playgroud)
它将在您的系统上安装新内核.
现在,重启系统.系统重启后,您可以查看是否安装了新内核:
$ uname -r
Run Code Online (Sandbox Code Playgroud)
如果你想知道你的新系统调用添加到内核或不只是键入:
$ cat /proc/kallsyms | grep <system call name>
Run Code Online (Sandbox Code Playgroud)
就我而言:
$ cat /proc/kallsyms | grep hello
Run Code Online (Sandbox Code Playgroud)
以下输出表明您的系统调用已成功添加到内核:
0000000000000000 T sys_hello
Run Code Online (Sandbox Code Playgroud)