《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格式(二進制格式),生成的二進制中除了你寫的源代碼以外,不包含其餘任何東西。這也意味着,程序執行時的內存映像和二進制文件映像是同樣的。
本文最近訪客