看了几天的linux0.01的资料,前天终于编译出来了Image文件,这个文件可以用来启动bochs虚拟机。但问题是直接把Image加到bochssrc.txt中没有成功。
后来看资料中说要利用软盘并输入命令make disk来把Image写入到软盘中。这本书是2004年出版的。现在2016哪里还有软盘呢。后来记得linux 的 dd命令可以制作img文件。折腾了好长时间才弄明白。其实我就是差一个参数就不用折腾这么久了。
正因为如此,我把过程记录下来,以后说不定能帮到大家。
编译linux0.01的过程省略。我们得到Image文件后。可以在bochs的目录中找到bximage这个命令。这个命令也可以在linux下单独安装。运行此命令后,一切按默认的设置会生成一个a.img的文件。这是一个1.44的软盘镜像。但里面什么都没有。
关键的地方来了:
dd if=./Image of=./a.img bs=512 conv=notrunc
后面这个参数是不截断a.img文件。这样才是一个完整的软盘镜像文件啊。bochs才能识别出来。把他加入到bochssrc.txt中。加载起来吧。
此外,还要注意bochssrc.txt中相关启动设备的参数,比如说:ata0-master: type=disk, path="c.img", cylinders=20, heads=16, spt=63后面这几个参数要和生成的c.img要对应。
这个c.img是硬盘的镜像,在利用bximage生成c.img时,有相关的参数提示。大家按需要改即可。生成过程中的部分输入信息如下:
Please type flat, sparse or growing. [flat]
Enter the hard disk size in megabytes, between 1 and 129023
[10]
I will create a 'flat' hard disk image with
cyl=20
heads=16
sectors per track=63
total sectors=20160
total size=9.84 megabytes
What should I name the image?
[c.img]
上面的参数就是这个镜像文件的硬盘参数了。
附上dd的说明:
dd指令使用
语法格式
dd [option]
dd指令选项详解
if=file:输入文件名,缺省为标准输入
of=file:输出文件名,缺省为标准输出
ibs=bytes:一次读入 bytes 个字节(即一个块大小为 bytes 个字节)
obs=bytes:一次写 bytes 个字节(即一个块大小为 bytes 个字节)
bs=bytes:同时设置读写块的大小为 bytes ,可代替 ibs 和 obs
cbs=bytes:一次转换 bytes 个字节,即转换缓冲区大小
skip=blocks:从输入文件开头跳过 blocks 个块后再开始复制
seek=blocks:从输出文件开头跳过 blocks 个块后再开始复制。(通常只有当输出文件是磁盘或磁带时才有效)
count=blocks:仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数
conv=ASCII:把EBCDIC码转换为ASCIl码。
conv=ebcdic:把ASCIl码转换为EBCDIC码。
conv=ibm:把ASCIl码转换为alternate EBCDIC码。
conv=block:把变动位转换成固定字符。
conv=ublock:把固定位转换成变动位。
conv=ucase:把字母由小写转换为大写。
conv=lcase:把字母由大写转换为小写。
conv=notrunc:不截短输出文件。
conv=swab:交换每一对输入字节。
conv=noerror:出错时不停止处理。
conv=sync:把每个输入记录的大小都调到ibs的大小(用NUL填充)。