操作系统:计算机硬件与计算机应用之间的一层软件。
- 可以方便我们使用硬件,如使用显存
- 可以帮助我们更高效地使用硬件,如打开多个终端
L1 什么是操作系统
- 操作系统:计算机硬件与计算机应用之间的一层软件。
- 可以方便我们使用硬件,如使用显存
- 可以帮助我们更高效地使用硬件,如打开多个终端
- 操作系统管理的硬件:
- CPU管理
- 内存管理
- 终端管理
- 磁盘管理
- 文件管理
- 网络管理
- 电源管理
- 多核管理
实验1-熟悉实验环境
主要平台和工具简介
本操作系统实验的硬件环境是 IA-32(x86) 架构的 PC 机,主要软件环境是 Bochs + gcc + 你最喜欢的编辑器 / IDE + 你最喜欢的操作系统 + Linux 0.11 源代码。
实验的基本流程是根据实验要求编写应用程序、修改 Linux 0.11 的源代码,用 gcc 编译后,在 Bochs 的虚拟环境中运行、调试目标代码。
x86 模拟器 Bochs
Bochs 是一个免费且开放源代码的 IA-32(x86)架构 PC 机模拟器。在它模拟出的环境中可以运行 Linux、DOS 和各种版本的 Windows 等多种操作系统。而 Bochs 本身具有很高的移植性,可以运行在多种软硬件平台之上,这也是我们选择它做为本书的指定模拟器的主要原因。
如果您想拥抱自由的 Linux,那么 Bochs 几乎是您的不二选择。如果您想继续把自己绑定在 Windows 平台上,那么除了 Bochs,您还可以选用 VMware 或者 Microsoft Virtual PC。它们是最著名虚拟机软件,而且都可以免费使用。因为 Bochs 的是模拟器,其原理决定了它的运行效率会低于虚拟机。
但对于本书所设计的实验来说,效率上的差别很不明显。而且,Bochs 有虚拟机无可比拟的调试操作系统的能力,所以我们更建议您选用 Bochs。hit-oslab 已经内置了 bochs,本实验后文假定的缺省环境也是 Bochs。
GCC 编译器
- GCC 是和 Linux 一起成长起来的编译器。Linux 最初的版本就是由 GCC 编译的。现在 GCC 也是在自由软件领域应用最广泛的编译器。所以,我们也选择 GCC 做为本书实验的指定编译器。
GDB 调试器
- GDB 调试器是 GCC 编译器的兄弟。做为自由软件领域几乎是唯一的调试器,它秉承了 Unix 类操作系统的一贯风格,采用纯命令行操作,有点儿类似 dos 下的 debug。
Ubuntu (GNU/Linux)
Ubuntu 也许不是目前最好用的 Linux 桌面发行版,但它一定是最流行的。主要特点是易用,非常的易用。现在,已经有越来越多的人开始用 Ubuntu 完全代替 Windows,享受更加自由、安全、守法的感觉。
我们强烈建议您在 Ubuntu 下做实验。因为有些实验内容涉及到在自己改进的 Linux 0.11 下,运行自己编的应用程序。被改进的功能都是高版本 Linux 内核已经具有的,在其上确认自己编写的应用程序无误后,再用之测试自己改进的 Linux 0.11,可以更有信心些。
使用方法
编译内核
首先要进入 linux-0.11 目录,然后执行 make 命令:
1
2$ cd linux-0.11/
$ make all因为
all
是最常用的参数,所以可以省略,只用make
,效果一样。make 命令会显示很多很多的信息,你可以尽量去看懂,也可以装作没看见。只要最后几行中没有 “error” 就说明编译成功。最后生成的目标文件是一个软盘镜像文件——
linux-0.11/Image
。如果将此镜像文件写到一张 1.44MB 的软盘上,就可以启动一台真正的计算机。linux-0.11 目录下是全部的源代码,很多实验内容都是要靠修改这些代码来完成。修改后需要重新编译内核,还是执行命令:
make all
。make 命令会自动跳过未被修改的文件,链接时直接使用上次编译生成的目标文件,从而节约编译时间。但如果重新编译后,你的修改貌似没有生效,可以试试先
make clean
,再make all
(或者一行命令:make clean && make all
)。make clean
是删除上一次编译生成的所有中间文件和目标文件,确保是在全新的状态下编译整个工程。
运行
在 Bochs 中运行最新编译好的内核很简单,在 oslab 目录下执行:
1
2
3$ cd ~/oslab/
# 执行 run 脚本
$ ./run
如果出现 Bochs 的窗口,里面显示 linux 的引导过程,最后停止在 [/usr/root/]#
,表示运行成功,如下图所示。

调试
内核调试分为两种模式:汇编级调试和 C 语言级调试。
汇编级调试需要执行命令:
1
2$ cd ~/oslab/
$ ./dbg-asm汇编级调试的启动之后 Bochs 是黑屏,这是正常的。
C 语言级调试:C 语言级调试稍微复杂一些。首先执行如下命令:
1
2$ cd ~/oslab/
$ ./dbg-c然后再打开一个终端窗口,执行:
1
2$ cd ~/oslab/
$ ./rungdb注意:启动的顺序不能交换,否则 gdb 无法连接。
文件交换
接下来讲解一下 Ubuntu 和 Linux 0.11 之间的文件交换如何启动。(开始设置文件交换之前,务必关闭所有的 Bochs 进程。)
oslab 下的
hdc-0.11-new.img
是 0.11 内核启动后的根文件系统镜像文件,相当于在 bochs 虚拟机里装载的硬盘。在 Ubuntu 上访问其内容的方法是:1
2$ cd ~/oslab/
$ sudo ./mount-hdc之后,hdc 目录下就是和 0.11 内核一模一样的文件系统了,可以读写任何文件(可能有些文件要用 sudo 才能访问)。
(~/oslab/hdc就是和linux0.11中完全一样的文件系统了,对应的是Linux中的根目录,我们在这个~/oslab/hdc目录下进行增删文件,就是对Linux进行增删文件。)
读写完毕,不要忘了卸载这个文件系统:
1
2$ cd ~/oslab/
$ sudo umount hdc经过
sudo ./mount-hdc
这样处理以后,我们可以在 Ubuntu 的 hdc 目录下创建一个 xxx.c 文件,然后利用 Ubuntu 上的编辑工具(如 gedit 等)实现对 xxx.c 文件的编辑工作,在编辑保存以后。执行sudo umount hdc
后,再进入 Linux 0.11(即 run 启动 bochs 以后)就会看到这个 xxx.c(即如下图所示),这样就避免了在 Linux 0.11 上进行编辑 xxx.c 的麻烦,因为 Linux 0.11 作为一个很小的操作系统,其上的编辑工具只有 vi,使用起来非常不便。另外在 Linux 0.11 上产生的文件,如后面实验中产生的
process.log
文件,可以按这种方式 “拿到” Ubuntu 下用 python 程序进行处理,当然这个 python 程序在 Linux 0.11 上显然是不好使的,因为 Linux 0.11 上搭建不了 python 解释环境。注意 1:不要在 0.11 内核运行的时候 mount 镜像文件,否则可能会损坏文件系统。同理,也不要在已经 mount 的时候运行 0.11 内核。
注意 2:在关闭 Bochs 之前,需要先在 0.11 的命令行运行 “sync”,确保所有缓存数据都存盘后,再关闭 Bochs。