Experiment 1
标签(空格分隔): OS
实验要求 编写应用程序、修改 Linux 0.11 的源代码,用 gcc 编译后,在 Bochs 的虚拟环境中运行、调试目标代码。
主要软件环境是 Bochs + gcc + 你最喜欢的编辑器 / IDE + 你最喜欢的操作系统 + Linux 0.11 源代码。
Bochs 是一个免费且开放源代码的 IA-32(x86)架构 PC 机模拟器。在它模拟出的环境中可以运行 Linux、DOS 和各种版本的 Windows 等多种操作系统。
GCC 是和 Linux 一起成长起来的编译器。Linux 最初的版本就是由 GCC 编译的。现在 GCC 也是在自由软件领域应用最广泛的编译器。GDB 调试器是 GCC 编译器的兄弟。
0x01 文件结构
image 文件:: 系统编译后生成的目标文件.
bochs目录: 包含执行文件,配置文件等.
run: 运行bochs:
虚拟软驱 A 和挂载是 linux-0.11/Image,
虚拟硬盘 上挂载的是 hdc-0.11.img。
bochs 配置文件中的设置是从软驱 A 启动,所以 Linux 0.11 会被自动加载。
而 Linux 0.11 会驱动硬盘,并 mount 硬盘上的文件系统,也就是将 hdc-0.11.img 内镜像的文件系统挂载到 0.11 系统内的根目录 —— /。在 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 下编译,然后覆盖现有的二进制内核。
0x02 实验步骤
2.1 编译内核 - 多处理器编译
make all //all可省略
make -j 2 //双cpu
修改园吗重新编译内核:
make all
make clean && make all // 直接编译失败, 就删除上一次编译生成文件再重新编译.
2.2 虚拟运行调试
Bocks ./run
./dbg-asm // 汇编级调试 help查看调试方法
./dbg-c // c语言级调试
==============新开终端=====================
./run //使用gdb连接
0x03 文件交换
oslab 下的 hdc-0.11-new.img 是 0.11 内核启动后的根文件系统镜像文件,相当于在 bochs 虚拟机里装载的硬盘。
# 启动挂载脚本
$ sudo ./mount-hdc
# 进入挂载到 Ubuntu 上的目录
$ cd ~/oslab/hdc
# 查看内容, 并且可以进行读写
$ ls -al
# 读写完毕 卸载hdc
$ sudo umount hdc
注意 1:不要在 0.11 内核运行的时候 mount 镜像文件,否则可能会损坏文件系统。同理,也不要在已经 mount 的时候运行 0.11 内核。
注意 2:在关闭 Bochs 之前,需要先在 0.11 的命令行运行 “sync”,确保所有缓存数据都存盘后,再关闭 Bochs。