《操作系统原理》实验报告一

一、实验目的
1)理解操作系统生成的概念和过程;
2)理解操作系统两类用户界面(操作界面,系统调用)概念;

二、实验内容
1)在 Ubuntu 或其他 Linux 平台环境下裁剪和编译 Linux 内核,并启用新的内核。
2)在 Ubuntu 或其他 Linux 平台为 Linux 内核增加 1-3 个新的系统调用,并启用新的内核,编写一个应用程序测试新增加的系统调用是否能正确工作。
3)在 Windows 环境下,编写一个批处理程序(算命大师.bat),程序运行后,输入:出生年月日(例如 2000-07-31)。系统输出相应的属相和星座,例如:你属兔, 狮子座。要求:输入进行合法性检查,能循环接收用户的输入,直到输入 q 或Q 就退出。

三、实验过程
(一)实验步骤
1)重新编译Linux内核
1. 资源下载
Linux版本:Linux5.5.7
环境:ubuntu-18.04.4(虚拟机)
2. 移动文件夹
1.将压缩包拖入ubuntu主目录下
2.解压
3.sudo mv /home/Linux5.5.7/ /usr/src/
3.更新和安装相关依赖

	sudo apt-get update  
	sudo apt-get install libncurses5-dev libssl-dev   
	sudo apt-get install build-essential openssl   
	sudo apt-get install zlibc minizip   
	sudo apt-get install libidn11-dev libidn11  
	sudo apt-get install bison  
	sudo apt-get install flex  	
4. 内核配置
	#make menuconfig

在这里插入图片描述
5. 重新编译新内核
#make –j4
6.生成新内核
#make modules_install
#make install
2)在 Linux 增加系统调用
1.进入主目录下
2.打开添加自定义的系统调用号的文件,添加调用和内容
sudo gedit arch/x86/entry/syscalls/syscall_64.tbl
在这里插入图片描述
sudo gedit include/linux/syscalls.h
在这里插入图片描述
sudo gedit kernel/sys.c
在这里插入图片描述
在这里插入图片描述
3.编译内核
4.编写C语言函数验证

	#include <linux/kernel.h>  
	#include <sys/syscall.h>  
	#include <unistd.h>  
	#include <stdio.h>  
	  
	int main(int argc,int **argc)  
	{
    
      
	    printf("System call sys_first return %ld\n",syscall(335));  
	    long temp;  
	    temp=syscall(336,2);  
	    printf("System call sys_second return %ld\n",temp);  
	    temp=syscall(337,2,3);  
	    printf("System call sys_third return %ld\n",temp);  
	  
	    return 0;  
	      
}  

5.运行程序
sudo gcc -o test test.c
sudo ./test
6.查看调用
sudo dmesg
3)编写一个批处理程序“算命大师.bat”
1.打开记事本,新建文档
2.编写代码,编码为ANSI,保存格式.bat

		@echo off  
	 set /p yearmonthday=输入: 出生年月日 (例如 19990411)  
	 set "shengxiao=猴鸡狗猪鼠牛虎兔龙蛇马羊”  
	 set year=%yearmonthday:~0,4%  
	 set monthday=%yearmonthday:~4,4%  
	 set /a mod=%year%%%12  
	    
	if %mod%==0 Echo 你属猴  
	 if %mod%==1 Echo 你属鸡  
	 if %mod%==2 Echo 你属狗  
	 if %mod%==3 Echo 你属猪  
	 if %mod%==4 Echo 你属鼠  
	 if %mod%==5 Echo 你属牛  
	 if %mod%==6 Echo 你属虎  
	 if %mod%==7 Echo 你属兔  
	 if %mod%==8 Echo 你属龙  
	 if %mod%==9 Echo 你属蛇  
	 if %mod%==10 Echo 你属马  
	 if %mod%==11 Echo 你属羊  
	 echo 你的星座是  
    
	if "%monthday%" LEQ "0119" echo 魔蝎座  
	 if "%monthday%" GEQ "0120" if "%monthday%" LEQ "0218" echo 水瓶座  
	 if "%monthday%" GEQ "0219" if "%monthday%" LEQ "0320" echo 双鱼座  
	 if "%monthday%" GEQ "0321" if "%monthday%" LEQ "0419" echo 白羊座  
	 if "%monthday%" GEQ "0420" if "%monthday%" LEQ "0520" echo 金牛座  
	 if "%monthday%" GEQ "0521" if "%monthday%" LEQ "0621" echo 双子座  
	 if "%monthday%" GEQ "0622" if "%monthday%" LEQ "0722" echo 巨蟹座  
	 if "%monthday%" GEQ "0723" if "%monthday%" LEQ "0822" echo 狮子座  
	 if "%monthday%" GEQ "0823" if "%monthday%" LEQ "0922" echo 处女座  
	 if "%monthday%" GEQ "0923" if "%monthday%" LEQ "1023" echo 天秤座  
	 if "%monthday%" GEQ "1024" if "%monthday%" LEQ "1122" echo 天蝎座  
	 if "%monthday%" GEQ "0321" if "%monthday%" LEQ "0419" echo 白羊座  
	 if "%monthday%" GEQ "1222" echo 魔蝎座  
 Pause  

@echo off 是为了 此语句以下的命令语句不会在输出屏显示
set /p birthday= -->进行读入赋值时 要加/p 会将输入的字符串赋值给birthday
set year=%birthday:~0,4% -->时从 birthday的第0位开始向后截取4个字符, 并赋给year
set /a yy=%year%%%12
进行运算赋值时 要加/a %year% 代表year指代的值 %% 表示取余运算
%day% leq 19 leq是小于等于的意思
3.运行
双击bat文件即可运行。
(二)解决错误和优化
1.网络连接问题,环境配置错误。表现为虚拟机上的ubuntu无法上网,不能更新,解决方法是改变虚拟机的网络连接方式,由直连改为桥连。
2.部份依赖无法安装,环境配置错误。解决方法是重新#apt-get update,然后重新安装,不断重复。
3.#make menuconfig报错,编译错误。
在这里插入图片描述

解决方法是将终端窗口最大化。
4. 特殊的语法错误。比如在命令行输入时,经常会忘记“.”和空格,解决方法是多熟悉linux的命令,写代码时要更仔细。

四、实验结果
1)重新编译Linux内核
在这里插入图片描述
在这里插入图片描述

如图,先选择ubuntu高级选项,再选择Linux5.5.7即可启用新内核。
2)在 Linux 增加系统调用
在这里插入图片描述

可以看出,能够调用设置的系统调用。
3)编写一个批处理程序“算命大师.bat”
在这里插入图片描述

输入年月日后,给出了正确的结果。

五、体会
1.对操作系统的生成有了更深的了解
2.对Linux的使用有了一定的经验
3.处理问题的能力有所提升

猜你喜欢

转载自blog.csdn.net/weixin_45341339/article/details/112412025