編輯推薦
隻需30天
從零開始編寫一個五髒俱全的圖形操作係統
39.1KB迷你係統
實現多任務、漢字顯示、文件壓縮,還能聽歌看圖玩遊戲
日本編程天纔
揭開CPU、內存、磁盤以及操作係統底層工作模式的神秘麵紗
內容簡介
《30天自製操作係統》是一本兼具趣味性、實用性與學習性的操作係統圖書。作者從計算機的構造、匯編語言、C語言開始解說,讓讀者在實踐中掌握算法。在這本書的指導下,從零編寫所有代碼,30天後就可以製作齣一個具有窗口係統的32位多任務操作係。
《30天自製操作係統》適閤操作係統愛好者和程序設計人員閱讀。
作者簡介
川閤秀實(Hidemi Kawai),生於1975年,是一位以“輕量化”編程思想見長的“非主流”開發者。2000年因自行開發的OSASK項目而名聲大噪。OSASK是一個開源的32位微型操作係統,它並非以Linux等內核為基礎,而是完全從零開始開發,在一張軟盤的容量下實現瞭GUI、多任務、多語言等高級特性,啓動時間隻需1秒。本書的內容可以看成是作者以OSASK為藍本,教會讀者從零開始開發一個操作係統,同時可以讓初學者在編寫操作係統的過程中,瞭解操作係統背後更多的知識。
目錄
第0天 著手開發之前
1 前言
2 何謂操作係統
3 開發操作係統的各種方法
4 無知則無畏
5 如何開發操作係統
6 操作係統開發中的睏難
7 學習本書時的注意事項(重要!)
8 各章內容摘要
第1天 從計算機結構到匯編程序入門
1 先動手操作
2 究竟做瞭些什麼
3 初次體驗匯編程序
4 加工潤色
第2天 匯編語言學習與Makefile入門
1 介紹文本編輯器
2 繼續開發
3 先製作啓動區
4 Makefile入門
第3天 進入32位模式並導入C語言
1 製作真正的IPL
2 試錯
3 讀到18扇區
4 讀入10個柱麵
5 著手開發操作係統
6 從啓動區執行操作係統
7 確認操作係統的執行情況
8 32位模式前期準備
9 開始導入C語言
10 實現HLT(harib00j)
第4天 C語言與畫麵顯示的練習
1 用C語言實現內存寫入(harib01a)
2 條紋圖案(harib01b)
3 挑戰指針(harib01c)
4 指針的應用(1)(harib01d)
5 指針的應用(2)(harib01e)
6 色號設定(harib01f)
7 繪製矩形(harib01g)
8 今天的成果(harib01h)
第5天 結構體、文字顯示與GDT/IDT初始化
1 接收啓動信息(harib02a)
2 試用結構體(harib02b)
3 試用箭頭記號(harib02c)
4 顯示字符(harib02d)
5 增加字體(harib02e)
6 顯示字符串(harib02f)
7 顯示變量值(harib02g)
8 顯示鼠標指針(harib02h)
9 GDT與IDT的初始化(harib02i)
第6天 分割編譯與中斷處理
1 分割源文件(harib03a)
2 整理Makefile(harib03b)
3 整理頭文件(harib03c)
4 意猶未盡
5 初始化PIC(harib03d)
6 中斷處理程序的製作(harib03e)
第7天 FIFO與鼠標控製
1 獲取按鍵編碼(hiarib04a)
2 加快中斷處理(hiarib04b)
3 製作FIFO緩衝區(hiarib04c)
4 改善FIFO緩衝區(hiarib04d)
5 整理FIFO緩衝區(hiarib04e)
6 總算講到鼠標瞭(harib04f)
7 從鼠標接受數據(harib04g)
第8天 鼠標控製與32位模式切換
1 鼠標解讀(1)(harib05a)
2 稍事整理(harib05b)
3 鼠標解讀(2)(harib05c)
4 移動鼠標指針(harib05d)
5 通往32位模式之路
第9天 內存管理
1 整理源文件(harib06a)
2 內存容量檢查(1)(harib06b)
3 內存容量檢查(2)(harib06c)
4 挑戰內存管理(harib06d)
第10天 疊加處理
1 內存管理(續)(harib07a)
2 疊加處理(harib07b)
3 提高疊加處理速度(1)(harib07c)
4 提高疊加處理速度(2)(harib07d)
第11天 製作窗口
1 鼠標顯示問題(harib08a)
2 實現畫麵外的支持(harib08b)
3 shtctl的指定省略(harib08c)
4 顯示窗口(harib08d)
5 小實驗(harib08e)
6 高速計數器(harib08f)
7 消除閃爍(1)(harib08g)
8 消除閃爍(2)(harib08h)
第12天 定時器(1)
1 使用定時器(harib09a)
2 計量時間(harib09b)
3 超時功能(harib09c)
4 設定多個定時器(harib09d)
5 加快中斷處理(1)(harib09e)
6 加快中斷處理(2)(harib09f)
7 加快中斷處理(3)(harib09g)
第13天 定時器(2)
1 簡化字符串顯示(harib10a)
2 重新調整FIFO緩衝區(1)(harib10b)
3 測試性能(harib10c~harib10f)
4 重新調整FIFO緩衝區(2)(harib10g)
5 加快中斷處理(4)(harib10h)
6 使用“哨兵”簡化程序(harib10i)
第14天 高分辨率及鍵盤輸入
1 繼續測試性能(harib11a~harib11c)
2 提高分辨率(1)(harib11d)
3 提高分辨率(2)(harib11e)
4 鍵盤輸入(1)(harib11f)
5 鍵盤輸入(2)(harib11g)
6 追記內容(1)(harib11h)
7 追記內容(2)(harib11i)
第15天 多任務(1)
1 挑戰任務切換(harib12a)
2 任務切換進階(harib12b)
3 做個簡單的多任務(1)(harib12c)
4 做個簡單的多任務(2)(harib12d)
5 提高運行速度(harib12e)
6 測試運行速度(harib12f)
7 多任務進階(harib12g)
第16天 多任務(2)
1 任務管理自動化(harib13a)
2 讓任務休眠(harib13b)
3 增加窗口數量(harib13c)
4 設定任務優先級(1)(harib13d)
5 設定任務優先級(2)(harib13e)
第17天 命令行窗口
1 閑置任務(harib14a)
2 創建命令行窗口(harib14b)
3 切換輸入窗口(harib14c)
4 實現字符輸入(harib14d)
5 符號的輸入(harib14e)
6 大寫字母與小寫字母(harib14f)
7 對各種鎖定鍵的支持(harib14g)
第18天 dir命令
1 控製光標閃爍(1)(harib15a)
2 控製光標閃爍(2)(harib15b)
3 對迴車鍵的支持(harib15c)
4 對窗口滾動的支持(harib15d)
5 mem命令(harib15e)
6 cls命令(harib15f)
7 dir命令(harib15g)
第19天 應用程序
1 type命令(harib16a)
2 type命令改良(harib16b)
3 對FAT的支持(harib16c)
4 代碼整理(harib16d)
5 第一個應用程序(harib16e)
第20天 API
1 程序整理(harib17a)
2 顯示單個字符的API(1)(harib17b)
3 顯示單個字符的API(2)(harib17c)
4 結束應用程序(harib17d)
5 不隨操作係統版本而改變的API(harib17e)
6 為應用程序自由命名(harib17f)
7 當心寄存器(harib17g)
8 用API顯示字符串(harib17h)
第21天 保護操作係統
1 攻剋難題——字符串顯示API(harib18a)
2 用C語言編寫應用程序(harib18b)
3 保護操作係統(1)(harib18c)
4 保護操作係統(2)(harib18d)
5 對異常的支持(harib18e)
6 保護操作係統(3)(harib18f)
7 保護操作係統(4)(harib18g)
第22天 用C語言編寫應用程序
1 保護操作係統(5)(harib19a)
2 幫助發現bug(harib19b)
3 強製結束應用程序(harib19c)
4 用C語言顯示字符串(1)(harib19d)
5 用C語言顯示字符串(2)(harib19e)
6 顯示窗口(harib19f)
7 在窗口中描繪字符和方塊(harib19g)
第23天 圖形處理相關
1 編寫malloc(harib20a)
2 畫點(harib20b)
3 刷新窗口(harib20c)
4 畫直綫(harib20d)
5 關閉窗口(harib20e)
6 鍵盤輸入API(harib20f)
7 用鍵盤輸入來消遣一下(harib20g)
8 強製結束並關閉窗口(harib20h)
第24天 窗口操作
1 窗口切換(1)(harib21a)
2 窗口切換(2)(harib21b)
3 移動窗口(harib21c)
4 用鼠標關閉窗口(harib21d)
5 將輸入切換到應用程序窗口(harib21e)
6 用鼠標切換輸入窗口(harib21f)
7 定時器API(harib21g)
8 取消定時器(harib21h)
第25天 增加命令行窗口
1 蜂鳴器發聲(harib22a)
2 增加更多的顔色(1)(harib22b)
3 增加更多的顔色(2)(harib22c)
4 窗口初始位置(harib22d)
5 增加命令行窗口(1)(harib22e)
6 增加命令行窗口(2)(harib22f)
7 增加命令行窗口(3)(harib22g)
8 增加命令行窗口(4)(harib22h)
9 變得更像真正的操作係統(1)(harib22i)
10 變得更像真正的操作係統(2)(harib22j)
第26天 為窗口移動提速
1 提高窗口移動速度(1)(harib23a)
2 提高窗口移動速度(2)(harib23b)
3 提高窗口移動速度(3)(harib23c)
4 提高窗口移動速度(4)(harib23d)
5 啓動時隻打開一個命令行窗口(harib23e)
6 增加更多的命令行窗口(harib23f)
7 關閉命令行窗口(1)(harib23g)
8 關閉命令行窗口(2)(harib23h)
9 start命令(harib23i)
10 ncst命令(harib23j)
第27天 LDT與庫
1 先來修復bug(harib24a)
2 應用程序運行時關閉命令行窗口(harib24b)
3 保護應用程序(1)(harib24c)
4 保護應用程序(2)(harib24d)
5 優化應用程序的大小(harib24e)
6 庫(harib24f)
7 整理make環境(harib24g)
第28天 文件操作與文字顯示
1 alloca(1)(harib25a)
2 alloca(2)(harib25b)
3 文件操作API(harib25c)
4 命令行API(harib25d)
5 日文文字顯示(1)(harib25e)
6 日文文字顯示(2)(harib25f)
7 日文文字顯示(3)(harib25g)
第29天 壓縮與簡單的應用程序
1 修復bug(harib26a)
2 文件壓縮(harib26b)
3 標準函數
4 非矩形窗口(harib26c)
5 bball(harib26d)
6 外星人遊戲(harib26e)
第30天 高級的應用程序
1 命令行計算器(harib27a)
2 文本閱覽器(harib27b)
3 MML播放器(harib27c)
4 圖片閱覽器(harib27d)
5 IPL的改良(harib27e)
6 光盤啓動(harib27f)
第31天 寫在開發完成之後
1 繼續開發要靠大傢的努力
2 關於操作係統的大小
3 操作係統開發的訣竅
4 分享給他人使用
5 關於光盤中的軟件
6 關於開源的建議
7 後記
8 畢業典禮
9 附錄
精彩書摘
第15天
多任務(1)
挑戰任務切換(harib12a)
任務切換進階(harib12b)
做個簡單的多任務(1)(harib12c)
做個簡單的多任務(2)(harib12d)
提高運行速度(harib12e)
測試運行速度(harib12f)
多任務進階(harib12g)
1 挑戰任務切換(harib12a)
“話說,多任務到底是啥呢?”我們今天的內容,就從這個問題開始吧。
多任務,在英語中叫做“multitask”,顧名思義就是“多個任務”的意思。簡單地說,在Windows等操作係統中,多個應用程序同時運行的狀態(也就是同時打開好幾個窗口的狀態)就叫做多任務。
對於生活在現代社會的各位來說,這種多任務簡直是理所當然的事情。比如你會一邊用音樂播放軟件聽音樂一邊寫郵件,郵件寫到一半忽然有點東西要查,便打開Web瀏覽器上網搜索。這對於大傢來說這些都是傢常便飯瞭吧。可如果沒有多任務的話會怎麼樣呢?想寫郵件的時候就必須關掉正在播放的音樂,要查東西的時候就必須先保存寫到一半的郵件,然後纔能打開Web瀏覽器……光想象一下就會覺得太不方便瞭。
然而在從前,沒有多任務反倒是普遍的情形(那個時候大傢不用電腦聽音樂,也沒有互聯網)。在那個年代,電腦一次隻能運行一個程序,如果要同時運行多個程序的話,就得買好幾颱電腦纔行。
就在那個時候,誕生瞭最初的多任務操作係統,大傢都覺得太瞭不起瞭。從現在開始,我們也要準備給“紙娃娃係統”添加執行多任務的能力瞭。連這樣一個小不點兒操作係統都能夠實現多任務,真是讓人不由地感嘆它生逢其時呀。
稍稍思考一下我們就會發現,多任務這個東西還真是奇妙,它究竟是怎樣做到讓多個程序同時運行的呢?如果我們的電腦裏麵裝瞭好多個CPU的話,同時運行多個程序倒也順理成章,但實際上就算我們隻有一個CPU,照樣可以實現多任務。
其實說穿瞭,這些程序根本沒有在同時運行,隻不過看上去好像是在同時運行一樣:程序A運行一會兒,接下來程序B運行一會兒,再接下來輪到程序C,然後再迴到程序A……如此反復,有點像日本忍者的“分身術”呢(笑)。
為瞭讓這種分身術看上去更完美,需要讓操作係統盡可能快地切換任務。如果10秒纔切換一次,那就連人眼都能察覺齣來瞭,同時運行多個程序的戲碼也就穿幫瞭。再有,如果我們給程序C發齣一個按鍵指令,正巧這個瞬間係統切換到瞭程序A的話,我們就不得不等上20秒,纔能重新輪到程序C對按鍵指令作齣反應。這實在是讓人抓狂啊(哭)。
在一般的操作係統中,這個切換的動作每0.01~0.03秒就會進行一次。當然,切換的速度越快,讓人覺得程序是在同時運行的效果也就越好。不過,CPU進行程序切換(我們稱為“任務切換”)這個動作本身就需要消耗一定的時間,這個時間大約為0.0001秒左右,不同的CPU及操作係統所需的時間也有所不同。如果CPU每0.0002秒切換一次任務的話,該CPU處理能力的50%都要被任務切換本身所消耗掉。這意味著,如果同時運行2個程序,每個程序的速度就隻有單獨運行時的1/4,這樣你會覺得開心嗎?如果變成這種結果,那還不如乾脆彆搞多任務呢。
相比之下,即便是每0.001秒切換一次任務,單單在任務切換上麵也要消耗CPU處理能力的10%。大概有人會想,10%也沒什麼大不瞭的吧?可如果你看看速度快10%的CPU賣多少錢,說不定就會恍然大悟,“對啊,隻要優化一下任務切換間隔,就相當於一分錢也不花,便換上瞭比現在更快的CPU嘛……”(笑),你也就明白瞭浪費10%也是很不值得的。正是因為這個原因,任務切換的間隔最短也得0.01秒左右,這樣一來隻有1%的處理能力消耗在任務切換上,基本上就可以忽略不計瞭。
關於多任務是什麼的問題,已經大緻講得差不多瞭,接下來我們來看看如何讓CPU來處理多任務。
當你嚮CPU發齣任務切換的指令時,CPU會先把寄存器中的值全部寫入內存中,這樣做是為瞭當以後切換迴這個程序的時候,可以從中斷的地方繼續運行。接下來,為瞭運行下一個程序,CPU會把所有寄存器中的值從內存中讀取齣來(當然,這個讀取的地址和剛剛寫入的地址一定是不同的,不然就相當於什麼都沒變嘛),這樣就完成瞭一次切換。我們前麵所說的任務切換所需要的時間,正是對內存進行寫入和讀取操作所消耗的時間。
接下來我們來看看寄存器中的內容是怎樣寫入內存裏去的。下麵這個結構叫做“任務狀態段”(task status segment),簡稱TSS。TSS有16位和32位兩個版本,這裏我們使用32位版。顧名思義,TSS也是內存段的一種,需要在GDT中進行定義後使用。
參考上麵的結構定義,TSS共包含26個int成員,總計104字節(摘自CPU的技術資料),我特意把它們分成4行來寫。從開頭的backlink起,到cr3為止的幾個成員,保存的不是寄存器的數據,而是與任務設置相關的信息,在執行任務切換的時候這些成員不會被寫入(backlink除外,某些情況下是會被寫入的)。後麵的部分中我們會用到這裏的設定,不過現在你完全可以先忽略它。
第2行的成員是32位寄存器,第3行是16位寄存器,應該沒必要解釋瞭吧……不對,eip好像到現在還沒講過呢。EIP的全稱是"extended instruction pointer",也就是"擴展指令指針寄存器"的意思。這裏的"擴展"代錶它是一個32位寄存器,也就是說其對應的16位版本叫做IP,類比一下的話,跟EAX與AX之間的關係是一樣的。
EIP是CPU用來記錄下一條需要執行的指令位於內存中哪個地址的寄存器,因此它纔被稱為"指令指針"。如果沒有這個寄存器,記性不好的CPU就會忘記自己正在運行哪裏的程序,於是程序就沒辦法正常運行瞭。每執行一條指令,EIP寄存器中的值就會自動纍加,從而保證一直指嚮下一條指令所在的內存地
30天自製操作係統(附光盤1張) 下載 mobi epub pdf txt 電子書 格式