Linux系统添加系统调用

Linux系统调用大致需要的步骤如下:

(1)确保Linux系统中有内核(我用的是Ubuntu,没有内核源码,所以需要自己下载安装Linux的内核源代码,然后在系统中解压内核源码)

(2)添加一个新的系统调用,完成任意一个功能,重新编译和运行内核,使新的系统调用可用

(3)重新启动系统后写一个程序来系统调用之前自己写的那个功能,可执行即可


具体操作如下:

(以Ubuntu18.04为例,关于装内核源码的具体过程此处不做过多说明)

(1)修改内核源码中与系统调用有关的文件信息,我在网上看到的是以下三个文件

/arch/x86/entry/syscalls/syscall_64.tbl      //设置系统调用号,如果是32位就用syscall_32.tbl

/include/linux/syscalls.h                     //系统调用的头文件

/kernel/sys.c                                 //定义系统调用函数

 

一开始我实现这个操作的时候一直改不成功,就是在文件中更改之后保存不了,因为这三个文件都是“只读”的。

我尝试过直接打开文件然后修改信息,之后保存不了


上网搜解决办法之一是终端中输入vim 文件名 , 但是我这样子做了之后打开和编辑的是一个同名的空文件,看不了原文件中的信息,也改不了;然后我直接界面操作,在相应文件的位置右键选择“在终端中打开”,在准备修改之前,系统就提示“正在对“只读”文件进行操作”,我无视掉然后修改完文件准备保存时一直保存不了。


网上的解决办法之二是改文件权限,在终端用chmod,应该是我操作不当,一开始我在终端中输入了chmod a+w 文件名

但是没成功,一直显示没有这个权限,然后换成root用户之后,显示不存在这个文件,应该是我文件名写的有问题(我写的是

这个文件的路径,不是单纯的文件名)(也可能是我系统的问题)。

后来问了同学之后,她让我先打开文件所在的位置,然后再输入chmod 777 文件名来改文件权限,我照做之后终于把文件权

限改成功了。

(注意:改文件的权限需要的将普通用户转换成root用户,或者在操作前加上sudo)


另外两个文件同样的操作,更改完文件的权限之后就可以在相应位置添加信息了:

(修改文件时可以直接用文本编辑器修改,也可以用vim操作。

    我是用vim操作的,先输入i,可以进入“插入”模式,然后进行修改,修改完之后,按esc退出“插入”模式,然后再按

“shift+:”,会在窗口左下方出现“:”,然后输入“wq”进行保存并退出操作。具体操作可以上网搜vim操作。)


在系统调用表/arch/x86/entry/syscalls/syscall_64.tbl中添加自己的系统调用号,我的是333



在/include/linux/syscalls.h中添加系统调用函数声明


在/kernel/sys.c 中先添加linkage.h的头文件,再添加系统调用函数




函数体中不能有“\n”,我一开始这么写,然后编译内核的时候报错了



(2)编译内核和安装内核

    先进入内核文件,我是直接在相应的文件中打开终端,也可以用cd语句,然后再进行以下操作:

(前两个可以不进行,但是最后一个一定要)

sudo make mrproper

sudo make clean

sudo make menuconfig

     (进入menuconfig界面的时候,直接选择save,完了之后exit就可以了  )

  然后根据自己处理器的最大线程数目来编译

(这个操作耗时较长!我的最大线程数目是4,所以是-j4,如果直接用sudo make会用时很久)

sudo make -j4

    编译后安装内核到系统中

    (就是在sudo make module_install时,我代码中的“\n”报错了)

sudo make modules_install  

sudo make install

完成后的截图如下:


(3)重新启动系统,加载内核

第一个界面选择Ubuntu的高级选项


然后再选择第一个选项即可




(4)编写程序验证系统调用

I.vim 文件名  //创建c++文件

II.编写代码,需要加入几个头文件

#include <linux/kernel.h>
#include <sys/syscall.h>   //系统调用的头文件
#include <unistd.h>   //我之前加的是#include <linux/unistd.h>,但是编译不成功

III.g++ 文件名  //编译c++文件

IV.前一步之后生成a.out的可执行文件,输入“./a.out”执行程序



V.执行结果如图所示,输出了“System call sys_zm_hello return :1”,调用成功!


参考链接:

Ubuntu 16.10添加系统调用

点击打开链接



原文链接:加载失败,请重新获取