BasicOS - A Minimal Operating System - Day2

BasicOS - A Minimal Operating System

Hello World!

死循環沒什么意思,我們來嘗試輸出一句 Hello, World!

問題來了,如何在匯編中打印字符?首先,我們要設置要打印哪個字符。我們只需要將字符存儲在 ax 寄存器的低 8 位(也就是 al 寄存器),然后調用 int 0x10 中斷執行打印即可。

對于此時的 x86 CPU 來講,一共有 4 個 16 位通用寄存器,包括 ax、bx、cx 和 dx。有時候我們只需要使用 8 位,因此每個 16 位寄存器可以拆為兩個 8 位寄存器,例如 al 和 ah。

什么是中斷?簡單來講就是給 CPU 正在做的事情按下暫停,然后去執行我們指定的任務。中斷可以執行的任務被存儲在內存最開始的區域,這個區域像一張表格(中斷向量表),每個單元格指向一段指令的地址,也就是 ISR(interrupt service routines)。

為了方便在匯編中調用,BIOS 給這些中斷分配了號碼。例如,int 0x10 就是第 16 個中斷,它指向了一個打印字符的 ISR。

然而 int 0x10 中斷只知道要打印,但并不知道要怎么打印。我們這里將其設置為 TTY(TeleTYpe)模式,讓它接收字符并顯示在屏幕上,然后將光標向后移動。設置 TTY 模式的方法是將 ah 寄存器設置為 0x0e,你可以理解為傳給系統中斷的參數。

why have to load into 0x7c00?

512 字節小小的也很可愛,但顯然滿足不了操作系統龐大的欲望,因此操作系統的絕大部分代碼被放在磁盤的其它地方。這些代碼是如何加載到內存的呢?

在回答如何加載到內存之前,我們先關注另一個更緊迫的問題:加載時應該加載到內存的哪里?

答案是,引導扇區并沒有被加載到內存的 0x0000 處。這是因為內存中還需要存儲一些重要的信息,例如中斷向量表、BIOS 數據區等。這些內容需要占用一部分內存,因此有人規定,引導扇區應當被加載到 0x7c00 處。

更具體地講,開頭這塊的內存布局如下:

              |         Free          |

0x100000 +-----------------------+
| BIOS (256 KB) |
0x0C0000 +-----------------------+
| Video Memory (128 KB) |
0x0A0000 +-----------------------+
|Extended BIOS Data Area|
| (639 KB) |
0x09FC00 +-----------------------+
| Free (638 KB) |
0x007E00 +-----------------------+
| Loaded Boot Sector |
| (512 Bytes) |
0x007C00 +-----------------------+
| |
0x000500 +-----------------------+
| BIOS Data Area |
| (256 Bytes) |
0x000400 +-----------------------+
| Interrupt Vector Table|
| (1 KB) |
0x000000 +-----------------------+

編譯

nasm -f bin boot.asm -o boot.bin

創建磁盤映像

創建一個 1.44MB 的空磁盤映像:

dd if=/dev/zero of=floppy.img bs=512 count=2880

將引導扇區寫入磁盤映像:

dd if=boot.bin of=floppy.img bs=512 count=1 conv=notrunc

測試引導扇區

qemu-system-x86_64 -fda floppy.img

你應該能看到屏幕打印出 Hello, world!,然后程序進入死循環。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容