现在的位置: 首页 > 综合 > 正文

自己动手搭建 Linux 0.12 编译环境 — Linux主机

2013年10月16日 ⁄ 综合 ⁄ 共 2749字 ⁄ 字号 评论关闭

Hi,又见面了,这两天事情比较少,所以又快速构思这篇的内容。

上篇我用极简模式说完了关于Linux 0.12的模拟环境Bochs,这篇同样沿袭上篇的思路,不过主要内容是关于Linux主机。在搭建Linux 0.12编译环境的时候,你需要一个Linux主机环境来完成几乎你想实现的所有工作,这里我选择了CentOS,这完全又是一个巧合,我一开始也是使用的是Ubuntu,后来为什么换成CentOS了,我也就忘了。当然了,运行它的最佳载体就是VMware Player(最近我将它升级到了最新的5.0.0 version)。

[gcc].

第一个section我必须将gcc拿出来唠叨两句,编译过Linux 0.11的朋友都知道,这个过程比较痛苦,是的,我也经历过。因为编译过程中会冒出极其多的error致使编译停止,这里很大一部分原因是gcc version的问题,现在版本的编译器对C语言的支持经历了数十年,比如我CentOS的gcc版本是4.1.2,而搭建Linux 0.12编译环境使用的版本却是1.40,差了不知道多少次迭代。在看看Linux 0.12,它发布于1992年,当年的C语言特征和现在编译器所支持的C语言特征足足相隔了20年之久。

因此最后汇成一句话,我们需要对gcc做降级处理,按理论说最好是将gcc的version降到1992年的时候,不过实验表明,其实不必做得那么绝,我降到3.2.2 version已经可以工作的比较好了。还要提醒一点的是,直接用高版本的编译器也是可以编译成功的,不过需要你大量地修改源代码,这样的代价是我不想去付出的!

降级顺序:

4.1.2 -> 3.4.5 -> 3.2.2

编译顺序(以3.4.5 version为例):

1. tar -zxvf gcc-3.4.5.tar.gz
2. mkdir /usr/local/gcc-3.4.5
3. cd /usr/local/gcc-3.4.5
4. [gcc-3.4.5源代码目录]/configure --prefix=/usr/local/gcc-3.4.5 --enable-threads=posix --disable-checking --enable--long-long --with-system-zlib --enable-languages=c,c++
5. make
6. make install
7. ln -s /usr/local/gcc-3.4.5/bin/gcc /usr/bin/gcc

[sls-0.99pl].

熟悉Linux 0.11运行环境搭建的朋友都知道,这是个很小的OS,可以在Bochs运行,介绍它是为后面硬盘制作准备的,你可以将你的硬盘文件挂载到sls OS上面,然后对它进行硬盘的分区和文件系统的格式化操作,这个解决方案我个人非常喜欢,且很方便。从这里把它down下来,注意,请用Bochs安装目录下面的"bochsrc-sample.txt"配置文件替换原有的配置文件。a.img是软盘启动盘,c.img是文件系统盘,自己改一下配置参数让它跑一跑!

[硬盘制作].

产生一个硬盘文件我们使用Bochs自带的工具”bximage.exe“来完成,步骤非常简单,提醒一点的是将最后生成的bochsrc参数记下来喔:

“The following line should appear in your bochsrc:
  ata0-master: type=disk, path="c.img", mode=flat, cylinders=130, heads=16, spt=63”

有了硬盘文件,我们就要开始对它进行分区和格式化了,有了sls OS,这样两步非常容易。我们首先需要将创建好的硬盘文件挂载到sls OS上面,由于它已经有了一个硬盘,因此我们选择挂载到它的第二块硬盘上面,配置ata0-slave参数即可。

分区操作我们使用"fdisk"命令来完成,这里我就简单介绍一下它:

Command (m for help): m
   a   toggle a bootable flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition  (增加一个分区)
   p   print the partition table (打印分区情况)
   q   quit without saving changes
   t   change a partition's system id (指定对应分区的文件系统id)
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit (这个是将分区信息写入第一扇区里面)
   x   extra functionality (experts only)

格式化硬盘我们使用”mkfs“命令来完成,若你想格式化第二块硬盘大小为10M的第一个分区,这样写”mkfs /dev/hdb1 10000“。

[硬盘信息].

通过这个小节,我们可以认识硬盘的分区信息到底是如何存储的。其实它是按照一定的组织(数据结构)存储在硬盘的第一个扇区(MBR)里面,具体见下面的图片说明:

这里我是有意安排的,因为后面的内容会用到硬盘分区信息里面的内容。我们需要关心每个分区的起始扇区和扇区数量,它们分别是每个分区偏移为0x08和0x0C的位置,4个字节大小:

[文件拷贝].

当我们制作好一个硬盘文件后,下一步就是拷贝文件进去了,包括了Linux运行必要的工具和配置文件,怎样把这些文件拷贝到硬盘里面,第一种方式是再次利用sls OS来挂载原始的软盘文件和制作好的硬盘文件,但是这样的方法不能满足有些情况,比如我有个Linux 0.12的测试应用是放在Linux主机上的,它不在sls OS里面。因此这里提供了第二种方式,直接在Linux主机上操作完成:

losetup -o 512 /dev/loop0 c.img

mount -t minix /dev/loop0 /mnt/minix

如果不懂以上命令意思可以Google一下。这里的c.img就是制作好的硬盘文件,”-o 512“指定了想要挂载分区的起始字节数(起始扇区*512),起始字节数一定要算对哟~

[minix驱动].

如果你发现在mount中使用”-t minix“时出现错误,那么基本判断是你的Linux主机上还没有安装minix文件系统的驱动,没关系,这个在网上可以轻松搜到解决办法。直接编译minix文件系统驱动模块,insmod进去即可,它的源代码在Linux kernel source code里面就有。不过这里注意每次Linux主机启动的时候都需要手动将minix.ko给insmod进去喔。

抱歉!评论已关闭.