Ubuntu 添加系统调用

  • 实验内容

  • 通过内核编译法添加一个不用传递参数的系统调用,其功能可自定义。

    (1)添加系统调用号,系统会根据这个号找到syscall_table中的相应表项。具体做法是在syscall_64.tbl文件中添加系统调用号和调用函数的对应关系。

    (2)实现my_syscall,在kernel/sys.c中添加自已的服务函数,然后为该函数在syscalls. h中添加函数声明。

    (3)完成准备工作之后,就可以编译内核。

  • 实验步骤

  • 1. 进入kernel目录:

3.1 进入/usr/src/linux-6.13.1路径

2.添加系统调用号、声明、函数

前情提要:因为没有下载库dbus-x11会导致添加系统调用号后报错。下载方法见下文图3.6。

3.2 打开系统调用表

不要使用387到423的号码,在最后一个“普通”条目之后添加新的系统调号。

 3.3 添加系统调用号前

3.4 添加系统调用号后

a)警告

b)警告

3.5 关闭系统调用表

之后再打开系统调用入口表,发现做的改动没有被清除,关闭系统调用入口表仍然会出现警告。解决办法:需要退出内核目录,回到/usr/src路径下下载dbus-x11。

3.6 下载dbus-x11

3.7 成功解决报错

如图3.7所示,再次打开系统调用入口表并关闭,发现不会报错。

 3.8 添加声明

3.9 加入函数(2976行-2979行)

注意:不要按这个函数加进去,这里加入的函数并不能使后面编译成果,具体应该如何修改见下文图3.17。

3. 配置内核:

3.10 清除内核编译过程产生的中间文件

3.11 清除以前生成的目标文件和其他文件

配置编译参数 ,过程:Save--->ok--->Exit--->Exit

3.12配置编译参数

3.13 配置编译参数结束

4. 编译和安装内核:

3.14 执行sudo make -j8

注意,参数8是虚拟机内核数。我的虚拟机有8个内核,所以是sudo make -j8

3.15 出现错误

make[1]: *** [/usr/src/linux-6.13.1/Makefile:1989:.] 错误 2

make: *** [Makefile:251:__sub-make] 错误 2

执行make -n让 make 程序模拟执行构建过程,把原本要执行的命令打印出来。

3.16 模拟执行构建过程 

        可能的原因:内核配置问题:.config 文件中部分配置选项可能导致某些依赖关系未正确建立。比如与目标文件生成相关的配置缺失或错误,使得 make 找不到构建 vmlinux.a 的规则。

      在网上查找资料,发现是在高版本的内核中会出现以上报错。解决报错的过程如下:

修改sys.c中的函数如下图所示,然后执行sudo make -j8等待一段时间后即可编译成功。make加上-jn选项多线程编译内核来加速内核编译。

3.17 修改sys.c中的函数

3.18 编译成功

安装模块:

3.19 执行sudo make modules_install

在/lib/moudles目录下查看是否安装成功:

3.20 安装成功

是否生成内核压缩镜像文件,在/arch/x86/boot下查看生成bzImage:

3.21 已生成

安装内核

3.22 执行sudo make install

更改系统启动参数:

3.23 执行sudo update-grub2

  • 实验结果

运行及测试:

4.1 执行vim test.c

运行命令、./test:

4.2 调用成功

查看日志,执行sudo dmesg:

4.3 系统调用成功

  • 实验总结

        通过内核编译法添加一个无需传递参数的自定义功能系统调用,具体步骤涵盖添加系统调用号、实现系统调用函数并声明,以及编译内核。

        本实验成功添加自定义系统调用,过程中遇到依赖安装、文件编辑报错、内核编译错误等问题,通过查阅资料、分析错误原因并尝试不同解决方法得以解决,加深了对 Linux 内核系统调用机制的理解 。

        进入内核源码目录/usr/src/linux - 6.13.1,安装相关依赖,解决安装过程中软件包定位失败问题,如安装dbus - x11解决gedit编辑文件时的报错。在syscall_64.tbl文件添加系统调用号与函数对应关系,在syscalls.h中声明系统调用函数,在sys.c中实现系统调用函数。执行sudo make mrproper清除编译中间文件,配置编译参数,编译内核时遇到make[1]: *** [/usr/src/linux - 6.13.1/Makefile:1989:.]错误2等错误,经分析后,修改sys.c中的函数后编译成功。执行sudo make modules_install安装模块,在/lib/modules目录查看安装情况;执行sudo make install安装内核,执行sudo update - grub2更新启动配置。编写测试程序test.c,使用gcc -o test test.c编译,运行./test后显示syscall returned 1,执行sudo dmesg查看日志出现helloworld!,表明系统调用添加成功。

如果对你有帮助的话,请给我点个赞吧❤

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/81219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Javascript:WebAPI

获取网页元素 queryselector queryselector是 JavaScript 中用于选择 DOM 元素的重要方法,它允许使用 CSS 选择器语法来查找页面中的元素。 一般queryselector获取的元素都是html中第一个选择器的元素 支持选择器类型:类选择器(.class) &#xff0c…

十二、Hive 函数

作者:IvanCodes 日期:2025年5月1日 专栏:Hive教程 在数据处理的广阔天地中,我们常常需要对数据进行转换、计算、清洗或提取特定信息。Hive 提供了强大的内置运算符和丰富的内置函数库,它们就像魔法师手中的魔法棒&…

Linux之Nginx安装及配置原理篇(一)

Nginx安装及配置 前情回顾 首先针对Nginx进程模型,我们回顾一下它的原理机制,我们知道它是通过Master通过fork分发任务节点给予work节点,然后work节点触发了event事件,之后通过一个access_muttex互斥锁,来单线程调用我…

嵌入式培训之数据结构学习(五)栈与队列

一、栈 (一)栈的基本概念 1、栈的定义: 注:线性表中的栈在堆区(因为是malloc来的);系统中的栈区存储局部变量、函数形参、函数返回值地址。 2、栈顶和栈底: 允许插入和删除的一端…

深度学习---知识蒸馏(Knowledge Distillation, KD)

一、知识蒸馏的本质与起源 定义: 知识蒸馏是一种模型压缩与迁移技术,通过将复杂高性能的教师模型(Teacher Model)所学的“知识”迁移到轻量级的学生模型(Student Model),使学生模型在参数量和计…

ARP Detection MAC-Address Static

一、ARP Detection(ARP检测) ✅ 定义: ARP检测是一种防止ARP欺骗攻击的安全机制。它通过监控或验证网络中的ARP报文,来判断是否存在伪造的ARP信息。 🔍 工作原理: 网络设备(如交换机&#xf…

基于 Python 的界面程序复现:标准干涉槽型设计计算及仿真

基于 Python 的界面程序复现:标准干涉槽型设计计算及仿真 在工业设计与制造领域,刀具的设计与优化是提高生产效率和产品质量的关键环节之一。本文将介绍如何使用 Python 复现一个用于标准干涉槽型设计计算及仿真的界面程序,旨在帮助工程师和…

Python绘制南丁格尔玫瑰图:从入门到实战

Python绘制南丁格尔玫瑰图:从入门到实战 引言 南丁格尔玫瑰图(Nightingale Rose Chart),也被称为极区图(Polar Area Chart),是一种独特的数据可视化方式。这种图表由弗洛伦斯南丁格尔&#xff…

计算机操作系统概要

不谋万世者,不⾜谋⼀时。不谋全局者 ,足谋⼀域 。 ——陈澹然《寤⾔》《迁都建藩议》 操作系统 一.对文件简单操作的常用基础指令 ls ls 选项 目录或⽂件名:罗列当前⽬录下的⽂件 -l:以长格式显示⽂件和⽬录的详细信息 -a 或 --all&…

<PLC><视觉><机器人>基于海康威视视觉检测和UR机械臂,如何实现N点标定?

前言 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。 除了PLC为主要内容外,相关设备如触摸屏(HMI)、交换机等工控产品,如果有…

从专家编码到神经网络学习:DTM 的符号操作新范式

1st author: Paul Soulos paper: Differentiable Tree Operations Promote Compositional Generalization ICML 2023 code: psoulos/dtm: Differentiable Tree Machine 1. 问题与思路 现代深度学习在连续向量空间中取得了巨大成功,然而在处理具有显式结构&#x…

微信小程序第三方代开发模式技术调研与实践总结

🚀 微信小程序第三方代开发模式技术调研与实践总结 📖 前言 随着企业对私有化品牌运营诉求的增加,许多大型客户希望将原本由 SaaS 平台统一提供的小程序迁移至自有主体(AppID)下运行,同时又希望继续沿用 SaaS 平台的业务服务与数据托管方式。微信开放平台提供的“小程…

开启智能未来:DeepSeek赋能行业变革之路

前言 在人工智能重构生产关系的2025年,DeepSeek以其革命性的推理能力和Python生态的技术延展性,正在重塑内容创作与数据智能的边界。本书以"工具迭代思维升维"为双轮驱动,构建从认知突破到商业落地的完整知识图谱。 DeepSeek的崛…

常见三维引擎坐标轴 webgl threejs cesium blender unity ue 左手坐标系、右手坐标系、坐标轴方向

平台 / 引擎坐标系类型Up(上)方向Forward(前进)方向前进方向依据说明Unity左手坐标系YZtransform.forward 是 Z 轴正方向,默认摄像机朝 Z 看。Unreal Engine左手坐标系ZXUE 的角色面朝 X,默认使用 GetActor…

Cold Diffusion: Inverting Arbitrary Image Transforms Without Noise论文阅读

冷扩散:无需噪声的任意图像变换反转 摘要 标准扩散模型通常涉及两个核心步骤:图像降质 (添加高斯噪声)和图像恢复 (去噪操作)。本文发现,扩散模型的生成能力并不强烈依赖于噪声的选择&#xf…

Java并发编程核心组件简单了解

一、Lock体系 1. ReentrantLock(可重入锁) Lock lock new ReentrantLock(); lock.lock(); try {// 临界区代码 } finally {lock.unlock(); }特点:可重入、支持公平/非公平策略优势:可中断锁获取、定时锁等待使用场景&#xff1…

第二个五年计划!

下一阶段!5年后!33岁!体重维持在125斤内!腰围74! 健康目标: 体检指标正常,结节保持较小甚至变小! 工作目标: 每年至少在一次考评里拿A(最高S,A我理…

Redis(三) - 使用Java操作Redis详解

文章目录 前言一、创建项目二、导入依赖三、键操作四、字符串操作五、列表操作六、集合操作七、哈希表操作八、有序集合操作九、完整代码1. 完整代码2. 项目下载 前言 本文主要介绍如何使用 Java 操作 Redis 数据库,涵盖项目创建、依赖导入及 Redis 各数据类型&…

【Folium】使用离线地图

文章目录 相关文献离线地图下载Folium 使用离线地图 相关文献 Folium — Folium 0.19.5 documentationOffline Map Maker 离线地图下载 我们使用 Offline Map Maker 进行地图下载。 特别注意:Folium 默认支持 WGS84 坐标系,建议下载 WGS84 坐标系的地…

DeepSearch:字节新一代 DeerFlow 框架

项目地址:https://github.com/bytedance/deer-flow/ 【全新的 Multi-Agent 架构设计】独家设计的 Research Team 机制,支持多轮对话、多轮决策和多轮任务执行。与 LangChain 原版 Supervisor 相比,显著减少 Tokens 消耗和 API 调用次数&#…