阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

深入浅出操作系统

31次阅读
没有评论

共计 5147 个字符,预计需要花费 13 分钟才能阅读完成。

导读 操作系统(Operating System,简称 OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。
实验材料准备

1, 下载实验材料 hit-oslab-linux-20110823.tar.gz(包含 linux-0.11 源码,bochs 模拟器等)

网址:http://www.ritchiehuang.cn/

2, 下载安装 gcc-3.4(编译 linux-0.11 需要用到低版本 gcc)

网址:old-releases.ubuntu.com/ubuntu/pool/universe/g/gcc-3.4/

下载内容:(统一下载存放在新建的 gcc-3.4 文件夹下, 由于我的 ubuntu 是 64 位所以下载 amd64)

1 cpp-3.4_3.4.6-6ubuntu3_amd64.deb
2 g++-3.4_3.4.6-6ubuntu3_amd64.deb
3 gcc-3.4_3.4.6-6ubuntu3_amd64.deb
4 gcc-3.4-base_3.4.6-6ubuntu3_amd64.deb
5 libstdc++6-dev_3.4.6-6ubuntu3_amd64.deb
实验相关简述

1,x86 模拟器器 Bochs

Bochs 是一个免费且开放源代码的 IA-32(x86) 架构 PC 机模拟器。在它模拟出的环境中可以运行 Linux、DOS 和各种版本的 Windows 等多种操作系统。而 Bochs 本身具有很高的移植性,可以运行在多种软硬件平台之上。如果您想拥抱自由的 Linux,那么 Bochs 几乎是您的不二选择。如果您想继续把自己绑定在 Windows 平台上,那么除了 Bochs,您还可以选用 VMware 或者 Microsoft Virtual PC。它们是最著名虚拟机软件,而且都可以免费使用。因为 Bochs 的是模拟器,其原理决定了它的运行效率会低于虚拟机。但是,Bochs 有虚拟机无可比拟的调试操作系统的能力.

2, 实验环境的工作模式

hit-oslab 实验环境简称 oslab,是一个压缩文件(hit-oslab-linux-20110823.tar.gz),可以将这个文件拷贝到自己的实验工作目录下,用 tar zxvf hit-oslab-linux-20110823.tar.gz 命令解压展开即可工作。oslab 工作在一个宿主操作系统之上,我们使用的 Linux,在宿主操作系统之上完成对 Linux 0.11 的开发、修改和编译之后,在 linux-0.11 目录下会生产一个名为 Image 的文件,它就是编译之后的目标文件。该文件内已经包含引导和所有内核的二进制代码。如果拿来一张软盘,从它的 0 扇区开始,逐字节写入 Image 文件的内容,就可以用这张软盘启动一台真正的计算机,并进入 Linux 0.11 内核。oslab 采用 bochs 模拟器加载这个 Image 文件,模拟执行 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 内镜像的文件系统挂载到 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 下编译,然后覆盖现有的二进制内核

实验环境搭建 (ubuntu-14.04.1-desktop-amd64)

1, 在~(用户 Home 文件夹) 下创建 oslab 文件夹, 将 hit-oslab-linux-20110823.tar.gz 解压到 oslab 下

mkdir oslab
cd oslab
tar -zxvf hit-oslab-linux-20110823.tar.gz

2,gcc-3.4 安装

cd gcc-3.4
sudo apt-get --purge remove gcc
sudo chmod 777 *
sudo dpkg -i *.deb

3,as86,ld86 安装 (用于编译和链接 linux/boot 下的 bootsect.s 和 setup.s, 它们采用 as86 汇编语法; 而 linux-0.11 下的其他汇编语言文件采用 gas 的语法 AT&T)

搜索包含 as86,ld86 的包:

apt-cache search as86 ld86

执行结果如下:

bin86 - 16-bit x86 assembler and loader

安装 bin86:

sudo apt-get install bin86

4, 一般环境设置

64 位系统需要安装 32 位兼容库

sudo apt-get install libc6-dev-i386

C 语言编译环境

sudo apt-get install build-essential

安装 IDE

sudo apt-get install vim cscope exuberant-ctags
编译内核
cd ~/oslab/oslab/linux-0.11

make
编译中断, 输出错误信息:

In file included from /usr/include/linux/fs.h:10,
                 from tools/build.c:28:
/usr/include/linux/ioctl.h:4:23: asm/ioctl.h: No such file or directory
In file included from /usr/include/linux/fs.h:11,
                 from tools/build.c:28:
/usr/include/linux/types.h:4:23: asm/types.h: No such file or directory
In file included from /usr/include/linux/types.h:8,
                 from /usr/include/linux/fs.h:11,
                 from tools/build.c:28:
/usr/include/linux/posix_types.h:35:29: asm/posix_types.h: No such file or directory
In file included from /usr/include/linux/fs.h:11,
                 from tools/build.c:28:
/usr/include/linux/types.h:27: error: syntax error before "__le16"
/usr/include/linux/types.h:28: error: syntax error before "__be16"
/usr/include/linux/types.h:29: error: syntax error before "__le32"
/usr/include/linux/types.h:30: error: syntax error before "__be32"
/usr/include/linux/types.h:31: error: syntax error before "__le64"
/usr/include/linux/types.h:32: error: syntax error before "__be64"
/usr/include/linux/types.h:34: error: syntax error before "__sum16"
/usr/include/linux/types.h:35: error: syntax error before "__wsum"
In file included from tools/build.c:28:
/usr/include/linux/fs.h:43: error: syntax error before "__u64"
/usr/include/linux/fs.h:45: error: syntax error before "minlen"
make: *** [tools/build] Error 1

google 搜索得知是因为 64 位 linux 的 asm 目录为:

/usr/include/x86_64-linux-gnu/asm

make 找不到文件从而导致编译中断

解决方法(建立链接):

sudo ln -s /usr/include/x86_64-linux-gnu/asm /usr/include/asm
运行

运行编译好的内核,在 oslab 目录下:

./run

出现错误:

./bochs/bochs-gdb: error while loading shared libraries: libXpm.so.4: cannot open shared object file: No such file or directory

打印动态链接配置:

ldconfig -p | grep libXpm.so.4

libXpm.so.4 的链接信息:

libXpm.so.4 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libXpm.so.4

我们需要的是 32 位库. 搜索库对应的包名称:

apt-file search libXpm.so.4

打印结果:

libxpm4: /usr/lib/x86_64-linux-gnu/libXpm.so.4
libxpm4: /usr/lib/x86_64-linux-gnu/libXpm.so.4.11.0

得到其对应的包名为 libxpm4, 安装对应的 32 位库:

sudo apt-get install libxpm4:i386
基本操作及注意事项

汇编级调试在 oslab 目录下执行命令

./dpg-asm

C 语言级调试在 oslab 目录下, 打开第一个终端窗口执行命令

./dbg-c

打开第二个终端窗口执行命令

./rungdb

Ubuntu 和 Linux0.11 之间的文件交换

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

sudo ./mount-hdc

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

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 上产生的文件,可以按这种方式”拿到“Ubuntu 下用 python 程序进行处理,当然这个 python 程序在 Linux 0.11 上显然是不好使的,因为 Linux 0.11 上搭建不了 python 解释环境。

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

注意 2:在关闭 Bochs 之前,需要先在 0.11 的命令行运行“sync”,确保所有缓存数据都存盘后,再关闭 Bochs。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计5147字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中