操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

这篇具有很好参考价值的文章主要介绍了操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、为版本0内核增加一个系统调用getjiffies

打开vscode,在如图所示位置打开~/os/linux-0.11-lab/0文件夹
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

(一)分析思路

1.定义getjiffies系统调用

题目中给的提示:进入到unistd.h文件中
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

阅读代码,可以发现上图划线处有个系统调用名为getpid:返回当前进程号——这与我们期望实现的功能类似:通过系统调用返回jiffies值。
于是此时希望模仿getpid系统调用,实现getjiffies系统调用。
vscode左侧搜索栏中搜索关键词getpid,仿照即可。
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

主要修改下图划线的三个文件
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

2.在系统启动时自动调用该系统调用并输出结果

由于下图所示的任务要求
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”
系统启动时将调用0/linux/init/main.c文件,且其中的main函数中下图圈出位置的if`语句中的init函数完成初始化的显示输出操作。

操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”
所以需要在main.cinit函数中调用getjiffies系统调用。(也可以进入bochs虚拟机中在/etc/rc中调用getjiffies,即在文件的最后写入getjiffies,这样的话打印结果就可以符合题目要求了,二者选一做)
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

(二)实验过程

1.添加系统调用号

(1)unistd.h

在调用号的最后添加#define __NR_getjiffies 87
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

(2) 修改sys.hsys_call_tablesystem_call.snr_system_calls

参考博文:CSDN-为Linux0.11添加系统调用(作者)-为Linux0.11添加系统调用
(注:system_call.s0/linux/kernel/目录下)
这里的nr_system_calls值为88,不能为87,因为系统调用数量为88个?不理解没有修改前的nr_system_calls的值为什么为86,最后一个系统调用usrlib没有用到吗。
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

2.定义getjiffies系统调用函数

可以看到jiffies的变量类型为long
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

(1)仿照getpidunistd.h中声明函数

操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

(2)在sched.c`文件中定义函数主体

仿照getpid系统调用
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

创建``getjiffies!系统调用

操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

3.在系统启动时自动调用getjiffies系统调用并输出结果

阅读main.c代码,可以在文件的开始位置发现main.c中调用的系统调用,如forkpause都经过下图划线位置的__always_inline _syscall0的操作,仿照该操作调用getjiffies系统调用。
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”
init函数中打印信息。
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

(三)调试验证

进入~/os/linux-0.11-lab/0/linux
执行下列命令:

make clean;make
cd ../..
./run

得到如下图所示的输出,(虽然打印的位置在Ok.之上而非下面,但是)(如果想实现题目要求,可以在bochs中的/etc/rc文件的最后添加一行调用函数的getjiffies,而不是在main.c中调用,就可以了)
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”
评测通过

二、在用户程序中使用新增的系统调用

(本题在完成上题的基础上(在虚拟机启动版本0内核时调用一次getjiffies)直接操作,在文章末尾会论述如果直接开始做本题操作有何不同)

(一)初步编写mytest.c文件

根据以下“作业内容”的提示:
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”
vscode中打开~/os/linux-0.11-lab文件夹,在b目录下,创建并编辑如下图所示的mytest.c文件(内容并非最终正确答案,为方便演示常见错误,此处为错误代码,正确代码附在最后)
改内容为结合上述提示与上一题main.c相关代码编写
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

(二)将mytest.c文件放入bochs虚拟机

注意:可以使用uemacs mytest.c命令直接在虚拟机中创建并编写文件,则可编写完成后可直接进行(三),跳过此节

(注:启动虚拟机后,虚拟机保存启动时的b文件夹的状态,此时物理机中编辑b文件夹下文件,不会对已启动的虚拟机访问的b文件夹下的文件产生影响)
~/os/linux-0.11-lab目录下./run启动
在虚拟机中执行下列命令:

mdir b:mytest.c
mcopy b:mytest.c .

结果如下图所示
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

(三)bochs 虚拟机中编译文件

执行下述命令使用gcc编译mytest.c文件

gcc mytest.c -o mytest

出现如下图所示的报错:
参考博文:CSDN-hjjdebug(作者)-ubutu14 下编译linux0.11内核错误记录及解决方法
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”
进入vscode搜索__attribute__0/linuxincludeunistd.h文件中下图右下划线位置处的__always_inline,而上述gcc的报错提示信息为语法错误,于是现在需要在mytest.c文件中删除掉__always_inline
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”
使用命令uemacs mytest.c在虚拟机中修改mytest.c文件,删除掉其中的__always_inlinectrl + x+s保存,ctrl + x + ctrl + c退出。
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

再次编译出现新的报错:
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”
缺少对__NR_getjiffies的定义,而由于上一题中设置的__NR_getjiffies系统调用号为87,需要在mytest.c中添加#define __NR_getjiffies 87

再次使用命令uemacs mytest.c在虚拟机中修改mytest.c文件,添加#define __NR_getjiffies 87ctrl + x+s保存,ctrl + x + ctrl + c退出。
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

mytest.c文件正确代码:

#define __LIBRARY__
#include<unistd.h>
#define __NR_getjiffies 87
_syscall0(long,getjiffies)
void main()
{
	printf("Getjiffies: %ld\n", getjiffies());
}

再次执行gcc编译命令

gcc mytest.c -o mytest
ls

结果如下图所示,编译成功出现可执行文件mytest
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

(三)验证mytest文件正确性

操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

(四)编辑/etc/rc文件

uemacs /ec/rc修改器内容如下图所示。
操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

验证/etc/rc文件正确性

注意:在虚拟机中执行过命令,未使用相关命令验证就很快退出虚拟机,重启后会发现最近执行的一条或几条命令失效,如uemacs /etc/rc命令修改过/etc/rc文件后,立即退出,再次进入虚拟机发现/etc/rc文件编辑过的内容没有了,正确的做法是在编辑完/etc/rc文件后,执行cat /etc/rc命令,gcc命令类似,需要执行./命令执行gcc编译后的文件

操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”
(得到结果与上图所示打印结果不同也没有关系,共有三条就可以)
注意:重启后得到了如上图所示的输出有可能依然会报错,这可能时题目本身的问题,可以尝试多次执行下列操作:
“进入~/os/linux-0.11-lab/0/linux
执行下列命令:”

make clean;make
cd ../..
./run

注意如果并非做完上一题直接做本题,即在0/linux/init/main.c中没有打印字符串"Getjiffies: %ld", getjiffies(),那么此处/etc/rc文件应该修改为如下图所示内容:

操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”
即本题共需要在系统启动时调用三次getjiffies系统调用。
重启虚拟机后发现评测结果不对也没有关系,根据上上条注意条目的内容多尝试几次

另外,本题的对getjiffies系统调用中的定义中的long均可换成int,也可以通关。

通过测试

三、第二题——极简版思路

(在未第一题的情况下)

1.在0/include/unistd.h中添加系统调用号和函数调用声明

#define __NR_getjiffies 87
long getjiffies(void);

2.将0/kernel/system.h文件中的nr_system_calls = 86改为nr_system_calls = 88

3.在0/include/linux/sys.h文件中添加extern long sys_getjiffies();并在该文件中的sys_call_table[]数组的末尾添加, sys_getjiffies

4.在0/kernel/sched.c文件中添加如下函数

long sys_getjiffies(void)
{
	return jiffies;
}

5.启动虚拟机输入uemacs /etc/rc,在该文件中添加下列内容

cd /usr/root
./mytest
sync
./mytest
./mytest

ctrl+x+s保存,ctrl+x+ctrl+c退出

6.输入uemacs mytest.c在文件中输入如下下内容

#define __LIBRARY__
#include<unistd.h>
#define __NR_getjiffies 87
_syscall0(long,getjiffies)
void main()
{
	printf("Getjiffies: %ld\n", getjiffies());
}

ctrl+x+s保存,ctrl+x+ctrl+c退出

7.gcc mytest.c -o mytest编译生成mytest文件,./mytest验证

在退出虚拟机前要验证

8.退出虚拟机进入0/linux执行几次make clean;make命令(玄学)

9../run进入虚拟机,出现如下图所示的界面,开始评测,评测不成功就在虚拟机里输入几条之前输入过的命令,再次执行第8条(玄学),反复几次,就可以评测通过了

操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”文章来源地址https://www.toymoban.com/news/detail-401889.html

到了这里,关于操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OS实验2-5 课堂练习2.3:系统调用

    本关任务: 解题过程: 1.跟踪到系统调用发生 系统调用的总控函数是 system_call ,只要在这里设断点,即可捕获系统调用的发生 2.查找系统调用的编号与名字 系统调用发生时系统调用号存放在寄存器 eax 中,编号与名字对应关系可在文件unistd.h中查到 在地址 0x7780 这里会调用

    2024年02月08日
    浏览(29)
  • OS实验2-6 课后作业2.3:系统调用

    本关任务: 解题过程: 1.跟踪到系统调用发生 同实验2-5 2.跳过 0 号进程发出的连续多个 pause 系统调用 设置一个新断点,将0号进程的pause系统调用排除在外 先关闭此断点,运行至0号进程pause调用时,打开此断点,关闭原断点 本关任务:

    2024年02月08日
    浏览(39)
  • Linux操作系统实验三 文件管理(一)

      1.实验目的与要求 了解Linux文件系统目录结构 掌握目录管理的相关操作 掌握文件管理的相关操作 2.实验平台 实验室安装的实验环境(Linux操作系统)和头歌(www.educoder.net)实验平台(课程实验) 3.实验内容 文件系统目录结构理论知识练习 linux 下目录的创建、应用、查看、

    2024年02月03日
    浏览(54)
  • 【Linux】操作系统的基本概念 {冯诺依曼体系结构,操作系统的基本概念,系统调用及用户操作接口,shell程序}

    现代计算机设计大都遵守冯·诺依曼体系结构: 截至目前,我们所认识的计算机,都是由一个个的硬件组件组成 输入单元:包括键盘, 鼠标,扫描仪, 磁盘,网卡等 存储器: 内存(提高数据读写速度,降低硬件成本) 中央处理器(CPU):含有运算器(算数运算,逻辑运算)和控

    2024年02月11日
    浏览(52)
  • 【Linux操作系统】【综合实验三 用户帐号、文件系统与系统安全管理】

    要求掌握Linux系统用户的创建、删除与管理操作;熟悉Linux文件系统的管理模式,学会创建用户文件系统并装载和卸载文件系统;掌握超级用户的管理方式与权限,并实施对普通用户的管理;熟悉Linux系统安全机制与相关管理方法。 通过这个第三阶段实验,要求掌握以下操作与

    2023年04月14日
    浏览(38)
  • 【Linux操作系统】深入理解系统调用中的read和write函数

    在操作系统中,系统调用是用户程序与操作系统之间进行交互的重要方式。其中,read和write函数是常用的系统调用函数,用于在用户程序和操作系统之间进行数据的读取和写入。本文将深入介绍read和write函数的工作原理、用法以及示例代码,以帮助读者更好地理解和应用这两

    2024年02月13日
    浏览(45)
  • Linux-0.11 文件系统namei.c详解

    namei.c是整个linux-0.11版本的内核中最长的函数,总长度为700+行。其核心是 namei函数 ,即根据文件路径寻找对应的i节点。 除此以外,该模块还包含一些创建目录,删除目录,创建目录项等系统调用。 在接触本模块的具体函数之前,可以回顾一下不同的i节点,这将对理解本模

    2024年02月06日
    浏览(35)
  • Linux下C程序的编写(操作系统实验)

    实验题目:   Linux下C程序的编写                            实验目的:   (1)掌握Linux下C程序的编写、编译与运行方法; (2)掌握gcc编译器的编译过程,熟悉编译的各个阶段;        (3)熟悉Makefile文件的编写格式和make编译工具的使用方法。        

    2024年04月28日
    浏览(54)
  • 【操作系统实验】Ubuntu Linux 虚拟机用户管理

    Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户都必须先向系统管理员申请一个账号,然后以这个账号的身份进入系统。 在Linux系统中,任何文件都属于某一特定用户,而任何用户都隶属于至少一个用户组。 用户名(username) :每个用户账号都

    2023年04月24日
    浏览(81)
  • 【Linux操作系统】【综合实验三 用户帐号、文件系统与系统安全管理】【未整理】

    要求掌握Linux系统用户的创建、删除与管理操作;熟悉Linux文件系统的管理模式,学会创建用户文件系统并装载和卸载文件系统;掌握超级用户的管理方式与权限,并实施对普通用户的管理;熟悉Linux系统安全机制与相关管理方法。 通过这个第三阶段实验,要求掌握以下操作与

    2024年02月06日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包