Linux 实现自定义系统调用,支持参数和结果返回

本文实现一个简单的系统调用实现,支持输入字符串参数,并返回一个结果字符串。
以下是验证步骤:

1. 添加系统调用编号

试验使用的是 x86_64 架构的 Linux 内核。
找到并编辑 arch/x86/entry/syscalls/syscall_64.tbl 文件,在文件末尾添加新的系统调用号和函数映射,这里使用 548 作为新系统调用编号:

548  64  say_hello   sys_say_hello

2. 添加系统调用实现

在合适的内核源码文件中(如 kernel/sys.c ),末尾添加系统调用函数实现:

SYSCALL_DEFINE3(say_hello, const char __user *, name, char __user *, result, size_t, result_len)
{char kname[256];  // 假设最大长度为256char msg[512];size_t msg_len;// 从用户态复制参数if (copy_from_user(kname, name, sizeof(kname))) {return -EFAULT;}// 构建返回消息snprintf(msg, sizeof(msg), "Welcome %s", kname);msg_len = strnlen(msg, sizeof(msg)) + 1;// 检查结果缓冲区长度是否足够if (result_len < msg_len) {return -ENOSPC;}// 将结果复制到用户态缓冲区if (copy_to_user(result, msg, msg_len)) {return -EFAULT;}return 0;
}

SYSCALL_DEFINE3 宏将自动处理系统调用的关联注册、参数传递处理等,无需其它操作。

3. 编译并安装内核

编译环境准备参见:https://blog.csdn.net/shida_csdn/article/details/139780103

make INSTALL_MOD_STRIP=1 binrpm-pkg -j 8
cd /root/rpmbuild/RPMS/x86_64
yum localinstall *
reboot

重启后,选择新内核
在这里插入图片描述

4. 验证系统调用

编写用户态测试程序 say_hello.c

#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <string.h>int main() {char name[] = "Alice";char result[120];long res = syscall(548, name, result, sizeof(result));if (res == 0) {printf("%s\n", result);} else {printf("System call failed with error code: %ld\n", res);}return 0;
}

编译并运行:

gcc -o say_hello say_hello.c
./say_hello# 会看到输出如下内容,证明系统调用成功
Welcome Alice

在这里插入图片描述

x86_64 的系统调用的参数传递使用的寄存器,可以在源码 arch/x86/entry/entry_64.S 中找到,最多支持 6 个参数:

* 64-bit SYSCALL instruction entry. Up to 6 arguments in registers.** This is the only entry point used for 64-bit system calls.  The* hardware interface is reasonably well designed and the register to* argument mapping Linux uses fits well with the registers that are* available when SYSCALL is used.** SYSCALL instructions can be found inlined in libc implementations as* well as some other programs and libraries.  There are also a handful* of SYSCALL instructions in the vDSO used, for example, as a* clock_gettimeofday fallback.** 64-bit SYSCALL saves rip to rcx, clears rflags.RF, then saves rflags to r11,* then loads new ss, cs, and rip from previously programmed MSRs.* rflags gets masked by a value from another MSR (so CLD and CLAC* are not needed). SYSCALL does not save anything on the stack* and does not change rsp.** Registers on entry:* rax  system call number* rcx  return address* r11  saved rflags (note: r11 is callee-clobbered register in C ABI)* rdi  arg0* rsi  arg1* rdx  arg2* r10  arg3 (needs to be moved to rcx to conform to C ABI)* r8   arg4* r9   arg5* (note: r12-r15, rbp, rbx are callee-preserved in C ABI)** Only called from user space.

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

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

相关文章

《每天5分钟用Flask搭建一个管理系统》第2章:项目结构与配置

第2章&#xff1a;项目结构与配置 2.1 Flask项目目录结构 一个典型的Flask项目可能包含以下目录和文件&#xff1a; /app - 应用目录 __init__.py - 初始化Flask应用models.py - 数据模型定义views.py - 视图函数定义forms.py - 表单类定义 /config - 配置文件目录 config.p…

机械行业常见问题及ERP解决办法

机械行业在全球经济一体化和技术进步背景下&#xff0c;面临着越来越多的挑战。为了在激烈的市场竞争中立于不败之地&#xff0c;企业需要找到合适的方法优化生产流程、降低成本、提升客户满意度。因此&#xff0c;有效地利用企业资源规划&#xff08;ERP&#xff09;解决方案变…

下标引用操作符;函数调用操作符;结构成员访问操作符

[] --- 下标引用操作符 下标引用操作符的操作数&#xff1a; 一个数组名 一个索引值 代码演示&#xff1a; #include<stdio.h> int main() {//创建数组int arr[5] { 1,2,3,4,5 }; // 数组下标&#xff1a; 0 1 2 3 4 //找到数组中3的元素并打印prin…

C# new关键字的三种用法

在C#中&#xff0c;new关键字具有多种不同的用途&#xff0c;主要包括以下三个&#xff1a; 1.作为运算符&#xff1a; 创建对象和调用构造函数&#xff1a;这是最常见的用法&#xff0c;用于在堆上分配内存并初始化一个类的新实例。例如&#xff1a; Person person new Pe…

从docker容器中导出单个表或整个数据库

首先你的服务器中已经有mysql容器进入到mysql容器中来 docker exec -it mysql /bin/bash 执行mysqldump命令导出数据 mysqldump -u root -p civil tb_user > product_info.sql# civil是数据库 # tb_user 是表名 # product_info.sql 是要保存数据的sql文件 上面这条命令会把…

65.WEB渗透测试-信息收集- WAF、框架组件识别(5)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;64.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;4&#xff09;-CSDN博客 waf绕…

从0开始学习pyspark--Spark DataFrame数据的选取与访问[第5节]

在PySpark中&#xff0c;选择和访问数据是处理Spark DataFrame的基本操作。以下是一些常用的方法来选择和访问DataFrame中的数据。 选择列&#xff08;Selecting Columns&#xff09;: select: 用于选择DataFrame中的特定列。selectExpr: 用于通过SQL表达式选择列。 df.select…

DSSAT作物模建模实践方法

随着数字农业和智慧农业的发展&#xff0c;基于过程的作物生长模型&#xff08;Process-based Crop Growth Simulation Model&#xff09;在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农业碳中和、农田固碳减排等领域扮演着越来越重要的作用。Decisi…

BMA580 运动传感器

型号简介 BMA580是博世&#xff08;bosch-sensortec&#xff09;的一款先进的、超小型加速度传感器。具有独特的骨传导语音活动检测功能和先进的功率模式功能&#xff0c;是世界上最小的加速度传感器&#xff08;1.2 x 0.8 x 0.55 mm&#xff09;。它专为紧凑型设备&#xff08…

多自由度平台资料网站连接

PLC控制的4点调平系统 - 豆丁网 (docin.com) 三自由度运动平台系统建模与分析 - 豆丁网 (docin.com) 四足机器人&#xff08;三&#xff09;--- 姿态控制_四足机器人姿态控制-CSDN博客

刀片服务器和机架式服务器有何区别

刀片服务器和机架式服务器有何区别 一、物理设计&#xff1a; 刀片服务器&#xff1a;刀片服务器是一种相对较轻薄的服务器设计&#xff0c;其物理形状类似于刀片&#xff0c;通常插入到专用的刀片机箱中。每个刀片通常包含一个或多个服务器节点&#xff0c;共享一些基本的资源…

Postman编写测试脚本

在 Postman 中&#xff0c;编写测试脚本通常使用 JavaScript&#xff0c;这些脚本可以在请求发送前后执行。以下是一些示例代码&#xff0c;展示了如何在 Postman 中使用测试脚本。 1. 测试脚本示例&#xff1a;检查响应状态码 // 测试脚本在请求发送后执行 pm.test("Re…

2024年建筑八大员(质量员-土建专业)考试题库。全面提升考试成绩,轻松过级!

1.砖基础施工时&#xff0c;砖基础的转角处和交接处应同时砌筑&#xff0c;当不能同时砌筑时&#xff0c;应留置&#xff08;&#xff09;。 A.直槎 B.凸槎 C.凹槎 D.斜槎 答案&#xff1a;D 2.分项工程施工前技术准备工作&#xff0c;主要指把拟定的分项工程施工前所需要…

Python的库dataperp读取excel和csv

领导说这个很牛&#xff0c;不过咱们不能听别人一口之言&#xff0c;咱们应该亲手试试&#xff0c;在来说这个好或者不好。 这个dataprepe已经不维护了&#xff0c;最高只支持python3.11以下版本,建议选择3.9. 他只能处理dataframe格式的数据&#xff0c;也就是pandas加载后的数…

穿梭在Yarn的代理配置迷宫:全面指南

&#x1f9f6; 穿梭在Yarn的代理配置迷宫&#xff1a;全面指南 Yarn是一个现代的包管理器&#xff0c;用于JavaScript应用程序&#xff0c;它提供了快速、可靠和安全的依赖管理。然而&#xff0c;在某些网络环境下&#xff0c;例如公司内网或需要通过代理服务器访问外部资源时…

Python模拟火焰文字效果:炫酷的火焰字动效

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame定义火焰效果类主循环 完整代码 引言 火焰文字效果是一种炫酷的视觉效果&#xff0c;常用于广告、游戏和艺术设计中。在这篇博客中&#xff0c;我们将使用Python创建一个火焰文字的动画效果。通过利用Py…

TON、Solana 和 以太坊 2.0 的对比

自 2017 年编写最初的 TON 白皮书[1] 以来&#xff0c;出现了许多新的区块链项目&#xff0c;例如 Solana 和 Ethereum 2.0。在本文中&#xff0c;我们将 TON 与其中一些比较有代表性的区块链项目进行了对比。 1. 对比形式 根据 TON 原白皮书第2.8 和2.9 节对区块链项目的分类…

红外可见光双光相机常见问题

1. 红外图像和可见光图像的坐标对应关系是怎样的 &#xff1f; 这个需要自己换算&#xff0c;红外和可见光拍同一个参照物&#xff0c;让两个图像叠加&#xff0c;缩放平移红外图像&#xff0c;使两个图像中参照物边缘重合&#xff0c;用此时的缩放比和平移坐标来换算。 2. 红…

白骑士的Python教学高级篇 3.3 数据库编程

系列目录 上一篇&#xff1a;白骑士的Python教学高级篇 3.2 网络编程 SQL基础 Structured Query Language (SQL) 是一种用于管理和操作关系型数据库的标准语言。SQL能够执行各种操作&#xff0c;如创建、读取、更新和删除数据库中的数据&#xff08;即CRUD操作&#xff09;&a…

前端开发中的常见问题及解决方法

前端开发是一个充满挑战和乐趣的领域。然而&#xff0c;在开发过程中&#xff0c;开发者常常会遇到各种各样的问题。本文将介绍一些前端开发中常用或者经常遇到的问题&#xff0c;并提供相应的解决方法&#xff0c;帮助你提高开发效率和解决问题的能力。 一. 页面布局问题 问题…