HUST操作系统实验1
本文最后更新于:2022年1月13日 下午
HUST操作系统实验一
1.安装银河麒麟iso
下载iso,阿里镜像网址
VMware使用下载的iso新建虚拟机
2.实验内容
2.1 用NASM编写MBR引导程序,写入软盘,在BOCHS虚拟机中测试
安装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
创建引导扇区
在/usr/local/目录下使用
vim boot.asm
创建boot.asm文件,存放引导扇区的汇编代码,代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18org 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文件安装Bochs
Bochs官网下载压缩包,放置在指定目录下解压
tar xvf bochs-2.7.tar.gz
解压完成后,使用如下命令
1
2
3
4
5
6
7cd bochs-2.7
./configure --enable-debugger --enable-disasm
make
sudo make install输入
bochs
查看是否编译安装成功,成功后显示如下:
使用bximage创建虚拟软盘
输入命令
bximage
,显示如下:
选择生成fd软盘,其他选择使用默认值,直接回车,完成之后,当前目录下会生成软盘映像a.img
将引导扇区写入软盘
执行命令:
1
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
编写Bochs的配置文件
vim bochsrc
创建文件,写入下面的内容并保存:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18megs: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
:
选择6开始模拟,会弹出黑色窗口,输入c后显示“Hello,OS world!”,如图:
参考链接:
Linux下Bochs,NASM安装和使用 - 放飞梦想C - 博客园 (cnblogs.com)
OS实验 : 用NASM编写MBR引导程序,在BOCHS虚拟机中测试 (icode9.com)
2.2 在Ubuntu(或银河麒麟)下裁剪和编译Linux内核,并启用新内核
虚拟机容量
为了保证编译内核的空间足够,尽量分配较大的磁盘空间,首先在虚拟机设置里将硬盘容量尽可能调大,我这里设置硬盘空间为120GB,如果了解银河麒麟的自定义分盘的话,则不必设置那么大,保证文件根目录的大小有50GB以上就可以,但是我在自定义分区时,虽然系统安装成功,但安装之后重启时,系统无法正常启动,所以只能使用系统默认的分区方式。在系统默然的分区方式中,以120GB为例,分给文件系统根目录的只有49GB,还有30GB分给了data,但是我们编译内核时并不会用到data目录,所以要尽可能把整个硬盘大小调大,以保证根目录下的空间足够。如果空间不够,可能编译好久之后,报错指明空间不够,之前的编译也就白费了。
下载解压Linux源码包
下载地址:Linux源码包镜像地址
下载之后解压到虚拟机下即可,解压到/usr/src目录下
编译内核
经过多次血与泪的实验(包括至少6次重装虚拟机,4次make),采用下面的几个步骤更为稳妥:
在进行下面的apt-get之前,执行
apt update
,apt upgrade
这两个命令,来更新系统当前的软件包,不然可能会出现apt-get找不到软件包的情况。如果有很多的软件包没有更新的话,第二个命令会执行较长的时间,需要耐心等待。打开系统设置,进入安全中心,进入应用控制与保护,选择允许安装任何来源的程序,如果没有选择允许安装任何来源的程序,即便是在root用户下make编译,本系统还是会不断的询问是否允许安装,如果允许不即时,就会导致因为没有权限而make失败
非常烦人!
安装基本的工具软件:
1
2
3
4
5
6
7
8
9
10
11sudo 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
6sudo make mrproper
sudo make clean
sudo make menuconfig
//提示make出错,缺少flex bison,直接apt-get install flex bison即可上述三个命令中,mrproper为清除编译过程中产生的所有中间文件,clean为清除上一次产生的编译中间文件,在make menuconfig中出现图形界面后,说明make没问题,按键盘的右箭头选到exit退出即可,退出提示中选择保存,实现内核的默认配置。
进行编译,执行命令
sudo make -j8
make -j8
是指使用8个线程并行编译,这样编译速度要比普通的make命令快很多,但依然会很耗时,如果处理器性能较好,可能不到一个小时就可编译完成,否则可能需要更多的时间,我实验的机子是intel i5,编译了两个过小时,需要耐心等待,这个过程中可能出现各种各样的问题,但经过前面几个步骤的铺垫,基本上我之前遇到的问题都不会出现了。make顺利完成后:
出现最后一个行
Kernel:arch/x86/boot/bxImage is ready (#2)
,说明已经make成功啦!执行命令
make modules_install
,安装内核模块该命令也需要一定的时间,如果上一步的make没有问题,这里的命令应该是没有问题的,成功结束后:
执行命令
make install
,这个命令很快就可以结束,成功执行后
到这里已经成功编译了内核,并嵌入了操作系统~~
选择新内核启动
重启虚拟机,在重启开机界面按住shift,出现内核选择加载界面,选择高级选项并进入:
进入高级选项后,我们可以看到出现两个内核版本,一个是原来的5.10.0,另一个是我们新安装的5.10.1,这里针对每一个版本都有两 个选项,第一个选项是有银河麒麟操作界面的,第二个选项是纯命令行界面
选择新安装的5.10.1版本,成功进入命令行,使用命令uname -a
查看当前系统版本:
到这里,新的内核已经成功被启用了!!!
2.3 为新内核添加系统调用
进入内核目录,添加自定义系统调用
执行命令:
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,保存退出。
添加系统调用函数声明
输入命令:
sudo gedit include/linux/syscalls.h
,进入文件添加函数声明:添加调用函数的定义
输入命令:
sudo gedit kernel/sys.c
,进入函数,在文件末尾增加自定义的函数内容:重新编译内核
整体过程与实验2.2一致,依次执行以下命令:
1
2
3
4
5
6sudo make mrproper
sudo make clean
sudo make menuconfig
sudo make -j8
sudo make modules_install
sudo make install编译完内核后,重启虚拟机,选择新编译的内核进入桌面
编辑测试程序
随便写一个测试程序,在该程序中调用新添加的两个系统调用函数:
编译运行该测试程序:
根据输出结果可以看到,我们成功添加了两个系统调用。,此外可以使用
dmesg
命令,查看之前系统调用的信息,可以看到我们在系统调用函数中自定义输出的字符串,说明新增的系统调用确实成功运行了:
2.4 脚本/批处理程序编写
菜鸟教程学习Shell编程
Shell脚本如下:
1 |
|
测试结果如下:
本文作者: 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 协议 ,转载请注明出处!