前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >操作系统课设——CentOS增加系统调用

操作系统课设——CentOS增加系统调用

作者头像
星陨1357
发布于 2023-07-10 04:42:18
发布于 2023-07-10 04:42:18
2K00
代码可运行
举报
运行总次数:0
代码可运行

一、具体任务

采用编译内核法,在Linux中增加一个系统调用。

要求:

  1. 系统调用实现的功能:计算一个数字的三次方, 并打印出来。
  2. 另外写一个程序进行调用

相关思路:

本次实验实在CentOS 7系统中对于Linux内核源码进行修改,并对源码进行编译,最后完成切换内核操作,并在C语言程序中进行系统调用。

具体步骤:

  • 下载Linux 4.20.4版本的源码
  • 安装所需的工具和相关的编译环境
  • 对源码进行修改并增加功能
  • 对原本的系统环境内进行系统调用的添加
  • 进行Linux内核的编译
  • 编写C语言程序并在其中对添加的功能进行验证

二、CentOS系统的安装

本次系统安装采用了CentOS 7的系统,在VMware WorkStation中安装具体过程不在赘述,注意,尽量将CPU核数给多一些,以免编译的时间过长,建议存储空间大于40GB,防止出现内存不足的情况。

注意:安装完成以及下面每一步进行记得一定要打上快照,否则出现错误重新操作异常困难,养成打快照的好习惯

三、安装相关的系统环境

使用yum包管理工具将编译需要的相关工具进行安装,为下一步编译进行准备

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo yum -y install ncurses-devel
sudo yum -y install bc
sudo yum -y install bison
sudo yum -y install flex
sudo yum -y install gcc g++ gdb make
sudo yum -y install centos-release-scl
sudo yum -y install devtoolset-7-gcc*
sudo yum -y install elfutils-libelf-devel
sudo yum -y install openssl-devel
sudo yum -y install zlib zlib-devel pcre pcre-devel gcc gcc-c++ openssl openssl-devel libevent libevent-devel perl unzip net-tools wget

四、对源码进行下载并修改

下载源码

Linux的源码可以从其官方的网站下载,这里选择了Linux-4.20.4版本的源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 下载速度因人而异,我的网络环境比较好大概两三秒就下载完成了,也有人出现需要下载一两个小时的
# 建议采取一些措施改善一下网络环境
sudo wget http://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.20.4.tar.xz

修改源码

刚才我们将源码下载到了我们当前用户的根目录下,一般的CentOS 7使用的应该是root用户进行登录的,那么此时你的下载的源包就在/root目录下。

修改/usr/src/kernels/linux-4.20.4/kernel/sys.c文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 文件最后加入我们自己的功能调用
SYSCALL_DEFINE1(cube,int,num){
    int result = num*num*num;
    return result;
}

修改/usr/src/kernels/linux-4.20.4/arch/x86/include/asm/syscalls.h文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 在这个文件内我们可以添加我们自己的声明
// 在/*kernel/ioport.c*/下下面进行添加
asmlinkage long sys_cube(long n);

五、添加系统调用号

修改/usr/src/kernels/linux-4.20.4/arch/x86/entry/syscalls/syscall_64.tbl文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 第一个是系统调用号
335  64  cube  __x64_sys_cube

六、准备并进行编译

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cp /boot/config-3.10.0-1160.71.1.el7.x86_64 /usr/src/kernels/linux-4.20.4/.config
make menuconfig # 对Config进行再设置

这里注意,在make设置的时候,移动光标直接选择load,由于Linux会隐藏点开头的文件,.config以及刚刚我们复制过来的文件config文件只有ll命令才能看见,ls命令无法查看。

选择load之后即可选择yes即可配置完成,将当前界面退出,使用ll -a命令我们可以发现原本的.config文件已经变成了.config.old,并且生成了一个新的.config文件,如下图。

下面我们可以进行编译了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 进行编译 时间可能比较长 16指的是使用多少核心去执行编译 我自己的电脑分配了16核 大概需要20分钟 根据个人电脑动态调整核数
make -j16
# 安装模块和内核
make modules_install
make install
# 更新引导文件
grub2-mkconfig -o /boot/grub2/grub.cfg

七、写程序进行验证

编写验证程序

新建一个C语言程序test.c进行验证

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 输入以下代码
#include<stdio.h>
#include<linux/kernel.h>
#include<sys/syscall.h>
#include<unistd.h>
int main(){
        double n;
        long s;
        printf("请输入一个数字:");
        scanf("%lf",&n);
        s=n*100;
        if(s<0){
                s = -syscall(335,-s);
        }
        else{
                s = syscall(335,s);
        }
        n = s;
        n = n / syscall(335,100);
        printf("结果为:");
        printf("%lf",n);
        return 0;
}

测试结果

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
实验:CentOS 7 编译安装最新版内核 Linux Kernel 6.5.2
注意:一定要执行 cd linux-6.5.2 命令,因为接下的操作默认都是这该目录下操作的。
ling218cn
2023/09/10
3.8K0
CentOS7.x系统配置记录
建议使用阿里云的源其他发行版等同:http://mirrors.aliyun.com/help/centos
全栈工程师修炼指南
2020/10/26
2.2K0
CentOS7.x系统配置记录
CentOS7.x系统配置记录
建议使用阿里云的源其他发行版等同:http://mirrors.aliyun.com/help/centos
全栈工程师修炼指南
2022/09/28
1.2K0
CentOS7.x系统配置记录
Linux系统内核升级
Linux kernel官网:https://kernel.org/ Active kernel releases(查看EOL信息):https://kernel.org/category/releases.html
王先森sec
2023/04/24
4K0
Linux系统内核升级
内核必须懂(一): 用系统调用打印Hello, world!
目录 前言 模块与系统调用 用模块打印Hello, world! 用模块添加自定义系统调用 top指令 关闭Linux图形界面 重编内核添加系统调用 解压系统源代码 撰写自定义系统调用 编译内核 测试新内核 最后 ---------- 前言 要自定义系统调用, 常规的两个方法是模块和重编内核, 一起来看看吧. 更新: 在64位ubuntu12.04.5上也成功运行. 解决了14.04, 16.04, 18.04上的问题. ---------- 模块与系统调用 用模块打印Hello, world! 首先看下系
sean_yang
2018/10/01
1.6K0
Linux学习笔记(九)软件包管理
包管理器是方便软件安装、卸载,解决软件依赖关系的重要工具,在不同发行版本的Linux系统中,有着不同的软件包管理器:
小雨coding
2020/06/16
1.7K0
Linux学习笔记(九)软件包管理
内核必须懂(一): 用系统调用打印Hello, world!
前言 要自定义系统调用, 常规的两个方法是模块和重编内核, 一起来看看吧. ---- 模块与系统调用 用模块打印Hello, world! 首先看下系统版本和内核版本. 我用的是32位的ubu
sean_yang
2018/10/10
1.3K1
内核必须懂(一): 用系统调用打印Hello, world!
Linux(六)
rpm 包格式: 软件名称-软件版本.系统版本.平台.rpm 如: vim-common-7.4.10-5.el7.x86-64.rpm
1ess
2021/11/01
4540
VirtualBox 中的Centos如何安装VBoxGuestAdditions
最近在VirtualBox的虚拟机中安装Centos遇到一个问题:如何安装VBoxGuestAdditions功能。
全栈程序员站长
2022/07/02
1.1K0
VirtualBox 中的Centos如何安装VBoxGuestAdditions
CentOS7 升级最新内核
yum 方式升级到最新版 导入 elrepo 仓库 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm 列出可用的内核相关包 # kernel-lt:长期支持版本,用于修复旧版内核的 BUG,这些内核只会修复重大 BUG,并且不会频繁发布版本。 # kernel-ml:最新稳定版本 yum --d
陳斯托洛夫斯記
2022/10/27
2.4K0
CentOS7 升级最新内核
Centos和Ubutun系统内核升级操作
让我们安装了一个发行版,它包含了一个特定版本的内核。为了展示当前系统中已安装的版本,我们可以:
没有故事的陈师傅
2021/05/14
9330
写一个操作系统_08 内核与C语言
我们开发用户应用程序的时候,有标准库可以用,最典型的就是GUN C库,标准库一般是系统调用的封装,表面上是通过标准库访问系统资源,实际上是通过系统调用实现的。Linux的系统调用一般是先往eax寄存器写入系统调用号,然后通过0x80中断来实现。中断向量号为0x80称为系统中断门,更多的中断参考中断描述符表。
changan
2020/11/04
8420
centos 6 编译安装内核
一、基础环境配置 1、配置yum源(centos6官方已经下架,不在维护,yum源需要配置到备用源) [root@centos6 ~]# cat /etc/yum.repos.d/CentOS- CentOS-Base.repo CentOS-Debuginfo.repo CentOS-fasttrack.repo CentOS-Media.repo CentOS-Vault.repo [root@centos6 ~]# cd /etc/yum.repos.d/ [root@cen
用户6792968
2022/08/30
1.8K0
centos 6 编译安装内核
CentOS 7内核升级操作参考
CentOS(Community Enterprise Operating System)是Linux发行版之一,它由来自于Red Hat Enterprise Linux(RHEL)依照开放源代码规定发布的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用[1]。自从红帽公司单方面宣布终止CentOS的开发后,我们腾讯云的用户也逐步开始将应用迁移到其它操作系统上。由于CentOS 7的维护终止日期在2024年6月30日,距离当前还有一段时间,所以还有少量客户在继续使用着该版本。
dinghailong
2023/01/06
5.5K0
Centos内核升级的三种方法 转
在基于CentOS平台的工作过程中,难免有时需要升级或者降级内核以验证功能、调试性能或者更新整个系统。
双面人
2019/04/10
2.9K0
Centos内核升级的三种方法
                                                                            转
CentOS7安装VMware Tools
在虚拟机中,以 root 身份登录客户机操作系统,打开终端窗口并运行ls /dev命令查看是否含有cdrom目录
全栈程序员站长
2022/09/01
3K0
CentOS7安装VMware Tools
CentOS6.5升级内核到3.10.28
本文适用于CentOS 6.4, CentOS 6.5,估计也适用于其他Linux发行版。
孙杰
2019/10/29
2.2K1
写一个操作系统_04 内核调试环境搭建
有一台win10的笔记本,调试想选择在Linux环境下,选择配置虚拟机,然后安装bochs调试内核 需要准备的软件:
changan
2020/11/04
1.1K0
写一个操作系统_04 内核调试环境搭建
CentOS 6.5 升级内核教程
1.下载源码包 网址:http://www.kernel.org 在首页可以看到有stable,longterm等版本,一般选择下载longterm版本,因为此版本为提供长期支持的稳定版,因此我选择3.12.16. [root@CentOS-BinaryDev~]# wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.12.16.tar.xz 2.解压并进入目录 [root@CentOS-BinaryDev~]# tar -xf linux-3.12.16.tar.xz [root@CentOS-BinaryDev~]# cd linux-3.12.16 3.更新当前系统 [root@CentOS-BinaryDev~]# yum update [root@CentOS-BinaryDev~]# yum upgrade 4.安装编译内核所需要的软件包 [root@CentOS-BinaryDev~]# yum groupinstall “Development Tools” [root@CentOS-BinaryDev~]# yum install ncurses-devel [root@CentOS-BinaryDev~]# yum install qt-devel [root@CentOS-BinaryDev~]# yum install hmaccalc zlib-devel binutils-devel elfutils-libelf-devel 5.查看当前系统内核 [root@CentOS-BinaryDev~]# uname -r 2.6.32-358.11.1.el6.x86_64 6.将当前系统内核的配置文件拷贝到当前目录 [root@CentOS-BinaryDev~]#cp /boot/config-2.6.32-358.11.1.el6.x86_64 .config 7.使用当前系统内核配置,并自动接受每个新增选项的默认设置 [root@CentOS-BinaryDev~]# sh -c ' yes “” | make oldconfig' 8.编译 [root@CentOS-BinaryDev~]# make bzImage [root@CentOS-BinaryDev~]# make modules [root@CentOS-BinaryDev~]# make modules_install 9.安装 [root@CentOS-BinaryDev~]# make install 如果出现少量ERROR可以忽略 10.修改Grub引导顺序 [root@CentOS-BinaryDev~]# vim /etc/grub.conf 一般新内核的位置都在第一个,所以设置default=0. 11.重启后查看内核版本号 [root@CentOS-BinaryDev~]# uname -r 3.12.16 12.如果失败,转至第5步,在重新开始之前,需要清理上次编译的现场 [root@CentOS-BinaryDev~]# make mrproper
似水的流年
2019/12/06
1.9K0
Linux升级内核--编译安装
目前最新的稳定版本是5.9.14, 但是编译该版本的内核需要高版本的gcc, 生产环境gcc尽量保持与发行版本一致
大大刺猬
2020/12/13
7.4K0
Linux升级内核--编译安装
相关推荐
实验:CentOS 7 编译安装最新版内核 Linux Kernel 6.5.2
更多 >
LV.0
东方财富运维工程师
作者相关精选
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验