6. Linux 0.11 的工作模式

6.1. Image 的生成与加载

在宿主操作系统之上完成对 Linux 0.11 的开发、修改和编译之后,在 Linux 0.11 目录下会生产一个名为 Image 的文件,它就是编译之后的目标文件。该文件内已经包含 引导和所有内核 的二进制代码。如果拿来一张软盘,从它的 0 扇区开始,逐字节写入 Image 文件的内容,就可以用这张软盘启动一台真正的计算机,并进入 Linux 0.11 内核。 oslab 采用 Bochs 模拟器加载这个文件,模拟执行 Linux 0.11 ,这样省却了重新启动计算机的麻烦。

Bochs 目录下是与 Bochs 相关的执行文件、数据文件和配置文件。 run 是运行 Bochs 的脚本命令。运行后 Bochs 会自动在它的虚拟软驱 A 和虚拟硬盘上各挂载一个镜像文件,软驱上挂载是 linux-0.11/Image ,硬盘上挂载的是 hdc-0.11.img 。因为 Bochs 配置文件中的设置是从软驱 A 启动,所以 Linux 0.11 会被自动加载。而 Linux 0.11 会驱动硬盘,并 mount 硬盘上的文件系统,也就是将 hdc-0.11.img 内镜像的文件系统挂载到 Linux 0.11 系统内的根目录—— /。在 Linux 0.11 下访问文件系统,访问的就是 hdc-0.11.img 文件内虚拟的文件系统。

6.2. hdc-0.11.img 文件系统

hdc-0.11.img 文件的格式是 Minix 文件系统的镜像。 Linux 所有版本都支持这种格式的文件系统,所以可以直接在宿主 Linux 上通过 mount 命令访问此文件内的文件,达到宿主系统和 Bochs 内运行的 Linux 0.11 之间交换文件的效果。

hdc-0.11.img 内包含有:

  • Bash shell

  • 一些基本的 Linux 命令、工具,比如 cprmmvtar

  • vi 编辑器

  • gcc 1.4 编译器,可用来编译标准C程序

  • as86ld86

  • Linux 0.11 的源代码,可在 Linux 0.11 下编译,然后覆盖现有的二进制内核

  • Linux 上的实验环境

6.3. Ubuntu 和 Linux 0.11 文件交换

oslab 下的 hdc-0.11-new.imgLinux 0.11 内核启动后的根文件系统镜像文件,相当于在 Bochs 虚拟机里装载的硬盘。在 Ubuntu 上访问其内容的方法是:

sudo ./mount-hdc

之后, hdc 目录下就是和 Linux 0.11 内核一模一样的文件系统了,可以读写任何文件(可能有些文件要用 sudo 才能访问)。读写完毕,不要忘了卸载这个文件系统:

sudo umount hdc

警告

不要在 Linux 0.11 内核运行的时候 mount 镜像文件,否则可能会损坏文件系统。同理,也不要在已经 mount 的时候运行 Linux 0.11 内核。

警告

在关闭 Bochs 之前,需要先在 Linux 0.11 的命令行运行 sync ,确保所有缓存数据都存盘后,再关闭 Bochs

警告

  • 问题:bochs: could not open hard drive image file “./hdc-0.11.img”

  • 解决办法:删除同目录下的 hdc-0.11.img.lock 即可。