編輯推薦
隻需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 電子書 格式
評分
☆☆☆☆☆
好書。
評分
☆☆☆☆☆
包裹簡陋
評分
☆☆☆☆☆
書的質量不錯,是正版,但是這次買的好幾本,這本還沒來的及來,應該也不錯吧
評分
☆☆☆☆☆
說實話不喜歡作者的寫作風格,囉哩囉嗦,不把原理講清楚,盡講一些無關緊要的東西。
評分
☆☆☆☆☆
書質量不錯,,,
評分
☆☆☆☆☆
物美價廉,書本都是正版的
評分
☆☆☆☆☆
不錯不錯不錯不錯不錯不錯不錯不錯不錯不錯不錯不錯不錯不錯不錯不錯不錯不錯不錯不錯
評分
☆☆☆☆☆
書很棒 結閤C和匯編的知識講解 從匯編的角度理解c的原理 很容易上手 適閤所有初學者 不過在用此書前還是需要一點點計算機原理和實模式保護模式的簡單基礎這樣上手更快些
評分
☆☆☆☆☆
還沒開始看,希望有用