Linux 内核新增系统调用

关键信息

系统环境

选项 参数
系统 ubuntu 14.04.6 desktop i386
内核 4.4.0-148-generic
替换内核 4.4.148 北京交大镜像
磁盘大小 50 GiB in total, 30 GiB for /, finally 15.3 GiB used

编译环境

选项 安装方式
libncurses5 apt-get 在线安装
libncurses5-dev apt-get 在线安装
libssl-dev apt-get 在线安装
arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu 下载压缩包离线安装
sudo apt-get install libncurses5 libncurses5-dev libssl-dev

arm-none-linux-gnueabi 网盘下载地址:https://blog.csdn.net/ee230/article/details/41513957

这东西资源挺少的,我就找到个网盘。

关键文件

文件位置 备注
/usr/src/linux-4.4.148 内核目录,以下使用 $kernel 代替
$kernel/arch/x86/entry/syscalls/syscall_64.tbl 系统调用入口表 for 64 bit
$kernel/arch/x86/entry/syscalls/syscall_32.tbl 系统调用入口表 for 32 bit
$kernel/include/linux/syscalls.h 系统调用函数声明
$kernel/kernel/sys.c 系统调用函数实现

make

命令 功能
make mrproper 清除一些杂项文件,包括配置文件等
make clean 清除以前生成的文件等
make menuconfig 可视化配置内核
make oldconfig 使用之前的配置
make -jx 生成文件,x 表示多线程执行的个数,不指定时默认为 1<br />make 耗时较长(虚拟机一般 30 min 起步),最好多线程执行
make modules_install 安装模块
make install 安装内核

具体步骤

默认已经准备好了编译环境,如果系统环境不同,可能需要的编译环境也会有差异,请自行解决。

之后的操作均在目录 $kernel 下!

新增系统调用号

编辑系统调用表 arch/x86/entry/syscalls/syscall_32.tbl

vim arch/x86/entry/syscalls/syscall_32.tbl

在底部新增系统调用 377 号,对应函数 sys_helloworld

377 i386 helloworld sys_helloworld

声明并实现系统调用函数

编辑头文件 include/linux/syscalls.h

vim include/linux/syscalls.h

在底部的 #endif 之前添加函数声明

asmlinkage int sys_helloworld(int number);

编辑文件 kernel/sys.c

vim kernel/sys.c

在底部的 #endif 之后实现函数

asmlinkage int sys_helloworld(int number)
{
    // printk 是系统调用输出的函数,其输出需要使用 dmesg 命令查看
    printk("hello,world\n");
    return number;
}

make

依次执行以下命令,确保无冗余文件,并多线程执行 make 任务,减少运行时间:

make mrproper
make clean
make menuconfig # 可以不进行设置,直接退出
make -j4 # 4 线程执行 make 任务

make 完成之后准备安装模块,执行 make modules_install

make mudules_install

安装完成之后在 lib/modules 目录下会新增一个目录 4.4.148

最后执行 make install 安装内核

make install

更改 grub 的配置,保证看得见内核选择界面

vim /etc/default/grub

更改如下参数,设置显示时间 5

GRUB_HIDDEN_TIMEOUT=5

执行 update-grub 更新设置

sudo update-grub

重启时按 esc 进入界面,选择 Ubuntu 高级选项 ,并选择你安装的内核

进入之后查看内核版本,已经从 4.4.0-148-generic 切换至 4.4.148

uname -r

测试系统调用

编写如下代码并编译执行

#include <stdio.h>

int main()
{
    // 新增的系统调用为 377 号,传入参数 10,应当在终端打印 10
    printf("%d\n",syscall(377,10));
    return 0;
}

使用 dmesg 命令查看系统调用输出

因为执行了 4 次程序,所以总计输出了 4hello,world,至此新增系统调用成功。

个人博客:https://wilfredshen.cn/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352