向Linux增加一个系统调用或内核模块
向Linux增加一个系统调用或内核模块
配置环境
获取root权限
sudo su
更新系统
sudo apt-get update
安装相关编译程序包
sudo apt-get install libncurses5-dev libssl-dev
sudo apt-get install libelf-dev
sudo apt-get install build-essential openssl
sudo apt-get install zlibc minizip
sudo apt-get install libidn11-dev libidn11
sudo apt-get install flex bison
sudo apt-get install zstd
部署内核
从 The Linux Kernel Archives 下载 linux 内核,这里选择的版本是 linux-5.16.11
下载后移动至虚拟机文件夹/usr/src
进入对应目录,进行解压
sudo tar -xvf linux-5.16.11.tar.xz
添加系统调用
向kernel/sys.c
中加入函数
asmlinkage long __x64__sys_helloworld(void){printk( "helloworld!");return 1;}
向kernel/sys.c
中加入头文件
#include <linux/linkage.h>
向arch/x86/include/asm/syscalls.h
中添加声明
asmlinkage long __x64__sys_helloworld(void);
向arch/x86/entry/syscalls/syscall_64.tbl
中添加调用号(这里使用的是335)
335 64 helloworld _sys_helloworld
编译前的相关配置
删除无关文件
sudo make mrproper
sudo make clean
配置
sudo make menuconfig
编译
sudo make -j8
安装内核
sudo makemodules_install
sudomake install
重启
reboot
测试是否成功
uname -r
返回当前内核版本号为 5.16.11
,即证明成功
错误信息及解决方法
1. 没有规则可制作目标 “debian/canonical-certs.pem”
make[1]: *** 没有规则可制作目标“debian/canonical-certs.pem”,由“certs/x509_certificate_list” 需求。 停止。
make: *** [Makefile:1046:certs] 错误 2
make: *** 正在等待未完成的任务....
解决方法:进入/.config
,删除CONFIG_SYSTEM_TRUSTED_KEYS
、CONFIG_MODULE_SIG_KEY
、CONFIG_SYSTEM_REVOCATION_KEYS
中的内容
CONFIG_DEBUG_INFO_BTF=n# CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
CONFIG_MODULE_SIG_KEY_TYPE_RSA=yCONFIG_MODULE_SIG_KEY_TYPE_ECDSA is not setCONFIG_SYSTEM_TRUSTED_KEYRING=y
CONFIG_SYSTEM_TRUSTED_KEYS=""
CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=4096
CONFIG_SECONDARY_TRUSTED_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_HASH_LIST=""
CONFIG_SYSTEM_REVOCATION_LIST=y
CONFIG_SYSTEM_REVOCATION_KEYS=""end of Certificates for signature checking
2. 重启后发现内核没有改变
查看当前内核版本
cat /boot/grub/grub.cfg |grep menuentry
menuentry 'Ubuntu,Linux 5.13.0-30-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.13.0-30-generic-advanced-39009b2e-96b3-496b-b71b-8b811c018e59' {menuentry 'Ubuntu,Linux 5.8.0-43-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.8.0-43-generic-advanced-39009b2e-96b3-496b-b71b-8b811c018e59' {menuentry 'Ubuntu,linux-5.16.11-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.14-advanced-39009b2e-96b3-496b-b71b-8b811c018e59' {
修改默认内核启动顺序
修改/etc/default/grub
中的GRUB_DEFAULT
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with linux-5.16.11"
更新修改后的grub
update-grub
向Linux增加一个系统调用或内核模块相关推荐
- linux内核打开prntk,操作系统实验一向Linux内核增加一个系统调用.docx
操作系统实验一: 向Linux内核增加一个系统调用 xx 711103xx 2012年3月18日 一.实验目的 通过实验,熟悉Linux操作系统的使用,掌握构建与启动Linux内核的方法:掌握用 户程 ...
- Linux 编译内核且增加一个系统调用
Linux 编译内核且增加一个系统调用 文章目录 Linux 编译内核且增加一个系统调用 一.在添加系统调用之前需要先编译一个Linux的内核. 解压 安装依赖 编译 安装内核 二.系统调用 声名和定 ...
- Ubuntu增加一个系统调用(20.04)西电软工OS实验专题二
title: 西电软工OS实验专题二–增加系统调用 date: 2022-05-14 07:48:48 tags: OS 写在前面: 如果这个过程中你某个地方没有把握,切记使用vm的快照功能,血的教训 ...
- 操作系统作业:给linux系统增加一个系统调用
前不久开了一门<操作系统>,老师上课留下了一个作业--给Linux系统添加一个系统调用.刚开始只能用一脸懵逼来形容,只能硬着头皮做下去.由于刚的新电脑,所以就没敢装双系统.所以我选择了虚拟 ...
- xv6操作系统中增加一个系统调用
简要介绍一下xv6中增加系统调用的方法和步骤. 本文情景:xv6系统中,不自带Linux下的ps命令,不能直观查看各个进程的状态.为此,需要新增一个系统调用sys_cps(),通过它查看进程,将进程名 ...
- 给linux系统增加一个系统调用并测试,超详细含错误锦集
操作系统:给linux系统内核增加系统调用并测试 实验内容 实验环境 实验过程 1.安装环境 2.给内核增加系统调用 3.编译内核 4.安装内核 5.编辑测试文件 实验内容 1.给linux系统内核增 ...
- 第四十二期-ARM Linux内核的系统调用(2)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心 上一期中我们介绍了ARM Linux内核中的系统调用和定义系统调用的流程,这一期我们将介绍系统调用的执行过程. 一.ARM Linux内核中系统调用 ...
- Kali Linux又增加一个顶级域名kali.download
Kali Linux又增加一个顶级域名kali.download 现阶段,kali.download只提供软件包和镜像下载.大家可以把该域名作为备选软件源来使用.形式如下: deb http://k ...
- 在i386平台Linux 2.6 上实现一个系统调用
1. 引言 本文档解释了怎样在Linux2.6中实现一个新的系统调用.一个系统调用被应用程序用来向操作系统请求服务. 2. 系统调用 一个系统调用被应用程序用来向操作系统请求服务.下面的 ...
最新文章
- Python再夺冠,上古语言COBOL大流行,IEEE Spectrum 2020年度编程语言排行榜出炉!...
- Laravel: 基础篇
- 别再乱用 Prometheus 联邦了,分享一个 Prometheus 高可用新方案
- Nodejs中的模块系统
- android 打开免打扰模式_三星S10+免root也能完美使用Xp框架?这款神器你必须要知道...
- Session的实现与存储
- 前端学习(2625):vs安装
- saltstack php,Saltstack快速入门简单汇总
- 特斯拉工程师当UP主评测自动驾驶,结果被公司开除
- bootstrap-自定义导航栏隐藏参数@screen-sm
- PLSQL下载、安装、配置、连接详细教程
- Coreldraw x6离线激活注册机免费下载安装教程
- clojure语言_Clojure编程语言
- 【解决】计算机用户名是中文名导致软件安装失败!
- python pip install pil_python安装PIL库
- Oracle 应用篇+Oracle Siebel CRM
- win7下搭建外网svn服务器
- 用java代码输出乘法口诀表
- 对Halting Problem的漂亮解释
- 壁纸 | 隐藏iPhone Dock栏
热门文章
- JavaEE之--登录页面(用户名、密码、验证码)
- 神经网络和算法的关系,神经网络的算法有哪些
- PAAS容器安全防护
- v7000更换电池步骤_[原创]IBM V7000 SVC更换已经告警的UPS电池详细步骤
- codeforces 1665A (GCD vs LCM)思维
- SpringBoot/Spring Cloud/Docker
- python turtle画动物_用python画简单的动物
- Android 实现涂鸦笔效果
- ECharts - 15.旭日图
- c语言stl用法,C STL快速入门!学习使我快乐