这篇文章是尾声的第三部分,也是《ORANGE’S:一个操作系统的实现》读书笔记的最后一篇文章,本篇文章记录如何将我们开发的OS安装到真实的计算机(建议在虚拟机中进行)。
将OS安装到真实的计算机
其实安装到真实的硬盘和安装到硬盘映像操作起来是差不多的,因为在Linux下面硬盘也是文件。下面我们就具体来操作一下。
准备工作
- 一台计算机,我这里使用的是虚拟机VirtualBox。做之前最好做一个快照,这样如果出现了问题可以快速恢复。
- 一张软盘。这里可以直接使用我们的软盘映像 fd.img。
我们的安装过程将分三部分:
- 安装Linux(包含为硬盘分区)。
- 在Linux中编译我们的源代码。
- 将我们的操作系统安装到某个分区。
安装 Linux
安装Linux这里就不再进行说明了,发行版很多,选择一个你喜欢的就可以,不过在安装的时候选择尽量少的组件,只要能保证可以正常编译我们的源代码就可以了。我这里选择的是Ubuntu,这是一个比较流行的发行版。
这里需要说明的一点是,虚拟机中的硬盘需要挂载在IDE下,因为我们的程序只识别该硬盘接口。
编译源代码
编译的过程和之前一样,这里就不再进行说明。需要注意的只有一点,就是首先查看一下分区情况,确认安装的分区是哪个,并且更改 boot/include/load.inc中的ROOT_BASE。
下面是正式的安装过程了,再次强调,一定要小心谨慎,不要破坏了重要的数据。
- 用 dd 将 hdboot.bin 写入 sda5 的引导扇区。
sudo dd if=boot/hdboot.bin of=/dev/sda5 bs=1 count=446 conv=notrunc
sudo dd if=boot/hdboot.bin of=/dev/sda5 seek=510 skip=510 bs=1 count=2 conv=notrunc
- 将hdldr.bin和kernel.bin打包如cmd.tar。
tar vcf inst.tar hdldr.bin kernel.bin
- 将inst.tar用dd命令写入硬盘。
sudo dd if=inst.tar of=/dev/sda5 seek=`echo "obase=10;ibase=16;(\`egrep -e '^ROOT_BASE' boot/include/load.inc | sed -e 's/.*0x//g' | sed -e 's/^M//g'\`+\`egrep -e '#define[[:space:]]*INSTALL_START_SECT' include/config.h | sed -e 's/.*0x//g' | sed -e 's/^M//g'\`)*200" | bc` bs=1 count=`ls -l inst.tar | awk -F " " '{print $5}'` conv=notrunc
- 在安装Ubuntu时,grub已经安装上了,只不过是grub2,和书上使用的已经不一样了,也可以使用上一篇文章的命令安装GRUB Legacy。我们可以修改/boot/grub/menu.lst,加入如下几行:
title Orange'S
rootnoverify (hd0,4)
boot
这样启动时就不必输入命令了,直接选择Orange’S一行即可。
好了,安装完毕,开始启动。先从软盘启动,之后重启,就可以从硬盘启动了,待出现grub画面时,选择Orange’S,回车,系统就启动起来了。
这里需要说明一下,本篇文章记录的内容主要是将书上的内容记录下来了,因为我在虚拟机中操作并没有成功,不知道是不是时间原因书中的有些代码和现在的Linux操作系统无法配合,从网上也没有找到具体的操作方法,所以就先把它记录下来,希望可以和大家一起探讨。
欢迎关注我的公众号