HDU操作系统 实验1.2·1.3——设计和添加Linux系统调用
实验介绍
上篇文章已经介绍了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值,优先级。
选做题目二
![](/assets/blank.gif)
![](/assets/blank.gif)
(牢记三步走战术)
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系统调用相关推荐
- 杭电操作系统实验一 --- Linux内核编译及添加系统调用(arm架构华为云)
实验要求 掌握Linux 内核的编译与安装 掌握Linux 系统调用基本概念 设计和添加linux系统调用 (1)修改或返回指定进程的优先级(nice值和prio值)(详见教材P328)提示:可能参 ...
- 操作系统实验--进程的创建撤销和控制
进程的创建撤销和控制 一.实验名称 进程的创建撤销和控制 二.实验内容 学生独立设计用于描述进程的数据结构,完成进程的创建.同步和互斥. 三.实验原理和设计思路 在Linux系统下用fork()函数创 ...
- 操作系统实验3:进程运行轨迹的跟踪与统计
参考 哈工大操作系统实验 B站UP主的视频讲解 Linux内核完全注释:基于0.11内核(修正版V3.0) https://www.cnblogs.com/wanghuizhao/p/16644919 ...
- 杭电操作系统实验二 --- Linux 内核模块编程(arm架构华为云)
一.题目介绍 掌握Linux 内核模块的基本概念 ·阅读教材7.3.2节Linux内核模块简介 ,网上查找资料,了解Linux内核模块的基本概念. ·阅读教材7.3.3内核模块编程基础 ,网上查找资料 ...
- HDU操作系统课程设计实验三
HDU操作系统课程设计实验三 一.设计目的 二.内容要求 三.实验内容 信号量的使用 1.实现一个模拟的shell,基本功能加find.grep命令 2.实现一个管道通信程序,基本功能加有名管道通信 ...
- linux平台的实验描述,基于LINUX的操作系统实验平台的设计与实现
摘要: 操作系统原理课程是计算机专业的重要基础课程,该课程涉及大量抽象和深奥的概念.模型和算法,容易导致学习低效和困难. 本文针对操作系统教学中存在的不足,以Linux0.11版本内核为基础为操作系统 ...
- 操作系统实验以及课程设计
趁没人,当个小白来偷偷摸摸补一下操作系统的课程,羞 反正操作系统断断续续的看了一点了,主要是偏linux的.FreeBSD的实现,操作系统概念,30天自制操作系统等.Linux的话命令用的还行,没有很 ...
- 西工大计算机操作系统实验报告,西工大计算机操作系统课程设计实验报告bh05xh5...
<西工大计算机操作系统课程设计实验报告bh05xh5>由会员分享,可在线阅读,更多相关<西工大计算机操作系统课程设计实验报告bh05xh5(7页珍藏版)>请在人人文库网上搜索. ...
- 计算机操作系统32,计算机操作系统实验指导书32138
计算机操作系统实验指导书32138 (22页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 <计算机操作系统>实验指导书程科白素 ...
最新文章
- 无损卡尔曼滤波UKF与多传感器融合
- 如何在Linux中运用vim命令轻松编辑文件
- 第十七届全国大学生智能汽车竞赛,我们来了
- 机器学习项目实战----信用卡欺诈检测
- Java反射之如何判断类或变量、方法的修饰符(Modifier解析)
- boost::EccentricityProperty用法的测试程序
- mysql+cast+0x_mysql cast与convert 函数的用法
- 软件项目可持续性运作地思考
- C++ std:: 的坑
- 【C/C++】size_t 数据类型
- 编译OpenJDK8:configure: could not find or use freetype at location
- snmpwalk 获取端口流量_通过snmpwalk命令计算接口速率
- 计算机没有无线网卡驱动程序,电脑上没有光驱怎么安装无线网卡驱动 - 驱动管家...
- 插补c语言程序,直线插补C语言程序.doc
- 小技巧:两种方式快速实现平滑涂鸦画板
- matlab高斯公式求值,高斯求积公式 matlab
- 《AngularJS深度剖析与最佳实践》简介
- 浙江大学竺可桢学院计算机专业好就业吗,浙大竺可桢学院有多厉害?看了这些数据你就知道了...
- C语言删除字符串的所有尾部空格
- 三星获欧洲专利居业内之首 中兴首次进入前十