华中科技大学操作系统实验课 实验一

前言

写这篇博客旨在帮助同学尽快完成作业,不要饱受学校无聊的作业折磨。

任务1:用NASM编写MBR引导程序,在BOCHS虚拟机中测试

选做==不做

任务2:在Linux(建议Ubuntu或银河麒麟或优麒麟)下裁剪和编译Linux内核,并启用 新内核。(其他发行版本也可以)

详见操作系统作业(在Ubuntu环境下编译一个新的内核)

虚拟机秘勺:ZF3R0-FHED2-M80TY-8QYGC-NPKYF

任务3:为Linux内核(建议Ubuntu或银河麒麟或优麒麟)增加2个系统调用,并启用新的内核,并编写应用程序测试。(其他发行版本也可以)

  • 提示1:系统调用的功能:int Add(int , int ) ; int Max(int , int, int ) ;
  • 提示2:内核编译和重启参考任务2.
  • 提示3:如果采用新建c源文件并修改makefile方式修改源代码,则参考
  • 提示4,5,6。如果直接修改已有内核源文件,则忽略提示4,5,6。
    • 提示4:主目录下建NewCall目录并在其中新建MyNewcall.c文件和相应
      的makefile文件。c文件含有系统调用的实现函数。makefile文件内容:
      obj-y := MyNewcall.o
    • 提示5:将NewCall目录添加到主makefile中的特定位置:
      core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ NewCall/
    • 提示6:在syscall_64.tbl和syscalls.h中分别定义编号和声明函数。
  • 提示7:在应用程序中使用下面方式调用:
    int nRet = syscall(548, 20,18); // nRet = 38
    int nRet = syscall(549, 20,18, 4); // nRet = 20

任务2安装的版本VM16+Ubuntu-16.04.7-desktop-amd64+linux 5.16.14为基础进行下面操作。

借鉴自linux内核添加系统调用(详细),但内容并不完全相同,可能是版本不同的问题。

1、添加系统调用ID

打开Computer/usr/src/linux-5.16.14/arch/x86/entry/syscalls文件目录
在这里插入图片描述
双击syscall_64.tbl
在这里插入图片描述
在334后面添加系统调用号335和336.
在这里插入图片描述

2、添加系统调用函数声明

打开Computer/usr/src/linux-5.16.14/arch/x86/include/asm目录
在这里插入图片描述
打开文件syscalls.h,输入如下两个函数声明
在这里插入图片描述

3、在内核源代码添加函数定义

打开Computer/use/src/linux-5.16.14/kernel目录,打开sys.c(可搜索找到)
在这里插入图片描述
可在一堆includedefine下添加代码
在这里插入图片描述
添加如下代码

4、编译内核

Computer/use/src/linux-5.16.14目录下运行终端,输入make menuconfig
在这里插入图片描述
点击save
在这里插入图片描述
点击ok
在这里插入图片描述
Exit
在这里插入图片描述
继续Exit

这块我的CONFIG_SYSTEM_TRUSTED_KEYS=""不需要修改,故可以跳过,如果和我版本一致。

之后还要修改一些东西,不然编译途中会出错。 vim ./.config。

令CONFIG_SYSTEM_TRUSTED_KEYS=“”。(使用shift+“:”,输入?CONFIG_SYSTEM_TRUSTED_KEYS回车后查询)
在这里插入图片描述

编译

sudo make -j4(因为我是双核)

安装模块
sudo make modules_install
sudo make install

5、调用已添加的系统调用

在桌面新建文件test.c

输入测试代码

#include<stdio.h>
#include<unistd.h>
#include<sys/syscall.h>
int main(){

	long a=syscall(335,1,3);
	printf("%ld\n",a);
	long b=syscall(336,14,15,16);
	printf("%ld\n",b);
	return 0;
}

桌面文件打开终端
输入gcc ./test.c -o test编译
输入./test运行
在这里插入图片描述
查看输出
在这里插入图片描述
与预期相同。任务完成!

任务4:在Linux (建议Ubuntu或银河麒麟或优麒麟) 或Windows下,编写脚本或批处理。在指定目录中的全部txt文件末尾追加或更新:用户名:日期和时间。root:2022-04-26 21:00

  • 提示1:目录通过命令行的参数来指定,不要在脚本中写死
  • 提示2:注意检查文件的后缀是否txt
  • 提示3:日期和时间的写入格式可以自己确定【例如特殊字符标识】。
  • 提示4:已写有日期和时间的文件只能更新日期和时间,不能追加。

1、编写批处理文件

桌面新建bash.sh文件,写入

#!/bin/bash
filenames=$(ls "$1"*.txt)
echo "$1"
echo $filenames
for file in $filenames
do
        regular=$(tail -n 1 $file)
        if [[ "$regular" =~ [0-9]{4}-[0-9]{2}-[0-9]{2}* ]];then
                sed -i '$d' $file
                echo $USER:`date +"%Y-%m-%d %H:%M:%S"` >> $file
        else
                echo $USER:`date +"%Y-%m-%d %H:%M:%S"` >> $file
        fi
done

2、添加管理员权限

sudo chmod -R 777 ./

否则会报错,Permission Denied。

3、添加测试文件

桌面(与bash.sh同目录)下添加a.txt,b.txt
在这里插入图片描述
在此环境下打开终端,输入./bash.sh ./
输出如下
在这里插入图片描述
打开a.txtb.txt后出现用户名:年份 时间
在这里插入图片描述

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
实验一 Linux系统的安装及用户界面的使用 一.实验目的 1. 了解Linux系统的安装、熟悉系统的启动过程和使用环境。 2. 掌握Linux环境下vi编辑器的使用方法。 3. 掌握Linux系统中编辑、编译、调试、运行一个C语言程序的全过程。 二.实验内容 1、实验要求 1. 在VMWare虚拟机环境或真实物理机器上,安装一个Linux操作系统。 2. 体验Linux操作系统中X Windows系统的使用。 3. 尝试Linux系统键盘命令的使用,并熟练掌握常用的基本命令。 4. 掌握命令行方式下vi编辑器的使用。 5. 编写一段C程序,使用系统调用fork()创建两个子进程。各进程显示不同的信息,如父进程显示字符“a”,子进程分别显示字符“b”和“c”。多次运行观察显示结果,并分析产生这种执行效果的原因。 实验二 Linux进程控制 一.实验目的 1. 掌握进程的概念,明确进程和程序的区别。 2. 认识和了解并发执行的实质。 二.实验内容 1、实验要求 1. 编写一段程序,使用系统调用fork()创建两个子进程。各进程显示不同的信息,如父进程显示字符“a”,子进程分别显示字符“b”和“c”。多次运行观察显示结果,并分析产生这种执行效果的原因。 2. 修改上面编写的程序,将每个进程的输出由单个字符改为循环输出一句话,如父进程显示:“parent:”加上进程ID,子进程分别显示:“Child1:”(或“Child2:”)加上自己的进程ID。再观察程序执行时屏幕上出现的现象,并分析原因。 3.一个父进程创建一个子进程,子进程通过exec系统调用执行另一个文件。各自的代码中显示不同的信息,观察其运行结果,分析两个进程并发执行的效果。 4. 编写程序创建如图所示的进程树,在每个进程中显示当前进程ID和父进程ID。 实验三 Linux进程间通信 一.实验目的 (1) 分析进程争用临界资源的现象,学习解决进程互斥的方法; (2) 学习如何利用进程的“软中断”、管道机制进行进程间的通信,并加深对上述通信机制的理解; (3) 了解系统调用pipe( )、msgget( )、msgsnd( )、msgrcv( )、msgctl( )、shmget( )、shmat( )、shmdt( )、shmctl( )的功能和实现过程,利用共享存储区机制进行进程间通信。 二、实验内容 1、实验要求 (1) 进程的控制 修改已编制的程序,将每个进程输出一个字符修改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析出现问题的原因,进一步理解各个进程争夺临界资源的情况。 如果在程序中使用系统调用locking( )来给每一个进程加锁,可以实现进程之间的互斥,试观察并分析出现的现象。 (2) 进程的软中断通讯 编制一段程序,实现进程的软中断通讯:使用系统调用fork( )创建两个子进程;再使用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按Del键);在捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发信号;子进程捕捉到信号后分别输出下列信息后终止: Child process1 is killed by parent! Child process2 is killed by parent! 父进程等待两个子进程都终止以后,输出如下信息后终止: Parent process in killed! (3) 进程的管道通讯 编制一段程序,实现进程的管道通讯:使用系统调用pipe( )建立一条管道线;两个子进程分别循环向这条管道写一句话: Child 1 is sending a message! Child 2 is sending a message! 而父进程则循环从管道中读出信息,显示在屏幕上。 实验报告 内含源代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elsa的迷弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值