我正在尝试在64位系统上添加一个简单的helloworld
系统调用kernel 3.13.0-37-generic
.
我会尽力展示我到目前为止所做的一步一步:
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
目录中创建了一个文件,内容如下:
#includeasmlinkage 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
在文件末尾添加以下行:
- 最后一行是 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
花了2~3个小时.
之后 :
# make modules_install install
之后,我重启了我的系统.
7-测试系统调用(问题在这里)
重新启动后,我hello.c
在主文件夹中创建了一个名称文件,其中包含以下内容:
#include#include #include #include 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
没有添加到内核系统调用.
我究竟做错了什么?
问题是从第6步到最后一步(编译内核).
在第5步之后,我们必须执行以下步骤:
6-在我的系统上编译这个内核
要配置内核,我尝试了以下命令:
# make menuconfig
在上面的命令后出现一个弹出窗口,我确保选择了ext4然后保存.
然后DEB
从新内核创建文件我们必须:
# make -j 5 KDEB_PKGVERSION=1.arbitrary-name deb-pkg
它将创建一些deb
文件/usr/src/
.
之后我们需要安装它们:
# dpkg -i linux*.deb
它将在您的系统上安装新内核.
现在,重启系统.系统重启后,您可以查看是否安装了新内核:
$ uname -r
如果你想知道你的新系统调用添加到内核或不只是键入:
$ cat /proc/kallsyms | grep <system call name>
就我而言:
$ cat /proc/kallsyms | grep hello
以下输出表明您的系统调用已成功添加到内核:
0000000000000000 T sys_hello