操作系统 VMware虚拟机Ubuntu 18.04 为linux内核添加一条系统调(以及一些常见毛病解决)

在为linux添加系统调用方面已经有很多文章了,但是作为一名新手在跟随教程的过程中碰到了很多毛病,费了一些周折搞明白了,总之,除了你在写内容时候的错误外,没有办法成功生成.config文件或者不能编译,基本上是缺少组件,根据错误提示,直·接·百·度!缺什么装什么就可以。

一、解压内核
首先你需要下载一个linux内核文件,下载地址:https://www.kernel.org/ 不必要于你现有内核相同,如果你想用自己目前版本内核的话,在终端输入 uname -a命令即可查看目前内核版本。可以在虚拟机内部下载,也可以直接在外面下好拷贝到U盘上,然后U盘重插一下,在ubuntu里打开U盘内容拷贝进来。
操作系统 VMware虚拟机Ubuntu 18.04 为linux内核添加一条系统调(以及一些常见毛病解决) 然后解压内核,对着下载下来的压缩包右键提取,我是提取到usr/src文件夹下面,但是会注意到不能直接提取到这里,需要用一条指令:
sudo nautilus
然后在自动打开的界面上提取到相应位置(注意不要关闭终端和打开的界面窗口)而且可以对这些文件为所欲为地操作了。
打开解压好文件中 Linux版本号/arch/X86/entry/syscalls/syscall_64.tbl 如果是32位系统就是syscall_32.tbl。
设置系统调用号,在64位的列表下面按顺序添加一条自己的调用。(如果写在最后面,在我这里编译时会出毛病具体位置看图)
操作系统 VMware虚拟机Ubuntu 18.04 为linux内核添加一条系统调(以及一些常见毛病解决) 保存之后修改系统调用的头文件,位置在/include/linux/syscalls.h
操作系统 VMware虚拟机Ubuntu 18.04 为linux内核添加一条系统调(以及一些常见毛病解决)保存,在/kernel/sys.c中添加实现函数调用的代码(下图中asmlinkage……部分)
操作系统 VMware虚拟机Ubuntu 18.04 为linux内核添加一条系统调(以及一些常见毛病解决)然后开始编译内核,先进入内核文件 命令:cd /usr/src/linux版本号(这里是你自己提取的路径)
然后输入 sudo make menuconfig
发现
操作系统 VMware虚拟机Ubuntu 18.04 为linux内核添加一条系统调(以及一些常见毛病解决)找不到就装一个,输入 sudo apt install make
再尝试一下make menuconfig 发现缺少flex
那就输入:sudo apt-get install flex
依然无法执行make config,尝试输入:
sudo apt-get install libncurses5-dev libssl-dev
sudo apt-get update
总之根据错误提示,缺什么加什么,不知道什么地方的错误就复制错误信息百度。
下面是我遇到的其他两种毛病的解决方法:
操作系统 VMware虚拟机Ubuntu 18.04 为linux内核添加一条系统调(以及一些常见毛病解决)
最终成功执行 make menconfig之后进入menuconfig界面
操作系统 VMware虚拟机Ubuntu 18.04 为linux内核添加一条系统调(以及一些常见毛病解决)直接选Save完成后直接退出。这一步会产生一个.config文件,用来避免编译不需要的部分。
然后就可以进行编译了,指令有两条(后者可能快一点)
sudo make
sudo make -j4(这里不一定是4,这里的数代表所使用处理器最大线程数,在虚拟机中就是你给虚拟机分配的CPU线程数量)
编译一开始可能会出现问题,大多依然是缺少组件的原因,百度,缺什么装什么。编译内核需要很长时间,保证机器不要断电或者死机。

编译成功后执行如下命令安装一些驱动以及功能:
操作系统 VMware虚拟机Ubuntu 18.04 为linux内核添加一条系统调(以及一些常见毛病解决)
然后输入sudo make install命令就可以开始安装了,如果看到“done”的提示出现,那么恭喜你安装成功了。这时候一定不要心急搞测试,先重启计算机(虚拟机)
再次开机后可以在高级选项中选择你新生成的内核系统(有的系统这一步是默认的不要手动操作)
可以再次输入uname -a指令查看内核是不是已经变了。
然后在主目录下创建一个用于测试的C文件(直接用文本编辑器写,之后改个.c的后缀名就可以了)
操作系统 VMware虚拟机Ubuntu 18.04 为linux内核添加一条系统调(以及一些常见毛病解决)
然后用gcc编译你的测试文件
gcc hello.c(XX.c你测试文件的名字)
然后输出
./a.out
一般会有个return值出现
这里出错一般是你测试文件写错了,也可能是没有gcc,如果没有gcc输入以下指令安装:
sudo apt-get build-depgcc
sudo apt-get install build-essential。
看到返回值之后输入dmesg就会出现你在系统调用实现里写的打印内容,如果一次看不到就再编译输出一次测试文件再次输入dmesg
操作系统 VMware虚拟机Ubuntu 18.04 为linux内核添加一条系统调(以及一些常见毛病解决)如果你成功看到这段输出字符,恭喜你已经成功添加了一条系统调用。