一、实验目的
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.处理问题的能力有所提升