linux内核添加系统调用(详细)

linux内核添加系统调用(详细)

说在前面:

这是我第五次编译内核,分别踩了很多坑。中途问过wz佬,佬让我用qemu。我还是最后换ubuntu虚拟机跑了。现在已经有点emo了。

这篇博客是我第五次的时候回滚快照重开的写的。

注意事项(必看)

  1. 如果服务器够好就放服务器,如果是学生机子1核2G还是别放服务器了。出锅概率很大,比如内存不够,前台运行断网,后台编译出问题了看不见。已经被坑三次了。
  2. 打快照很重要!!!!打快照很重要!!!!打快照很重要!!!!
  3. 建议使用ubuntu版本,看别人博客的时候注意人家的系统版本号,如果你不想注意的话请使用qemu模拟器。
  4. 虚拟机的话磁盘打快照前给足50G!!不然后期编译磁盘满了就开始gg了。
  5. 虚拟机建议多个几个核,编译的时候开核数*2的线程。
  6. 如果可以的话建议上一个ccache,不然之后想添加东西的话就编译很久了。
  7. 没事别用百度搜索,垃圾!google搜的csdn博客都比百度靠谱!

1.查看适合自己Ubuntu版本的内核版本

4.10    Warty Warthog       2.6.8
5.04    Hoary Hedgehog      2.6.10
5.10    Breezy Badger       2.6.12
6.06    Dapper Drake        2.6.15
6.10    Edgy Eft            2.6.17
7.04    Feisty Fawn         2.6.20
7.10    Gutsy Gibbon        2.6.22
8.04    Hardy Heron         2.6.24
8.10    Intrepid Ibex       2.6.27
9.04    Jaunty Jackalope    2.6.28
9.10    Karmic Koala        2.6.31
10.04   Lucid Lynx          2.6.32
10.10   Maverick Meerkat    2.6.35
11.04   Natty Narwhal       2.6.38
11.10   Oneiric Ocelot      3.0
12.04   Precise Pangolin    3.2 or newer
12.10   Quantal Quetzal     3.5
13.04   Raring Ringtail     3.8
13.10   Saucy Salamander    3.11
14.04   Trusty Tahr         3.13 or newer
14.10   Utopic Unicorn      3.16
15.04   Vivid Vervet        3.19
15.10   Wily Werewolf       4.2
16.04   Xenial Xerus        4.4 or newer
16.10   Yakkety Yak         4.8
17.04   Zesty Zapus         4.10
17.10   Artful Aardvark     4.13
18.04   Bionic Beaver       4.15 or newer
18.10   Cosmic Cuttlefish   4.18
19.04   Disco Dingo         5.0
19.10   Eoan Ermine         5.3

Ubuntu18.04可以支持4.15及以上。

image-20211206184332128

这里干脆更新自己的内核

https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.1.tar.gz

 wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.1.tar.gz
tar -xvf linux-5.4.1.tar.gz #解压

image-20211206191754630

2.配置虚拟机参数

image-20211206185247258

  1. 开机进入Ubuntu系统,安装gparted软件。
  2. 打开软件
  3. image-20211206185423307
  4. 直接拉满
  5. image-20211206185540526
  6. 确定后点左上角的✔等待操作完成

image-20211206185822926

这时候可以打个快照了。因为我之前的文件还有用,怕之后出问题。

3.配置ccache

这个操作主要是为了之后如果还想额外加系统调用设置的。这个能把之前编译过的文件做缓存从而加快速度。所以单纯做一次也没必要。

摘自1

摘自2

1. 安装ccache	sudo apt-get install ccache
2. 修改ccache环境变量
    vim ~/.bashrc
    添加如下语句:
    # ccache
    #user是用户目录,这个目录是用来保存编译信息,可以使用其它目录。
    export CCACHE_DIR="/home/user/.ccache" 
    export CC="ccache gcc"
    export CXX="ccache g++"
    export PATH="/usr/lib/ccache:$PATH"
3. 更新环境变量使之立即生效
    source ~/.bashrc
4. 修改ccache使用的缓存大小,根据你自己的需要配置
    ccache -M 6G
5. 检查情况
    使用which g++,若输出的为/usr/lib/ccache则成功
		注意:  
		内核态和用户态下的ccache并不相通
		用户态下看到的是/usr/lib/ccache/g++
		内核态下看到的是/usr/bin/g++
6.使用方法:
		编译普通c文件:输入ccache gcc xxx(gcc xxx为正常gcc编译命令)
		编译内核: 切换到root,进入到你的Linux源码包
				  使用make语句时加上CC='ccache gcc' 
				  即make CC='ccache gcc' 
		(末尾可以加上 -j4 以更快的速度编译,前提cpu为二核)
         初次使用时编译时间还没有改变,但是以后再编译时时间就会快很多
    	(若更改了虚拟机的配置,可能会要重新配置ccache)
          对于内存偏小的朋友需要谨慎使用ccache,否则可能会造成物理机无法正常使用。
6.查看ccache信息
     ccache -s    

4.更新系统调用表,添加系统调用id。

修改syscall_64.tbl

cd arch/x86/entry/syscalls/

image-20211206192039396

image-20211206192112383

注意写在注释上面别写在最后!

image-20211206192334130

5.添加系统调用函数声明

修改arch/x86/include/asm/syscalls.h

image-20211206192606713

6.在内核源代码添加函数定义

vim kernel/sys.c

image-20211206193511667

7.编译内核

  • 安装编译所需工具
sudo apt-get install gcc make libncurses5-dev openssl libssl-dev 
sudo apt-get install build-essential 
sudo apt-get install pkg-config
sudo apt-get install libc6-dev
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install libelf-dev

需要的话可以考虑在这里来个快照了

make menuconfig

make menuconfig之后选择save并退出。

image-20211206194021459

之后还要修改一些东西,不然编译途中会出错。

  • vim ./.config
  • CONFIG_SYSTEM_TRUSTED_KEYS=""。(使用shift+":",输入?CONFIG_SYSTEM_TRUSTED_KEYS回车后查询)
  • image-20211206195525863
make CC='ccache gcc' -j8 (我开了4个核,所以*2=8) ,编译的时候就可以学其他东西去了。
如果没有ccahe的就直接make -j2,后面的数字取决你的核数*2.

实测4个核1小时跑完。编译完花了36G。

image-20211206210132966

image-20211206210025160

8.安装模块

sudo make modules_install

image-20211206211029841

sudo make install

image-20211206210958643

9.切换内核

reboot重启虚拟机,按住shift选择进入高级选项。看到linux-5.4.1说明内核。

这里我直接按住shift就直接重启进来了。

image-20211206211504062

10.测试系统调用

#include<stdio.h>
#include<unistd.h>
#include<sys/syscall.h>
int main(){
	syscall(335);
	return 0;
}
yan@ubuntu:~$ vim test.c
yan@ubuntu:~$ gcc -o test test.c
yan@ubuntu:~$ ./test.out
yan@ubuntu:~$ dmesg

image-20211206212027696

参考文章

https://blog.csdn.net/weixin_43434136/article/details/117394874

https://blog.csdn.net/zyf2333/article/details/80043152

https://blog.csdn.net/fuyuande/article/details/90485882

https://blog.csdn.net/weixin_48299611/article/details/115563624

  • 8
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值