实验一 熟悉实验环境
一 、实验目标
- 熟悉实验平台和实验工具
- 掌握编译、运行、调试和文件交换等操作命令
二、实验内容及结果
0.了解实验平台和工具
本实验我是在Ubuntu 20.04.1下安装相关环境
主要硬件环境是 IA-32(x86) 架构的 PC 机(在实验楼的环境中就是右侧的窗口),主要软件环境是 Bochs + gcc + 你最喜欢的编辑器 / IDE + 你最喜欢的操作系统 + Linux 0.11 源代码。
实验的基本流程是根据实验要求编写应用程序、修改 Linux 0.11 的源代码,用 gcc 编译后,在 Bochs 的虚拟环境中运行、调试目标代码。
1.安装实验环境
hit-oslab实验环境是一个压缩文件,名称为hit-oslab-linux-20110823.tar.gz,具体下载办法可以参考其他博客。
在终端中实验以下命令将压缩包解压到自己的目录下
tar -zxvf hit-oslab-linux-20110823.tar.gz -C /home/qrf/shiyanlou/
解压结果
其中
bochs目录
与 bochs 相关的执行文件、数据文件和配置文件。
run脚本
run 是运行 bochs 的脚本命令。
Image文件
oslab 工作在一个宿主操作系统之上,我们使用的 Linux,在宿主操作系统之上完成对 Linux 0.11 的开发、修改和编译之后,在 linux-0.11 目录下会生产一个名为 Image 的文件,它就是编译之后的目标文件。
该文件内已经包含引导和所有内核的二进制代码。如果拿来一张软盘,从它的 0 扇区开始,逐字节写入 Image 文件的内容,就可以用这张软盘启动一台真正的计算机,并进入 Linux 0.11 内核。
oslab 采用 bochs 模拟器加载这个 Image 文件,模拟执行 Linux 0.11,这样省却了重新启动计算机的麻烦。
hdc-0.11.img 文件
hdc-0.11.img 文件的格式是 Minix 文件系统的镜像。
Linux 所有版本都支持这种格式的文件系统,所以可以直接在宿主 Linux 上通过 mount 命令访问此文件内的文件,达到宿主系统和 bochs 内运行的 Linux 0.11 之间交换文件的效果。
Windows 下目前没有(或者是还没发现)直接访问 Minix 文件系统的办法,所以要借助于 fdb.img,这是一个 1.44M 软盘的镜像文件,内部是 FAT12 文件系统。将它挂载到 bochs 的软驱 B,就可以在 0.11 中访问它。而通过 filedisk 或者 WinImage,可以在 Windows 下访问它内部的文件。
hdc-0.11.img 内包含有:
- Bash shell;
- 一些基本的 Linux 命令、工具,比如 cp、rm、mv、tar;
- vi 编辑器;
- gcc 1.4 编译器,可用来编译标准 C 程序;
- as86 和 ld86;
- Linux 0.11 的源代码,可在 0.11 下编译,然后覆盖现有的二进制内核。
2.编译内核
首先要进入 linux-0.11 目录,然后执行 make 命令:
cd ./linux-0.11
make all
最后生成的目标文件是一个软盘镜像文件—— linux-0.11/Image
(下面的图中给出了详细的信息)。如果将此镜像文件写到一张 1.44MB 的软盘上,就可以启动一台真正的计算机。
关于make命令
make 命令会自动跳过未被修改的文件,链接时直接使用上次编译生成的目标文件,从而节约编译时间。但如果重新编译后,你的修改貌似没有生效,可以试试先
make clean
,再make all
(或者一行命令:make clean && make all
。make clean
是删除上一次编译生成的所有中间文件和目标文件,确保是在全新的状态下编译整个工程。
3.运行
回到上级目录,运行oslab目录下运行run脚本,就可以在Bochs中运行内核
cd ../
./run
运行结果如下:
4.调试
内核调试分为两种模式:汇编级调试和 C 语言级调试。
(1)汇编级调试
# 确认在 oslab 目录下
$ cd ~/oslab/
# 运行脚本前确定已经关闭刚刚运行的 Bochs
$ ./dbg-asm
汇编级调试的启动之后Bochs是黑屏
可以用命令 help
来查看调试系统用的基本命令。更详细的信息请查阅 Bochs 使用手册。
输入exit退出。
(2) c语言级调试
C语言级调试需要使用两个终端窗口,命令如下:
cd ~/oslab/
./dbg-c
# 在新的终端窗口运行下列命令:
cd ~/oslab/
./rungdb
我在第二步遇到了如下错误:
我是参考这个博主的文章解决:https://blog.csdn.net/longintchar/article/details/79619465
5.文件交换
即Ubuntu和linux0.11之间的文件交换
开始设置文件交换之前,务必关闭所有的 Bochs 进程。
oslab 下的 hdc-0.11-new.img
是 0.11 内核启动后的根文件系统镜像文件,相当于在 bochs 虚拟机里装载的硬盘。在 Ubuntu 上访问其内容的方法是:
$ cd ~/oslab/
# 启动挂载脚本
$ sudo ./mount-hdc
之后,hdc 目录下就是和 0.11 内核一模一样的文件系统了,可以读写任何文件(可能有些文件要用 sudo 才能访问)。
# 进入挂载到 Ubuntu 上的目录
$ cd ~/oslab/hdc
# 查看内容
$ ls -al
然后在 Ubuntu 的 ~/shiyanlou/oslab/hdc/usr/root
目录下创建一个 xxx.c 文件,
vi test.c
读写完毕,不要忘了卸载这个文件系统:
$ cd ~/oslab/
# 卸载
$ sudo umount hdc
最后执行 sudo umount hdc
后,再进入 Linux 0.11(即 run 启动 bochs 以后)就会看到这个 xxx.c(即如下图所示)。
这样就避免了在 Linux 0.11 上进行编辑 xxx.c 的麻烦,因为 Linux 0.11 作为一个很小的操作系统,其上的编辑工具只有 vi,使用起来非常不便。
三、总结
本次实验主要熟悉了一下实验环境和实验工具,以及在 Ubuntu 环境下对 Linux 0.11 进行编译、运行、调试、文件交换的方法。
本次实验接触到了一些新的工具如 GDB 等,实验过程中应善用 -help命令来了解这些工具的使用方式。