【操作系统】实验四 增加Linux系统调用

🕺作者: 主页

我的专栏
C语言从0到1
探秘C++
数据结构从0到1
探秘Linux

😘欢迎关注:👍点赞🙌收藏✍️留言

🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢支持!!!

文章目录

  • 实验四
    • 实验内容
    • 实验过程
      • 部分A: 添加新的内核系统调用
      • 部分B: 重新编译和安装内核
      • 部分C编写一个用户态的程序
    • 实验小结

实验四

实验内容

  1. 实验名称:增加Linux系统调用
  2. 实验任务:
    学习如何产生一个系统调用以及怎样同过往内核中增加一个新函数从而在内核空间中实现对用户空间的读/写。
    部分A
    添加一个新的内核系统调用,具体完成某个你希望实现的功能。
    部分B
    重新编译内核,使你的系统调用可用。
    部分C
    编写一个用户态的程序,验证你增加的系统调用。

实验过程

部分A: 添加新的内核系统调用

在最新版本的 Linux 内核源代码中,系统调用入口表通常不再在 entry_64.S文件中。系统调用入口表的位置在不同的内核版本中可能会有所变化。通常,它会在 arch/x86/entry/syscalls/syscall_64.tbl 文件中定义。

新下载一个内核源代码,然后解压再进行下面步骤:

  1. 打开终端并进入内核源代码目录。根据内核版本,可能会有所不同:

    cd /usr/src/linux-6.0.1 # 根据你的内核版本进入相应的目录

  2. 查找系统调用入口表的位置。可以使用以下命令找到它:
    find . -name syscalls.h
    这将在整个内核源代码目录中搜索 syscalls.h文件,如图所示。
    vim ./arch/x86/include/asm/syscalls.h

    图1 找到的syscalls.h 文件
    打开找到的 syscalls.h 文件,在里面声明自己的系统调用函数,如图2所示。

    图2打开syscalls.h文件

  3. 添加asmlinkage long sys_helloworld(void);声明,如图3所示。

    图3 添加声明

  4. 添加系统调用id:文件为 syscall_64.tbl它包含系统调用号和系统调用函数之间的映射,如图4所示。

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


图4 添加系统调用
在文件中找到一个空的系统调用入口,通常为sys_ni_syscall
使用命令 /sys_ni_syscall 搜索,找到以后回车,然后 点击 i 即可修改
修改内容,如图5所示。:

图5 添加系统调用入口
这表示将系统调用号 156映射到名为 sys_my_call 的系统调用函数。

  1. 保存文件并退出编辑器。
:wq

编写新的系统调用函数,先打开sys.c文件,如图6所示。

图6 打开sys.c文件
6. 在内核源代码目录中,打开文件 kernel/sys.c 以编辑,如图7所示。

图7 执行 vim kernel/sys.c命令
7. 在文件末尾添加你的新系统调用函数 sys_my_call的定义。例如,你可以添加一个简单的示例系统调用,如图8所示。

asmlinkage long sys_helloworld(void) {
printk(“hello world”);
return 1; 
}


图8 添加系统调用
注意:这里函数定义部分有些教程中使用的是 asmlinkage helloworld(void)在高版本的内核中很可能会出现以下报错:

arch/x86/entry/syscall_64.o:(.rodata+0xa78):undefined reference to '__x64_sys_helloworld'

在我的版本下使用如下函数形式,如图9所示。

SYSCALL_DEFINE0(helloworld) {
Printk(“hello world!\n”);
return 0; 
}


图9 添加系统调用
8. 保存文件并退出编辑器。

:wq

部分B: 重新编译和安装内核

  1. 在终端中编译内核:
  2. 在此之前需要 make clean 清理一下旧文件
  3. 重新配置.config文件 make menuconfig
    make menuconfig 时将general setup -> localversion 修改成新的名称,如 “wikiKernel”
  4. 然后make -j8 编译内核 (时间较长)
    编译成功,没有报错信息,如图10所示。

    图10 编译内核完毕
  5. 安装内核
    编译成功,没有报错信息,如图11所示。
    图11 执行sudo make modules_install命令安装内核成功

    图12 执行sudo make install命令

    图13 reboot重启机器

部分C编写一个用户态的程序

验证系统调用,如图14、15所示。
新建hello.c文件,编写程序如下:

#include <stdio.h>
#include<linux/kernel.h>
#include<sys/syscall.h>
#include<unistd.h>int main()
{long int a = syscall(156);printf("System call sys_helloworld return %ld\n", a);return 0;
}


图14 验证系统调用的代码
编译:
Gcc -o a hello.c
运行:
./a.out

图15 执行命令,验证系统调用添加成功

实验小结

在本次实验中,我成功地增加了Linux系统调用,并通过重新编译内核和编写用户态程序的方式实现了对用户空间的读/写功能。在实验过程中,我遇到了以下一些问题和挑战:

存在问题:

  1. 在添加新的系统调用时,需要深入理解Linux内核的机制和源代码,对于初学者来说有一定的难度。
  2. 在重新编译内核时,需要安装并配置相应的编译工具和环境,对于操作系统的了解和熟练掌握程度有一定要求。
  3. 在编写用户态程序时,需要熟悉Linux的系统调用接口,以及如何与内核交互,需要进行比较深入的学习和理解。

注意事项:

  1. 在整个实验过程中,要特别注意安全性原则,避免操作系统内核被破坏或者数据被篡改。
  2. 在修改和编译内核时,务必备份原有的内核文件,以防止操作失误导致系统无法启动。
  3. 在进行用户态程序开发时,需要考虑异常情况的处理和错误信息的输出,确保程序的健壮性和可靠性。

有待提高的能力:

  1. 理解并掌握操作系统的内核机制和体系结构,提高对内核源代码的理解和阅读能力。
  2. 熟悉Linux系统调用的接口和使用方法,能够灵活地进行系统调用操作。
  3. 学会使用编译工具和环境,能够独立完成内核的编译和安装过程。
  4. 提高代码的编写能力和调试技巧,加强对程序异常情况的处理能力。
  5. 培养独立思考和解决实际问题的能力,寻找并探索更多的实践机会,不断提高自己的技术水平和能力。

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

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

相关文章

低噪声放大器LNA 之 噪声系数

​ 一、噪声系数的定义 在定义噪声系数之前&#xff0c;先看一个放大器输入输出端信噪比&#xff08;信号功率与噪声功率之比&#xff0c;写作SNR&#xff09; 对比图&#xff1a; ​​从上图可用看出&#xff0c;从输入端到输出端&#xff0c;信号和噪声功率都得到了放大&…

使用 vLLM 部署本地 LLM 指南

目录 vLLM 安装与模型下载离线批量推理OpenAI 兼容服务器 参考资料&#xff1a; vLLM GitHub首页 vLLM 官方文档 vLLM 安装与模型下载 vLLM 安装&#xff1a;直接 pip install 即可 我选取了 OpenChat-3.5-0106 模型&#xff0c;这个模型是由 mistralai/Mistral-7B-v0.1 微…

docker设置代理解决内网pull外网镜像

目录 Docker 配置代理的缘由 通过dockerd配置实现代理 通过container配置实现代理 参考文献 Docker 配置代理的缘由 如何在内网环境内环境内Pull外网registry&#xff0c;或者反过来想要Pull公司Registry镜像&#xff1f;存在上述需求的朋友可以尝试以下方法进行docker代理…

高校实验室智能管理

运行环境&#xff1a; jdk7tomcat7mysqleclipse 技术&#xff1a; springhibernatestruts2jspjquery 功能介绍&#xff1a; 一套完整的实验室管理系统&#xff0c;系统支持用户的注册登陆&#xff0c;系统分为学生&#xff0c;教师&#xff0c;管理员三个角色&#xff0c;…

[BUG] Authentication Error

前言 给服务器安装了一个todesk&#xff0c;但是远程一直就是&#xff0c;点击用户&#xff0c;进入输入密码界面&#xff0c;还没等输入就自动返回了 解决 服务器是无桌面版本&#xff0c;或者桌面程序死掉了&#xff0c;重新安装就好 sudo apt install xorg sudo apt inst…

数据结构<1>——树状数组

树状数组&#xff0c;也叫Fenwick Tree和BIT(Binary Indexed Tree)&#xff0c;是一种支持单点修改和区间查询的&#xff0c;代码量小的数据结构。 那神马是单点修改和区间查询&#xff1f;我们来看一道题。 洛谷P3374(模板): 在本题中&#xff0c;单点修改就是将某一个数加上…

有哪些简单好用、适合中小型企业的CRM系统?

阅读本文&#xff0c;你将了解&#xff1a;一、中小型企业对CRM系统的主要需求&#xff1b;二、盘点四款好用的CRM系统&#xff1b;三、CRM系统实施策略和优秀实践。 在快速变化的商业环境中&#xff0c;中小型企业面临着独特的挑战&#xff1a;如何在有限的资源下高效地管理客…

web安全思维导图(白帽子)

web安全思维导图(白帽子) 客户端脚本安全 服务端应用安全 白帽子讲web安全 安全运营体系建设

2、Line Charts折线图

可视化时间趋势 现在你已经熟悉了编码环境,是时候学习如何制作自己的图表了! 在本教程中,您将学习足够的Python来创建专业外观的折线图。然后,在接下来的练习中,您将使用您的最新技能处理真实世界的数据集。 本课程数据集夸克网盘下载链接:https://pan.quark.cn/s/a235ac…

数据管理平台Splunk Enterprise本地部署并结合内网穿透实现远程访问

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 本文主要介绍如何简单几步&#xff0c;结合cpolar内网穿透工具实现随时随地在任意浏览器&#xff0c;远程访问在本地…

智能控制箱解决方案

一、建设背景 在数字时代的浪潮中&#xff0c;智能化的管理和操作已经成为各行业的共同追求。唯众物联网智能控制箱&#xff0c;是一款功能性强、使用安装简单的智能网络传输、温湿度监测、门锁控制综合系统。系统由I/O网络模块、传感器、管理后端、移动端APP组成&#xff0c;辅…

TArry TMap TSet

一.TArry 1. TArray<int32> MyArray; 增加 删除 改 查 2.TMap<int32, int32>MyMap; //TMap是一种键值对容器&#xff0c;里面的数据都是成对出现的(Key&#xff0c;Value),Value通过Key值来获取&#xff0c;且Key值不能重复&#xff0c;key值唯一。 增&#x…

idea——git提交到本地记录如何退回/删除

目录 一、git提交到本地记录如何退回/删除 一、git提交到本地记录如何退回/删除 git提交到本地记录&#xff0c;如下图【更新】记录&#xff0c;表示本次提交到git本地需要退回/删除的操作&#xff1a; 选中项目&#xff0c;右键点击【git】——>【Show History】——>…

基于SSM的影视创作论坛(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的影视创作论坛&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

21.云原生之GitLab pipline语法(CI基础)

云原生专栏大纲 文章目录 gitlab-ci.yml 介绍GitLab中语法检测gitlab-ci.yml 语法job定义作业before_script和after_scriptstages定义阶段tages指定runnerallow_failure运行失败when控制作业运行retry重试timeout超时parallel并行作业only & exceptrulescache 缓存cache:p…

PolarDB 再升级:欢迎来到云数据库 x AI新时代

大模型时代&#xff0c;数据库的变化走到了哪&#xff1f; 作者|思杭 编辑|皮爷 出品|产业家 “搭积木”、“‘自动驾驶’”、“三层解耦”&#xff0c;这些形象的标签成了1月17日阿里云开发者生态大会当天最出圈的词汇。 会上&#xff0c;一名小学生受邀上台演示了数据…

3.jmeter接口关联及实战

1.当所传参数包含键值对和json文件时&#xff0c;键值对放在链接后&#xff0c;参数放在消息体数据中 2.当查看结果树返回乱码时&#xff0c;修改请求中内容编码为utf-8 一、jmeter接口关联 1.正则表达式提取器 接口2.3传递的参数中需要用到接口1的返回值 禁用接口2.3&#…

Elasticsearch:Simulate ingest API

Ingest pipeline 为我们摄入数据提供了极大的方便。在我之前的文章中&#xff0c;有非常多的有关 ingest pipeline 的文章。请详细阅读文章 “Elastic&#xff1a;开发者上手指南”。针对一组提供的文档执行摄取管道&#xff0c;可以选择使用替代管道定义。 Simulate ingest AP…

基于关系型数据库的知识图谱存储探析

目录 前言1 图结构数据的关系存储1.1 Wikidata与MySQL的结合1.2 关系型数据库的优势与挑战 2 选择数据库需要考虑的三个问题2.1 存储的物理结构2.2 存储的性能问题2.3 图的查询问题 3. 不同的存储方式3.1 Triple Store3.2 属性表存储3.3 二元表3.4 全索引结构 结语 前言 在当今…

前端动画特效分享(附效果图及在线演示)

分享7款有趣也实用的前端动画特效 其中有CSS动画、canvas动画、js小游戏等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 SVG天气图标动画特效 SVG天气图标动画特效 不管是晴天雨天等都很完美的展示出了各自真实的…