HUST操作系统实验1

本文最后更新于:2022年1月13日 下午

HUST操作系统实验一

1.安装银河麒麟iso

​ 下载iso,阿里镜像网址

​ VMware使用下载的iso新建虚拟机

2.实验内容

2.1 用NASM编写MBR引导程序,写入软盘,在BOCHS虚拟机中测试

1

  1. 安装NASM

    • 官网下载NASM

    • 使用如下命令(实验2.1的所有操作都在/usr/local下操作

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      #先进入到压缩包所在的目录
      tar xvf nasm-2.15.05.tar.gz #解压压缩包

      cd nasm-2.15.05

      ./configure

      make

      sudo make install

      #检测是否安装成功
      root@zykk-VMware-Virtual-Platform:/usr/local/bin# whereis nasm
      nasm: /usr/local/bin/nasm

  2. 创建引导扇区

    在/usr/local/目录下使用vim boot.asm创建boot.asm文件,存放引导扇区的汇编代码,代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    org 07c00h
    mov ax, cs
    mov ds, ax
    mov es, ax
    call DispStr
    jmp $
    DispStr:
    mov ax, BootMessage
    mov bp, ax
    mov cx, 16
    mov ax, 01301h
    mov bx, 000ch
    mov dl, 0
    int 10h
    ret
    BootMessage: db "Hello, OS world!"
    times 510 - ($-$$) db 0
    dw 0xaa55

    保存文件后退出,使用命令nasm boot.asm -o boot.bin生成boot.bin文件

  3. 安装Bochs

    • Bochs官网下载压缩包,放置在指定目录下解压tar xvf bochs-2.7.tar.gz

    • 解压完成后,使用如下命令

      1
      2
      3
      4
      5
      6
      7
      cd bochs-2.7

      ./configure --enable-debugger --enable-disasm

      make

      sudo make install
    • 输入bochs查看是否编译安装成功,成功后显示如下:

      2

  4. 使用bximage创建虚拟软盘

    输入命令bximage,显示如下:

    3

​ 选择生成fd软盘,其他选择使用默认值,直接回车,完成之后,当前目录下会生成软盘映像a.img

  1. 将引导扇区写入软盘

    执行命令:

    1
    dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
  2. 编写Bochs的配置文件

    vim bochsrc创建文件,写入下面的内容并保存:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    megs:128
    #模拟器的内存

    #下面这两个路径需要自己去看一下对应路径下是否真的有这两个文件,防止路径出错
    romimage:file=/usr/local/share/bochs/BIOS-bochs-latest
    #这个是BIOS-bochs-latest的路径,可能不一样

    vgaromimage:file=/usr/local/share/bochs/VGABIOS-lgpl-latest
    #这个是VGABIOS-lgpl-latest的路径,也可能不一样

    floppya:1_44=a.img,status=inserted
    #这个是启动软盘,在当前目录下,如果不在当前目录,需要指明路径

    boot:floppy
    #表示从软盘启动

    log:bochsout.txt
    #日志输出文件

    执行:bochs -f bochsrc

    4

​ 选择6开始模拟,会弹出黑色窗口,输入c后显示“Hello,OS world!”,如图:

5

参考链接:

Linux下Bochs,NASM安装和使用 - 放飞梦想C - 博客园 (cnblogs.com)

OS实验 : 用NASM编写MBR引导程序,在BOCHS虚拟机中测试 (icode9.com)

2.2 在Ubuntu(或银河麒麟)下裁剪和编译Linux内核,并启用新内核

6

  1. 虚拟机容量

    为了保证编译内核的空间足够,尽量分配较大的磁盘空间,首先在虚拟机设置里将硬盘容量尽可能调大,我这里设置硬盘空间为120GB,如果了解银河麒麟的自定义分盘的话,则不必设置那么大,保证文件根目录的大小有50GB以上就可以,但是我在自定义分区时,虽然系统安装成功,但安装之后重启时,系统无法正常启动,所以只能使用系统默认的分区方式。在系统默然的分区方式中,以120GB为例,分给文件系统根目录的只有49GB,还有30GB分给了data,但是我们编译内核时并不会用到data目录,所以要尽可能把整个硬盘大小调大,以保证根目录下的空间足够。如果空间不够,可能编译好久之后,报错指明空间不够,之前的编译也就白费了。

  2. 下载解压Linux源码包

    下载地址:Linux源码包镜像地址

    下载之后解压到虚拟机下即可,解压到/usr/src目录下

    8

  3. 编译内核

    经过多次血与泪的实验(包括至少6次重装虚拟机,4次make),采用下面的几个步骤更为稳妥:

    • 在进行下面的apt-get之前,执行apt updateapt upgrade这两个命令,来更新系统当前的软件包,不然可能会出现apt-get找不到软件包的情况。如果有很多的软件包没有更新的话,第二个命令会执行较长的时间,需要耐心等待。

    • 打开系统设置,进入安全中心,进入应用控制与保护,选择允许安装任何来源的程序,如果没有选择允许安装任何来源的程序,即便是在root用户下make编译,本系统还是会不断的询问是否允许安装,如果允许不即时,就会导致因为没有权限而make失败

      非常烦人!

      关闭安装保护

    • 安装基本的工具软件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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 flex bison //下面的make会用到

    sudo apt-get install libelf-dev //某次编译因为没安装这个,导致又编译了一遍!!
    • 进入Linxu源码包解压后的目录,执行下面的命令:

      1
      2
      3
      4
      5
      6
      sudo make mrproper 

      sudo make clean

      sudo make menuconfig
      //提示make出错,缺少flex bison,直接apt-get install flex bison即可

      上述三个命令中,mrproper为清除编译过程中产生的所有中间文件,clean为清除上一次产生的编译中间文件,在make menuconfig中出现图形界面后,说明make没问题,按键盘的右箭头选到exit退出即可,退出提示中选择保存,实现内核的默认配置。

      9

    • 进行编译,执行命令sudo make -j8

      make -j8是指使用8个线程并行编译,这样编译速度要比普通的make命令快很多,但依然会很耗时,如果处理器性能较好,可能不到一个小时就可编译完成,否则可能需要更多的时间,我实验的机子是intel i5,编译了两个过小时,需要耐心等待,这个过程中可能出现各种各样的问题,但经过前面几个步骤的铺垫,基本上我之前遇到的问题都不会出现了。

      make顺利完成后:makej8

      出现最后一个行Kernel:arch/x86/boot/bxImage is ready (#2),说明已经make成功啦!

    • 执行命令make modules_install,安装内核模块

      该命令也需要一定的时间,如果上一步的make没有问题,这里的命令应该是没有问题的,成功结束后:make modules_install

    • 执行命令make install,这个命令很快就可以结束,成功执行后

    makeinstall

    到这里已经成功编译了内核,并嵌入了操作系统~~

  4. 选择新内核启动

​ 重启虚拟机,在重启开机界面按住shift,出现内核选择加载界面,选择高级选项并进入:

内核选择加载界面

​ 进入高级选项后,我们可以看到出现两个内核版本,一个是原来的5.10.0,另一个是我们新安装的5.10.1,这里针对每一个版本都有两 个选项,第一个选项是有银河麒麟操作界面的,第二个选项是纯命令行界面

选择内核

​ 选择新安装的5.10.1版本,成功进入命令行,使用命令uname -a查看当前系统版本:

内核界面

原版本

​ 到这里,新的内核已经成功被启用了!!!

  1. 参考链接:

    最全最详细:ubuntu16.04下linux内核编译升级更新以及设备驱动程序的编写

2.3 为新内核添加系统调用

实验2.3要求

  1. 进入内核目录,添加自定义系统调用

    执行命令:

    1
    2
    3
    4
    //root权限下操作
    cd /usr/src/linux-5.10.1/
    gedit arch/x86/entry/syscalls/syscall_64.tbl
    //编辑文件也可以使用vim,使用gedit若没有这个命令,则apt-get install gedit安装

    在打开的文件中添加新增的系统调用号,并参照其他的调用命名格式进行命名:

    添加自定义调用

    这里添加了调用号为441和442的两个调用,分别对应func_add和func_max,保存退出。

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

    输入命令:sudo gedit include/linux/syscalls.h,进入文件添加函数声明:

    添加调用函数的声明

  3. 添加调用函数的定义

    输入命令:sudo gedit kernel/sys.c,进入函数,在文件末尾增加自定义的函数内容:

    添加调用函数的定义

  4. 重新编译内核

    整体过程与实验2.2一致,依次执行以下命令:

    1
    2
    3
    4
    5
    6
    sudo make mrproper
    sudo make clean
    sudo make menuconfig
    sudo make -j8
    sudo make modules_install
    sudo make install

    编译完内核后,重启虚拟机,选择新编译的内核进入桌面

  5. 编辑测试程序

    随便写一个测试程序,在该程序中调用新添加的两个系统调用函数:

    测试样例

    编译运行该测试程序:

    测试结果

    根据输出结果可以看到,我们成功添加了两个系统调用。,此外可以使用dmesg命令,查看之前系统调用的信息,可以看到我们在系统调用函数中自定义输出的字符串,说明新增的系统调用确实成功运行了:

    dmesg命令

2.4 脚本/批处理程序编写

实验2.4要求

菜鸟教程学习Shell编程

Shell脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/bash

path=$1
sub="CST"
cd $path #进入目标目录
for filename in `ls *.txt` #取目录下的txt文件
do
last=$(awk 'END {print}' $filename) #取文件最后一行
if [[ $last =~ $sub ]] #判断最后一行是否有“CST”标识,如果有,则认为已经写入时间
then
sed -i '$d' $filename #若时间已存在,删除最后一行
date>>$filename
echo "$filename:更新时间"
else
date>>$filename
echo$filename:追加时间”
fi
done
exit

测试结果如下:

shell脚本执行情况


本文作者: ziyikee
本文链接: https://ziyikee.fun/2021/11/25/OS%E5%AE%9E%E9%AA%8C%E6%9C%80%E7%BB%88%E7%89%88/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!