实验介绍

上篇文章已经介绍了Linux内核的编译与安装,我们已经掌握了Linux系统内核的编译和启用。接下来,我们将学习掌握如何添加Linux的系统调用,学习掌握测试Linux系统调用。


什么是系统调用(system call)

由操作系统提供的供所有系统调用的程序接口集合;用户程序通常只在用户态下运行,当用户程序想要调用只能在内核态运行的子程序时,所以操作系统需要提供访问这些内核态运行的程序的接口,这些接口的集合就叫做系统调用。简要的说,系统调用是内核向用户进程提供服务的唯一方法。应用程序有时会需要一些危险的、权限很高的指令,如果把这些权限放心地交给用户程序是很危险的(比如一个进程可能修改另一个进程的内存区,导致其不能运行),但是又不能完全不给这些权限。于是有了系统调用,危险的指令被包装成系统调用,用户程序只能调用而无权自己运行那些危险的指令。另外,计算机硬件的资源是有限的,为了更好的管理这些资源,所有的资源都由操作系统控制,进程只能向操作系统请求这些资源。操作系统是这些资源的唯一入口,这个入口就是系统调用。


实验准备

华为云服务器,OpenEuler操作系统,Xshell远程登录软件(可选)

在做此实验时需要多次编译内核,如果使用VMware本地虚拟机来进行实验,8个线程编译内核耗时过多,所以使用华为云服务器,购买32线程的云服务器编译内核1分钟就搞定,这样会节省很多时间,而且不用担心编译内核时出现bug导致本地虚拟机死机。


本次实验全程在华为云服务器下进行

掌握Linux内核的编译与安装请参考https://blog.csdn.net/weixin_53621503/article/details/123832515?spm=1001.2014.3001.5501


开始实验

1.2——掌握Linux系统调用基本概念

添加一个新的系统调用,通过内核打印调试语句printk打印自己的学号

1.将系统调用的函数加入到syscalls数组中

输入

cd kernel-kernel-4.19/include/uapi/asm-generic/  /*进入操作目录*/vim unistd.h  /*编辑该文件*/

在该文件中输入

#define __NR_hyb 294
__SYSCALL(__NR_hyb, sys_hyb)

如上图所示(注意坑点1:在编辑该文件时,找到文件最后一行为294,在其上加入系统调用函数,然后将最后的294改为295。后续实验添加调用函数后将295改为296以此类推。)

Esc退出编辑模式,:wq保存并退出,cd /root返回桌面

2.在头文件中声明系统调用函数

输入

cd kernel-kernel-4.19/include/linux/  /*进入头文件目录*/vim syscalls.h  /*编辑该文件*/

在该文件中输入

asmlinkage long sys_hyb(void);

如上图所示(注意坑点2: 在编辑该文件时,不要将声明的函数加在 if 语句中,即将该声明放在#endif下面)

Esc退出编辑模式,:wq保存并退出,cd /root返回桌面

3.添加函数体

输入

cd kernel-kernel-4.19/kernel/  /*进入目录*/vim sys.c /*在该文件中添加需要的函数体*/

在文件中添加如上图所示的内容(这里的坑点与坑点2相同)

Esc退出编辑模式,:wq保存并退出,cd /root返回桌面

4.编译、安装内核

输入

make -j 32  /*32为线程数,虚拟机为多少这里就写多少*/make modules_installmake installreboot

此操作时间取决于线程数量,越多耗时越短(注意坑点3:类似的操作都需要在kernel-kernel-4.19目录下进行)

5.编写测试代码

参考课本

输入

vim hyb.c  /*新建一个名为hyb.c的C语言文件*/

输入如上图所示的内容

Esc退出编辑模式,:wq保存并退出,cd /root返回桌面

6.编译生成hyb_0文件

输入

gcc hyb.c -o hyb_0

如图所示,生成了一个名为hyb_0的文件

输入

./hyb_0  /*查看编译运行结果*/

如图所示即为1.2实验结果


1.3——设计和添加系统调用

经过1.2的步骤,对于1.3来说,大致的过程与1.2不尽相同(三步走:写调用函数——编译安装内核——编写测试代码)

题目一(必做):修改或返回指定进程的优先级(nice值和prio值)

提示:可能参考的内核函数:set_user_nice()

1.将系统调用的函数加入到syscalls数组中

输入

cd kernel-kernel-4.19/include/uapi/asm-generic/  /*进入操作目录*/vim unistd.h  /*编辑该文件*/

在该文件中输入

#define __NR_hybsetnice 295
__SYSCALL(__NR_hybsetnice, sys_hybsetnice)

如图所示,同理,根据上文介绍将末尾的数字295改为296

Esc退出编辑模式,:wq保存并退出,cd /root返回桌面

2.在头文件中声明系统调用函数

输入

cd kernel-kernel-4.19/include/linux/  /*进入头文件目录*/vim syscalls.h  /*编辑该文件*/

在该文件中输入

(这里的坑点与坑点2相同)

3.添加函数体

输入

cd kernel-kernel-4.19/kernel/  /*进入目录*/vim sys.c /*在该文件中添加需要的函数体*/

在该文件中添加函数体,注意格式正确(坑点与坑点2相同)

Esc退出编辑模式,:wq保存并退出,cd /root返回桌面

4.编译、安装内核

输入

make -j 32  /*32为线程数,虚拟机为多少这里就写多少*/make modules_installmake installreboot

5.编写测试代码

输入

vim hyb_1.c  /*生成一个C语言文件并且编辑*/

 Esc退出编辑模式,:wq保存并退出,cd /root返回桌面

6.编译生成hyb_1文件

输入

gcc hyb_1.c -o hyb_1

我们可以看到已经生成了hyb_1编译后的文件

如图所示即为运行后的实验结果

题目一小结:

在实验中,需要用到 Linux top命令行操作,什么是top?

top 命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态。

在上图中看到有PID  USER  PR  NI  VIRT  RES  SHR  S  %CPU  %MEM  TIME+ COMMAND值,这里着重注意PR值和NI值。(PR值——优先级;NI值——nice值,有+有-,负值表示高优先级,正值表示低优先级)也就是题目中的nice prio值。

那么,什么是nice值和prio值?

通俗来说,nice值越低,证明这个进程越不nice(这个进程很霸道)抢占CPU的能力就越强,所以,值越低,进程的优先级越高。prio值即为priority值,为top命令中看到的PR值,优先级。


 选做题目二

返回指定进程的内存管理信息,如进程可执行代码的起始及结束地址、已初始化数据的起始及结束地址、用户态堆栈起始地址、堆起始地址等。
提示:可能参考的内核函数:get_task_mm()
https://blog.csdn.net/weixin_42513814/article/details/116624649
在进行此实验时,我们需要知道内核函数返回参数的说明,根据这个网址,可以查询。

(牢记三步走战术)

1.将系统调用的函数加入到syscalls数组中

输入

cd kernel-kernel-4.19/include/uapi/asm-generic/  /*进入操作目录*/vim unistd.h  /*编辑该文件*/

同理,将下方的数字296改为297。

Esc退出编辑模式,:wq保存并退出,cd /root返回桌面

2.在头文件中声明系统调用函数

cd kernel-kernel-4.19/include/linux/  /*进入头文件目录*/vim syscalls.h  /*编辑该文件*/

在文件中输入

(这里的坑点与坑点2相同)

3.添加函数体

输入

cd kernel-kernel-4.19/kernel/  /*进入目录*/vim sys.c /*在该文件中添加需要的函数体*/

在该文件中添加函数体,注意格式正确(坑点与坑点2相同)

Esc退出编辑模式,:wq保存并退出,cd /root返回桌面

4.编译、安装内核

输入

make -j 32  /*32为线程数,虚拟机为多少这里就写多少*/make modules_installmake installreboot

5.编写测试代码

输入

vim hyb_2.c

Esc退出编辑模式,:wq保存并退出,cd /root返回桌面

6.编译生成hyb_2文件

输入

gcc hyb_2.c -o hyb_2

我们可以看到生成了名为hyb_2的文件,运行

在输入PID时,可以参考前面提到过的top命令,输入一个存在的PID,以防报错。

我们可以看到已经返回了6个想要的数据,而且ret=0为正确(ret=-1为错误)。

题目二小结:

题目要求输出6个需要的返回值,在参考资料后,我们发现这个内核函数中还有许许多多其他的返回参数,要学会举一反三。

至此,实验1.3已全部完成,与上一篇博客一起,就是操作系统实验课的实验一。


写在最后:

本次实验是一个很耗时的实验,但是理解掌握了实验的“三步走”方法(声明——加入——编写),这个实验也会迎刃而解。查阅了非常多的资料,网络上的博客也是良莠不齐,晦涩难懂,需要多多参透课本的内容。内核编译需要非常强大的CPU,购买32核64G内存的服务器可以在make modules_install时节省大量的时间(用完记得关!!!)

历经了很多次把内核编译崩溃的情况后,一定要冷静,仔细观察书写的代码有没有漏洞。有时候,往往那简单的一个" "、; 错误就会导致内核的编译失败(浪费了那么多时间还失败了真的很抓狂)。这就告诉我们,书写代码一定要规范仔细不可马虎。这个实验说难很难,说简单也很简单,不光只是1.3的两道题目,更要掌握其运行本质,这样才能在添加系统调用中如鱼得水。

文章写作时间仓促,如有错误请指正,如有问题请在评论区中提问。

加油!

HDU操作系统 实验1.2·1.3——设计和添加Linux系统调用相关推荐

  1. 杭电操作系统实验一 --- Linux内核编译及添加系统调用(arm架构华为云)

    实验要求  掌握Linux 内核的编译与安装 掌握Linux 系统调用基本概念 设计和添加linux系统调用 (1)修改或返回指定进程的优先级(nice值和prio值)(详见教材P328)提示:可能参 ...

  2. 操作系统实验--进程的创建撤销和控制

    进程的创建撤销和控制 一.实验名称 进程的创建撤销和控制 二.实验内容 学生独立设计用于描述进程的数据结构,完成进程的创建.同步和互斥. 三.实验原理和设计思路 在Linux系统下用fork()函数创 ...

  3. 操作系统实验3:进程运行轨迹的跟踪与统计

    参考 哈工大操作系统实验 B站UP主的视频讲解 Linux内核完全注释:基于0.11内核(修正版V3.0) https://www.cnblogs.com/wanghuizhao/p/16644919 ...

  4. 杭电操作系统实验二 --- Linux 内核模块编程(arm架构华为云)

    一.题目介绍 掌握Linux 内核模块的基本概念 ·阅读教材7.3.2节Linux内核模块简介 ,网上查找资料,了解Linux内核模块的基本概念. ·阅读教材7.3.3内核模块编程基础 ,网上查找资料 ...

  5. HDU操作系统课程设计实验三

    HDU操作系统课程设计实验三 一.设计目的 二.内容要求 三.实验内容 信号量的使用 1.实现一个模拟的shell,基本功能加find.grep命令 2.实现一个管道通信程序,基本功能加有名管道通信 ...

  6. linux平台的实验描述,基于LINUX的操作系统实验平台的设计与实现

    摘要: 操作系统原理课程是计算机专业的重要基础课程,该课程涉及大量抽象和深奥的概念.模型和算法,容易导致学习低效和困难. 本文针对操作系统教学中存在的不足,以Linux0.11版本内核为基础为操作系统 ...

  7. 操作系统实验以及课程设计

    趁没人,当个小白来偷偷摸摸补一下操作系统的课程,羞 反正操作系统断断续续的看了一点了,主要是偏linux的.FreeBSD的实现,操作系统概念,30天自制操作系统等.Linux的话命令用的还行,没有很 ...

  8. 西工大计算机操作系统实验报告,西工大计算机操作系统课程设计实验报告bh05xh5...

    <西工大计算机操作系统课程设计实验报告bh05xh5>由会员分享,可在线阅读,更多相关<西工大计算机操作系统课程设计实验报告bh05xh5(7页珍藏版)>请在人人文库网上搜索. ...

  9. 计算机操作系统32,计算机操作系统实验指导书32138

    计算机操作系统实验指导书32138 (22页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 <计算机操作系统>实验指导书程科白素 ...

最新文章

  1. 无损卡尔曼滤波UKF与多传感器融合
  2. 如何在Linux中运用vim命令轻松编辑文件
  3. 第十七届全国大学生智能汽车竞赛,我们来了
  4. 机器学习项目实战----信用卡欺诈检测
  5. Java反射之如何判断类或变量、方法的修饰符(Modifier解析)
  6. boost::EccentricityProperty用法的测试程序
  7. mysql+cast+0x_mysql cast与convert 函数的用法
  8. 软件项目可持续性运作地思考
  9. C++ std:: 的坑
  10. 【C/C++】size_t 数据类型
  11. 编译OpenJDK8:configure: could not find or use freetype at location
  12. snmpwalk 获取端口流量_通过snmpwalk命令计算接口速率
  13. 计算机没有无线网卡驱动程序,电脑上没有光驱怎么安装无线网卡驱动 - 驱动管家...
  14. 插补c语言程序,直线插补C语言程序.doc
  15. 小技巧:两种方式快速实现平滑涂鸦画板
  16. matlab高斯公式求值,高斯求积公式 matlab
  17. 《AngularJS深度剖析与最佳实践》简介
  18. 浙江大学竺可桢学院计算机专业好就业吗,浙大竺可桢学院有多厉害?看了这些数据你就知道了...
  19. C语言删除字符串的所有尾部空格
  20. 三星获欧洲专利居业内之首 中兴首次进入前十

热门文章

  1. 【小记】坐标测算直线距离与坐标转换
  2. tp5 支付宝当面付之扫码付 官方sdk 使用(沙箱测试)
  3. 获取一个字节byte的某位bit
  4. mycat学习笔记3:分库分表
  5. 35dir无法获取网站缩略图解决办法
  6. MySQL数据库中的索引(含SQL语句)
  7. 【180621】潜艇大战游戏VC++源代码
  8. 全面了解MKV、MP4、H.265、RTMP、RTSP、HLS、码率\码流、多码流等等
  9. 一篇入门深度学习OCR:数据集和算法合集
  10. SpringBoot项目接入支付宝第三方登录