操作系统第二次实验-------向linux内核添加自定义的系统调用函数

本文详述了如何在Linux 4.10.1内核中添加自定义系统调用,包括修改系统调用号、分派表、函数声明和实现,以及编译内核的步骤。实验还涉及用户态代码的编写,通过对比分析系统调用与用户态函数的时间开销。
摘要由CSDN通过智能技术生成

实验目的

  本次实验主要是完成一个简单四则运算的系统调用,同时在用户态实现一个相同功能的代码,比较系统调用与普通用户态的时间开销,分析时间差异性。

实验环境

  系统版本 Ubuntu 18.0.4
  当前linux内核版本 linux4.15.0-101
  需要重新编译的linux版本 4.10.1

实验内容

  本次实验主要涉及以下三个方面的内容:
  第一、添加自定义的系统调用,这一块主要涉及:添加系统调用号、在系统调用分派表中添加对应项、添加系统调用函数声明、系统调用函数实现
  第二、编译内核,这是比较痛苦且漫长的过程,中间会有很多问题
  第三、编写相应的代码,完成实验。

添加自定义的系统调用

  首先获取 4.10.1版本的linux内核,我这里贴一个网址,速度比官网快很多的。不同版本的linux内核下载地址,下载后放到/usr/src/目录下,然后解压,如下图所示。
在这里插入图片描述
  打开相应文件夹,第一步添加系统调用分配表,打开目录/usr/src/linux-4.10.1/arch/x86/include/generated/uapi/asm,如下图所示
在这里插入图片描述
  在unistd_64.h中添加自己的系统调用号,本次实验中我使用333作为新的系统调用号
在这里插入图片描述
注:如果你是第一次下载该内核,且没有编译过这一步可以直接跳过,因为这个generate文件夹是在编译过程中生成的,最初没有。
  第二步,向系统调用分派表中添加相应的项。到文件夹/usr/src/linux-4.10.1/arch/x86/entry/syscalls下,打开syscall_64.tbl文件,添加相应项。
在这里插入图片描述
  第三步,添加系统调用。到文件夹/usr/src/linux-4.10.1/include/linux下,打开文件syscalls.h,添加函数声明。第一、二步骤涉及硬件方面的操作,主要是系统中断到找到这个函数的地址(80中断软中断),找到这个函数地址之后就要进行软件层面的调用。所以前面的文件修改都在arch下。
在这里插入图片描述
  第四步,添加函数实现。到文件夹/usr/src/linux-4.10.1/kernel下,打开sys.c文件,添加系统调用实现,
在这里插入图片描述
在这里插入图片描述
注意函数参数中类型和变量名之间有逗号。
至此我们的第一步就完成了。这个过程还是很简单的,此过程要注意的是一些文件可能因为linux的版本不同而导致放置的位置不同,所以要结合自己的linux版本找到对应的文件。

编译linux内核

  这是耗时最长的一步,我花了整整一天才搞定。编译内核首先需要一些工具,这些工具在遇到问题时,会提示你缺少某些文件或者组件之类的,你只需要安装对应的工具即可这个问题比较简单,我假设现在已经有了完备的工具可以进行编译工作了。
  第一步,回到linux内核的根目录下/usr/src/linux-4.10.1,make menuconfig 或者 make oldconfig,总之如果你直接make bzImag提示出错,就按提示来操作。
         执行make bzImage -jx (x是线程数)
  注意这个I不是L而是大写的i。这一步会生成一个压缩的linux内核的压缩镜像,这个由setup.bin和vmlinux.bin链接而成,前者主要是做一些开机的硬件引导工作。这一步会出现以下错误。
在这里插入图片描述
上网搜索过后才知道我们需要对/usr/src/linux-4.10.1/include/linux下的log2.h和/usr/src/linux-4.10.1/tools/include/linux/下的log2.h文件打补丁,打补丁的目的大致是要弃用____ilog2.NaN这个函数,补丁内容如下

diff --git a/include/linux/log2.h b/include/linux/log2.h
index ef3d4f67118c..c373295f359f 100644
--- a/include/linux/log2.h
+++ b/include/linux/log2.h
@@ -16,12 +16,6 @@
 #include <linux/bitops.h>
 
 /*
- * deal with unrepresentable constant logarithms
- */
-extern __attribute__((const, noreturn))
-int ____ilog2_NaN(void);
-
-/*
  * non-constant log of base 2 calculators
  * - the arch may override these in asm/bitops.h if they can be implemented
  *   more efficiently than using fls() and fls64()
@@ -85,7 +79,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
 #define ilog2(n)				\
 (						\
 	__builtin_constant_p(n) ? (		\
-		(n) < 1 ? ____ilog2_NaN() :	\
+		(n) < 2 ? 0 :			\
 		(n) & (1ULL << 63) ? 63 :	\
 		(n) & (1ULL << 62) ? 62 :	\
 		(n) & (
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一、 实验目的 1、 通过实验了解和熟悉Linux文件系统 2、 掌握文件操作命令 3、 了解文件与目录的默认权限,掌握文件权限的设置 4、 掌握文件的链接 二、 开发工具和运行环境 1、虚拟机VMware 2、Linux操作系统 三、 实验内容 1、了解和熟悉Linux文件系统 了解Linux文件系统、文件命名、文件类型和常见目录:根目录(/)、 .bin、boot、dev、etc、home、Lib、lost+found、 opt、root、 usr、mnt、proc、sbin、 tmp、 var. 2、文件操作命令: (文件和目录名自拟、自行设计实验步骤) (1) 1s: 显示目录内容 -a显示指定目录下所有的目录与文件 -1以 长格式显示文件的详细信息。 -d显示目录本身信息 i显示索引号 (2) cd:改变当前工作目录 格式: cd [目录名] cd .. 上移- -层目录(注意,需要有空格) cd 移到自己的主目录 (3) cat: 查看文件信息命令 显示文件信息:格式: cat [选项]文件名 -n输出编号 建立文件: cat>新文件名ctrl+d 合并文件: cat 文件1文件2>新文件 (4) more: 逐屏显示文件内容 格式: more 文件名 (5) cp:复制命令 格式: cp [选项] 源文件或目录目标文件或目录 同时可以复制多个文件 -f 出现覆盖情况不提示 -p复制后,保持原有属性。目标文件保持原有的生成日期和inode编号 -r 复制目录及目录下的文件 普通用户并不能进行这样的操作,只能切换到root用户然后进行-r的递归复制。 (6) rm: 删除文件与目录 格式: mv [选项] 文件名或目录名 -f删除时不提示 -r 删除目录及目录下的文件(常用: -rf ) (7) mv: 文件移动及改名命令 格式: mv [选项]源文件或目录 目 标文件或目录 -f覆盖文件时 不提示 (8) grep: 文件信息检索命令 格式: grep [选项]字符串 [文件 ... ] -i 不区分大小写 (9) sort: 排序命令 格式: sort [选项][文件列表] (10) mkdir 创建目录命令 格式: mkdir [选项] [目录名] 可以同时创建多个目录 p :递归创建目录 -m:创建目录的时候赋予权限 (11) rmdir删除“空”目录命令 格式: rmdir [选项] [目录名] 注意:目录为空才能删除;否则需采用rm - r来删除。 p :递归删除目录,删除子目录,其父目录为空时,也同时删除3、文件权限的设置: (文件和目录名自拟、自行设计实验步骤) 文件的属主与属组 (1) chown [选项] [所有者][:[组]] 文件列表 更改每个文件的所有者和/或所属组。 字母模式形式即“用户对象操作符号操作权限”,其命令格式为:(2) chmod [选项]模式[,模式]文件名 +:添加-:取消=:赋予并取消其他所有 数字形式即由三位八进制数字组成,其命令格式为: chmod八进制模式 文件名 文件的特殊权限: SUID、 SGID 和Sticky 4、文件的链接: (文件和目录名自拟、自行设计实验步骤) (1)硬链接:不带选项,ln命令创建硬链接。在另外的目录或本目录中增加目标文件的一个目录项,一个文件就登记在多个目录中 1n源文件目标文件 (2)软链接(符号链接):用“1n -s”命令建立符号链接时,最好源文件用绝对路径名,这样可以在任何工作目录下进行符号链接。类似于Windows系统中的快捷方式。 In -s源文件目标文件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值