緣起:今年敗了一本書,上奇出版社的Linux Kernel設計的藝術,大陸同胞寫的書翻成翻體字。
頓時有了30天分享linux 0.11 版的構想,有鑑於以往的經驗,知道這個題目於筆者難度過高,
所以縮小範圍,改成本書第一章,從開機接上電源到執行main函數之前的過程。主要是3個組合語言檔,副檔名是.s, 每個檔案長度約250行到300行上下。覺得編碼量不多,只是組合語言從沒弄懂過的筆者,從頭到尾看了幾遍,實在看不出其中的道理,就是想實作一下。
書局逛了一下,少數的幾本組合語言的書,都是介紹MASM為主,約1本介紹NASM, 而linux 0.11版是用gnu assember(GAS)編譯的。
後來看到小木偶前輩的網站,http://home.educities.edu.tw/wanker742126/,其中有建議到16位元dos環境下,是一個不錯的練習環境,心下覺得那就裝一個DOS試試吧。
隨後發現了freedos,< http://www.freedos.org/>
可以燒成開機安裝光碟,不需要碟片安裝(誰還有軟碟機呢?),是freedos的一個亮點。
再來是書上提到bochs同樣是開放原始碼的硬體模擬為主的虛擬機,
當然就試著安裝了。
筆者的家用PC裝著Lubuntu, 更精簡的ubuntu, 國人主力開發的桌面desktop, window manager, LXDE, 因為用的是和ubuntu同樣的套件庫,所以安裝套件,下一步下一步就完成了。
synaptic管理程式己經存在好幾個ubuntu發行版了,易用性高。
筆者的bochs設定檔,參考網路的分享設定,及官網的user guidehttp://bochs.sourceforge.net/cgi-bin/topper.pl?name=New+Bochs+Documentation&url=http://bochs.sourceforge.net/doc/docbook/user/index.html,拼湊一些範例,及官網上free dos也有一個影像檔範例。
設定檔bochsrc如下。
megs: 32
romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
vga: extension=vbe
floppya: 1_44=a.img, status=inserted
floppyb: 1_44=b.img, status=inserted
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path=c.img, mode=flat
ata0-slave: type=cdrom, path=dosml.iso, status=inserted
boot: c
log: bochsout.txt
mouse: enabled=0
cpu: ips=15000000
bochs提供工具,可透過指令產生軟碟(a.img,b.img代表軟碟的A:,B:),硬碟的映像檔,
(代表c.img),因為己安裝好,所以freedos系統己經在C:。
一開始是用freedos的安裝開機iso檔來開機安裝,
過程中超真實的,還要分區格式化硬碟,就像重灌作業系統的過程。只是全部是指令列,按TAB鍵切換,enter下一步。
指令列下shutdown可以關機。
然後用debug寫一個com格式的執行檔。
C:\>debug
-a 100
08FA:0100 jmp 111
08FA:0102
-e 102 'Hello World!',0D,0A,'$'
-a 111
08FA:0111 mov dx,102
08FA:0114 mov ah, 09
08FA:0116 int 21
08FA:0118 int 20
08FA:011A
-h 011a 0100
021A 001A
-n hello.com
-rcx
CX 0000 :001a
-w
Writing 001A bytes
-q
執行一下hello.com
C:\>hello.com
Hello World!
這段CODE來自於Old school assembly "Hello World!": Method 2http://www.youtube.com/watch?v=9Qn84QxX-zs,
測試freedos和指令的相容性。
下一篇會解釋一下這段程式裏面所用到指令及暫存器的意思。
小結:
用freedos是一場意外,本是是要架設bochs來trace linux0.11 ,
這場意外,像是走入了時光隧道裏,回到了過去,20年前。
那時的dos安裝程式,只要exe檔就可以了,複製即可,沒有下一步下一步的安裝。
沒有registry, 沒有機碼,沒有瀏覽器。沒有上網。(現在freedos補上了)。
當網路上下載的masm.exe直接可用時,好像國中時的種種記憶都回來了。
那時要學basic,筆者總是少一根筋,不懂指令的意思,以為這輩子不用電腦也沒關係,這種難用的東西怎麼會普及呢? 那時不知道多年後,會有linux,世人會有所謂的自由軟體。
哇!masm耶~~是克羅馬儂人搭時光機回來了嗎?
Tim大如果這30天能撐完kernel全程,絕對要給您大放鞭炮,加油!!
謝謝鼓勵,去年卡在15天,今天至少16天,有提前準備了。
你的JS錄影,是我學習的模範,共勉之…
真是懷念頗多的組語~ 陪伴我度過好幾年青春歲月的終極利器~
話說 ... int 20 是 MS 宣告廢棄不用的程式結束中斷。要結束程式,應該下
<pre class="c" name="code">mov ah, 4C
int 21
為什麼呢?因為 al 可以放返回值。
<pre class="c" name="code">mov al, 00 ; 返回值。或者可以跟下面合併寫成 mov ax, 4C00
mov ah, 4C
int 21
對組語文章還能有技術feedback的,大概只有天荒地老的Wiseguy大.....?
這段debug編輯環境下的hello.com,可以run,
**int 20 MS 宣告廢棄不用的程式結束中斷。**所以,我測一下。
<pre class="c" name="code">
-a 100
08FA:0100 jmp 111
08FA:0102
-e 102 'Hello World!',0D,0A,'$'
-a 111
08FA:0111 mov dx,102
08FA:0114 mov ah,09
08FA:0116 int 21
08FA:0118
-h 0118 0100
0218 0018
-n hellos.com
-r cx
CX 0000 :0018
-w
Writing 0018 bytes
-q
C:\>hellos.com
Hello World!
Hello World!
誤解意思,應是
<pre class="c" name="code">
C:\>debug
-100
^ Error
-a 100
08FA:0100 jmp 111
08FA:0102 'Hello World!',0D,0A,'$'
^ Error
08FA:0102
-e 102 'Hello World',0D,0A,'$'
-a 111
08FA:0111 mov dx,102
08FA:0114 mov ax,4c00
08FA:0117 int 21
08FA:0119
-h 0119 0100
0219 0019
-n hellot.com
-rcx
CX 0000 :0019
-w
Writing 0019 bytes
-q
C:\>hellot.com
還是誤解意思,應是
<pre class="c" name="code">
-a 100
08FA:0100 jmp 111
08FA:0102
-e 'Hello World!',0D,0A,'$'
^ Error
-e 102 'Hello World!',0D,0A,'$'
-a 111
08FA:0111 mov dx,102
08FA:0114 mov ah,09
08FA:0116 int 21
08FA:0118 mov al,00
08FA:011A mov ah,4c
08FA:011C int 21
08FA:011E
-h 11e 100
021E 001E
-n hellou.com
-rcx
CX 0000 :001e
-w
Writing 001E bytes
-q
C:\>hellou.com
Hello World!
才對,
受教了,
意思是,free dos同時接受,int 20及mov ax,4c00 ,int 21
這兩種程式退出的語法,嗎??
這個語法,老外也不知道耶,前輩真利害。
INT 21H 是 dos interrupt, 功能 4c 是「結束執行,回到原呼叫者」
INT 20H 是「結束執行,回到作業系統(DOS)」
如果在 debug 中執行你的程式
INT 21H (4C) 只會回到 debug
INT 20H 會回到 DOS prompt