《Orange’s 一个操做系统的实现》实验笔记
生成软盘镜像文件a.img的方法html
Windows 平台linux
1. 使用WinHex软件,新建大小为1474560bytes的文件,而后保存。web
2. 使用WinImage软件,新建大小为1.44MB的文件,而后保存,注意,保存的类型为“全部文件(*,*)”,文件名为“a.img”。网络
Linux平台app
1. 使用dd命令:dd if=/dev/zero of=a.img bs=512 count=2880jsp
Windows和linux若是安装了borchs虚拟机,则还能够经过bximage命令来生成一个镜像。tcp
注意:以上方法中,使用winhex和dd命令生成的镜像文件是原始的二进制文件,未被格式化,可是这个软盘镜像仅仅能用来启动电脑,而不能用来存储数据。因此不能被操做系统(例如msdos,linux)识别,例如linux不能挂载。而winimage软件生成的文件是已被格式化成fat文件系统,能够储存数据,能够被linux挂载,被msdos识别。ide
《Orange’s 一个操做系统的实现》第三章第一节的实验笔记post
若是电脑启动时,执行的是软盘上的程序,则此软盘是可启动的。判断一个软盘是否能启动,只要看*.img(泛指软盘镜像)的第一扇区的最后两个字节是不是0x55,0xAA,若是是,则可启动。怎么查看*.img?linux下能够用hexedit,Windows用winhex等。用WinHex和dd命令生成的软盘镜像的内容全是0,因此,咱们须要将a.img的第一个扇区的最后两个字节修改成0X55,0XAA。ui
实验一:将pmtest1.bin 写入 a.img
这两天在作《Orange’s 一个操做系统的实现》第三章第一节的实验,碰到一些问题,使用dd命令将pmtest1.bin写入软盘镜像a.img,但此镜像却不能再虚拟机中运行,我是这样作的:
#生成一个空白的软盘镜像a.img
dd if=/dev/zero of=a.img bs=512 count=2880
#将pmtest1.asm编译成bin格式
nasm pmtest1.asm –o pmtest1.bin
#将pmtest1.bin 写入a.img
dd if=pmtest1.bin of=a.img bs=512 count=1 conv=notrunc
起初觉得是本身写命令有问题,而后在网上找相关资料,《使用开源软件—本身动手写操做系统》是这样作的:
dd if=pmtest1.bin of=a.img bs=512 count=1
dd if=/dev/zero of=a.img skip=1 seek=1 skip=1 bs=512 count=2879
以上两种方法我试了N次都不行,最后发现,是由于生成的文件a.img是不可启动,由于在a.img的第一个扇区的最后两个字节是0x00,0x00,因此,我把这两个字节改成0x55,0xAA,在虚拟机上运行成功!还有一个问题值得注意,做者使用的NASM版本比较老,我使用的是2.8版本的,两个版本编译源代码生成的二进制文件很不同!但在虚拟机上运行结果倒是同样的。做者所用的a.img是第一章的文件,因此第一个扇区的最后两个字节已是0x55,0xAA。做者是把代码用NASM编译成.BIN格式(二进制格式),生成的二进制中除了你写的源代码以外,不包含其余任何东西。这也意味着,程序执行时的内存映像和二进制文件映像是同样的。
本文最近访客