如何给Linux kernel 5添加一个系统调用

5 篇文章 0 订阅
订阅专栏

如何给Linux Kernel 5添加一个系统调用

本篇博客从英文博客 Adding a Hello World System Call to Linux Kernel 翻译而来。原文链接为: https://medium.com/anubhav-shrimal/adding-a-hello-world-system-call-to-linux-kernel-dad32875872,在这里感谢原作者的创作和分享。

在编译之前保证系统所在的磁盘有至少30G的空间。如果是虚拟机,最好设置为80G。

在开始之前,可以通过以下两个命令查找到所在linux系统的发行版信息和内核信息:

cat /etc/*release
uname -a

得到信息如下:
版本信息
我们可以看到这是一个使用了5.0版本Linux内核的64位Ubuntu 18.04发行版操作系统。

0x01 下载Linux内核源码

内核源码可从Linux内核的官网www.kernel.org下载,也可以从github上面得到。在Linux里面可以通过wget命令直接下载:

cd 
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.3.2.tar.xz

命令运行完成之后,可以看到在当前目录下面多了一个名称为linux-5.3.2.tar.xz的压缩文件。

0x02 解压Linux内核源码压缩文件

使用命令:

tar -xvf linux-5.3.2.tar.xz

解压文件,运行完成之后可以看到当前目录下面多了一个包含linux源码的文件夹linux-5.3.2,使用命令:

cd ./linux-5.3.2

进入linux的源码文件下。
注意: 接下来的操作都是默认的所在目录位置为linux源码文件夹的位置。
源码目录

0x03 添加系统调用函数

在linux源码目录下面添加一个文件夹,并进入这个文件夹。在文件夹下面创建一个hello.c的文件:

mkdir hello
cd hello
gedit hello.c

在hello.c文件里面加入以下代码:

#include <linux/kernel.h>

asmlinkage long sys_hello(void)
{
        printk("Hello world\n");
        return 0;
}

printk函数为将内容打印到kernel日志的函数。

0x04 将系统调用函数文件加入到内核编译里面

在hello文件夹下面创建一个Makefile文件:

touch Makefile
gedit Makefile

将以下内容加入到Makefile文件里面:

obj-y := hello.o

进入到linux源码文件夹,修改总的Makefile文件:

cd ..
gedit Makefile

在linux源码总的Makefile文件里面找到下面一行:

core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/

在其末尾加入我们添加系统调用函数文件的目录,修改如下:

core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ hello/

以上步骤即为将系统调用函数文件及所在文件夹加入到linux源码编译模块里面去。

0x05 将新的系统调用注册到系统调用表里面

如果是在32位系统里面,则需要修改syscall_32.tbl文件,如果是64位系统,修改syscall_64.tbl文件。
系统调用文件在目录arch/x86/entry/syscalls/文件夹里面:

gedit arch/x86/entry/syscalls/syscall_64.tbl # or syscall_32.tbl for 32-bit system

修改的系统调用表如下:
64位系统调用表
在最后一行加入递增的系统调用号548,并记住系统调用号,如下:

548           64         hello                                         sys_hello

0x06 将新的系统调用加入到系统调用头文件里面

系统调用头文件位置为include/linux/syscalls.h,使用如下命令编辑syscalls.h:

gedit include/linux/syscalls.h

将系统调用函数声明加入到里面,系统调用函数声明如下:

asmlinkage long sys_hello(void);

关于asmlinkage宏定义的说明: asmlinkage声明此函数的所有参数均需到内存调用栈中寻找,而不是使用寄存器得到调用参数(系统调用传参有两种方式,一种是在调用之前将参数压栈,一种是通过寄存器传参)。
在syscalls.h文件中加入函数声明后的文件如下:
系统调用头文件

0x07 编译内核

安装编译所需要的各种工具,使用如下命令安装:

sudo apt-get install update
sudo apt-get install gcc
sudo apt-get install make
sudo apt-get install libncurses5-dev
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install libssl-dev
sudo apt-get install libelf-dev

使用如下的命令选择内核所需要的功能:

make menuconfig

如果使用默认配置,则只需要进入之后按Esc退出,退出的时候保存即可。
编译内核的命令为make,如果想加速编译过程,可以直接使用make -j[n],其中n为指定的cpu核心数。例如如果我的电脑有6个物理核心,则可以使用make -j6加速编译。

make -j6

0x08 安装内核

安装内核的命令为:

sudo make modules_install install

使用以上命令安装内核之后,Ubuntu1804系统会默认将最新版本的内核放到第一启动项的位置。如果编译的Linux内核版本为比当前老,则需要开启开机的grub引导页面,在引导页面选择自己编译的内核。如果编译的Linux内核版本比当前版本新,则跳过下一步,直接重启即可。

0x09 开启grub引导页面

修改/etc/default/grub文件,用于开机启动弹出启动项选择页面,修改为以下内容:
grub文件
使用sudo update-grub2更新grub列表,然后重启,进入选择项之后选择advanced options for ubuntu选项,进入如下页面:
开机启动选择
选择自己编译的内核版本,然后进入系统。

0x0a 验证

重启完成之后,使用命令uname -a查看目前的linux内核版本,以确认内核是否切换成功。
在用户自己的目录下面创建一个test.c文件,编写如下代码:

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
         long ret = syscall(548);
         printf("return code is: %ld\n", ret);
         return 0;
}

编译并运行

gcc -o test.out ./test.c
./test.out
dmesg

运行效果:
运行效果
dmesg命令为打印kernel内核的日志到控制台。

0x0b 如何删除编译安装的内核

编译安装的内核对应下面的文件,将其删除之后更新grub即可:

/boot/vmlinuz*KERNEL-VERSION*
/boot/initrd*KERNEL-VERSION*
/boot/System-map*KERNEL-VERSION*
/boot/config-*KERNEL-VERSION*
/lib/modules/*KERNEL-VERSION*/
/var/lib/initramfs/*KERNEL-VERSION*/    
// for debian directory is /var/lib/initramfs-tools/*KERNEL-VERSION*/

更新grub:

sudo update-grub2
linux5 syscall 流程_Linux内核添加系统调用
weixin_39619893的博客
01-13 241
1、目的:在现有的系统添加一个不用传递参数的系统调用。这个系统调用的功能是实现遍历系统中的所有进程。实验主要内容:添加系统调用的名字利用标准 C 库进行包装添加系统调用号在系统调用表中添加相应表项sys_mysyscall 的实现编写用户态测试程序2、步骤:a)安装依赖库:sudoapt-getinstalllibncurses5-dev//如果没有ncurses库,则安装b)下载内核源...
跟踪分析Linux内核5.0系统调用处理过程
小桥流水
03-19 171
学号271原创作品转载请注明出处 本实验来源 https://github.com/mengning/linuxkernel/ 实验说明 编译内核5.0 qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img 选择系统调用号后两位与您的学号后两位相同的系统调用进行跟踪分析 https://github.com/men...
linux内核添加新的系统调用
12-25
讲述如何为linux内核添加新的系统调用 内核版本是linux3.4.4 平台是以arm11为核心的S3C6410
Ubuntu18.04+linux_5.2.5添加系统调用
Slowly_Run的博客
05-08 333
添加系统调用 实验环境 Ubuntu18.04 linux_5.2.5内核源代码 vscode 实验步骤 修改内核源代码,添加系统调用 1.内核目录/arch/x86/entry/syscalls/syscall_64.tbl 2./usr/include/asm-generic/unitsd.h 3.内核目录/kernel/sys.c 重新编译&安装内核 1.cd内核源代码目录/ 2.make mrproper //清除编译过程中产生的所有中间文件 3.make clean //清除上一
linux内核添加系统调用(实践篇)
MQ3639的博客
04-20 236
project-adding a system call to the linux kernel 环境:Ubuntu 14.04.1 LTS 1.准备内核源码: 下载:WWW.kernel.org  解压:我选择解压到~/workspace/linuxKernel 目录下 2.修改system table /linux-4.0.xx/arch/x86/syscalls...
如何在Linux系统添加新的系统调用
07-30
2. **更新系统调用表**:接下来,你需要在内核头文件(如`/usr/src/linux/include/asm-i386/unistd.h`)中添加系统调用的定义,这里通常有一个系统调用编号列表。找到一个未使用的编号,添加系统调用`mycall`: ...
Linux内核增加一个系统调用.zip
06-25
Linux 内核中增加一个系统调用,并编写对应的 Linux 应用程序。利用该系统调用能够遍历系统当前 所有进程的任务描述符,并按进程父子关系将这些描述符所对应的进程 id(PID)组织成树形结构显示。 整个程序的构思...
编译Linux2.6内核添加一个系统调用.pdf
09-06
"编译Linux2.6内核添加一个系统调用" Linux操作系统是自由软件,在广大爱好者的支持下,内核版本不断更新也不断增长。通过编译内核可以轻易地对它进行修改,使我们能够根据自己的要求度身定制一个更高效、更稳定...
linux2.4内核添加系统调用
04-11
在这个文件中,添加一个新的系统调用入口,例如 `.long SYMBOL_NAME(sys_mycall)`。 重新编译内核 添加系统调用后,需要重新编译内核。下面是重新编译内核的步骤: 1. 修改内核版本号 首先,需要修改内核版本号...
Linux内核添加系统调用函数
如丧
07-02 1262
实验环境:  虚拟机VMware 6.0  操作系统Ubuntu9.10(内核版本2.6.31-14-generic) 修改内核版本2.6.31.12 实验步骤:  1.下载Linux内核:在终端中输入命令sudo apt-get install linux-source,下载的文件在/usr/src目录下。(注:如果源没有更新的,在下载之前请先更新源。)  2.将内核代码解压缩:例如下载
linux 内核调用函数添加 & 内核编译
博主的专栏
11-18 1249
下载linux内核源代码 tar –jxvf linux-source-2.6.31.tar.bz2  解压带任意目录下(最好就/home/username/) 添加内核函数调用 (1)修改  /linux-source-2.6.31/kernel/sys.c 在原先的内核函数后加上自己的函数调用 asmlinkage int sys_mycall(int number)
添加简单的linux内核模块,linux内核添加模块
weixin_39573781的博客
05-01 767
参考:http://blog.csdn.net/gaoguoxin2/article/details/50220665动态添加模块不需要编译内核LINUX的模块主要由6部分组成:1、模块的加载函数(必须)当通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。2、模块的卸载函数(必须)当通过rmmod命令卸载某模块时,模块的卸载函数会自...
Linux内核模块间函数调用正确方法
热门推荐
xhz1234的专栏
03-15 1万+
转载注明出处 : http://blog.csdn.net/xhz1234/article/details/44257293 Copyright 徐洪志(MacroSAN). All rights reserved.模块之间发生调用关系是常有的事情,下面以两个模块A、B,B使用A模块提函数为例,讲解正确使用的方法。模块A中使用EXPORT_SYMBOL或EXPORT_SYMBOL_GPL将要提
动态调用kernel任意函数(anycall)
李子的备忘录
10-18 1898
有的时候只需要简单调用下别的kernel函数 或者别的模块函数没有export,而你又不想单独编译kernel重新下载的时候 或者动态去修改某个驱动的寄存器值。 首先看下效果及使用步骤: 加入kernel ,更多时候是驱动中有以下函数: ssize_t justfortest0() { printk(KERN_ERR"[anycall] successful....just
操作系统原理:【优麒麟】linux内核添加系统调用
最新发布
Joyce_zz的博客
04-02 1217
在底端添加如下代码。
【操作系统】实验四 增加Linux系统调用
进一步有一步的欢喜
01-24 1597
1. 实验名称:增加Linux系统调用 2. 实验任务: 学习如何产生一个系统调用以及怎样同过往内核中增加一个函数从而在内核空间中实现对用户空间的读/写。 部分A 添加一个新的内核系统调用,具体完成某个你希望实现的功能。 部分B 重新编译内核,使你的系统调用可用。 部分C 编写一个用户态的程序,验证你增加的系统调用
Linux编译内核添加系统调用
我的CSDN
05-20 1万+
Linux添加系统调用 ----------- - 准备 -- 下载Ubuntu系统安装包和Linux内核 Ubuntu下载地址:https://www.ubuntu.com/download (百度网盘:https://pan.baidu.com/s/1Q3YoFm7FV-rLiv0UKw_vgw 密码:4pho) Linux内核下载地址:https://www.kernel.org/ (百度网盘:链接:https://pan.baidu.com/s/14-mkqxPB_YqP75ztOBxop
31
原创
95
点赞
300
收藏
58
粉丝
关注
私信
写文章

热门文章

  • openwrt配置IPV6四天折腾记 40727
  • ThinkPad X1 Tablet键盘改USB接口 20179
  • Ubuntu如何修改grub启动项 14490
  • 华为magicbook电脑看久了眼睛累的问题 12702
  • ubuntu16.04系统下的kernel 4.10的内核编译以及新增系统调用 12619

分类专栏

  • Linux 5篇
  • 编程 2篇
  • 性能调优 3篇
  • 数据结构 1篇
  • ACM编程 8篇
  • 程序员的玩乐 11篇

最新评论

  • ThinkPad X1 Tablet键盘改USB接口

    Samson_Miller: 我用的gen2不好使,F1-F12是默认功能,用快捷功能必须加Fn,还有指示灯只有大写锁定会亮,静音键就算生效了指示灯也不会亮

  • ThinkPad X1 Tablet键盘改USB接口

    Samson_Miller: 或者数据线没喊好/短路

  • ThinkPad X1 Tablet键盘改USB接口

    Samson_Miller: 应该是线序接错了

  • 华为magicbook电脑看久了眼睛累的问题

    WilsonAir: 双击就可以了,可以用手机摄像头调到专业模式,然后快门速度拉到最快,就可以看到那个调光的间隔(黑线)变密了

  • 华为magicbook电脑看久了眼睛累的问题

    纯情↗筱默: 怎么确定文件执行成功了?

最新文章

  • MacOS中Latex提示没有相关字体怎么办
  • 无法修改BIOS情况下Linux切换根目录到其他磁盘
  • GDB调试子进程
2024年1篇
2023年1篇
2021年3篇
2020年3篇
2019年7篇
2018年3篇
2017年12篇
2016年1篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家江苏室内商场美陈销售企业步行街玻璃钢雕塑优势兵马俑玻璃钢雕塑玻璃钢雕塑制作教程玻璃钢花盆模具技师招聘福建创意玻璃钢雕塑定制玻璃钢抽象雕塑专卖店威海玻璃钢雕塑价格有潜力的玻璃钢动物雕塑加工玻璃钢动物雕塑厂家现货砂岩雕塑玻璃钢雕塑玻璃钢佛像雕塑工艺品徐汇区玻璃钢雕塑石家庄玻璃钢雕塑厂东莞锦泰玻璃钢雕塑厂玻璃钢雕塑专业制作过程弥勒市玻璃钢雕塑订做北京周年庆典商场美陈制作桂林玻璃钢雕塑厂家树脂玻璃钢雕塑容易清洗吗玻璃钢雕塑国内外研究现状江苏季节性商场美陈哪里买江苏玻璃钢米奇卡通雕塑定做玻璃钢商场雕塑肇庆欧式玻璃钢雕塑玉溪公园玻璃钢雕塑威海市玻璃钢人物雕塑报价克拉玛依玻璃钢雕塑文山玻璃钢雕塑商家玻璃钢室外不锈钢雕塑制作香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化