30天自製操作係統(附光盤1張)

30天自製操作係統(附光盤1張) pdf epub mobi txt 電子書 下載 2025

[日] 川閤秀實 著,周自恒,李黎明,曾詳江,張文旭 譯
圖書標籤:
  • 操作係統
  • 自製操作係統
  • DIY
  • 編程
  • 計算機科學
  • 技術
  • 入門
  • 實踐
  • 30天
  • 光盤教材
想要找書就要到 新城書站
立刻按 ctrl+D收藏本頁
你會得到大驚喜!!
齣版社: 人民郵電齣版社
ISBN:9787115287960
版次:1
商品編碼:11055051
包裝:平裝
叢書名: 圖靈程序設計叢書
開本:16開
齣版時間:2012-08-01
用紙:膠版紙
頁數:710
字數:1063000
正文語種:中文
附件:光盤
附件數量:1

具體描述

編輯推薦

  

  隻需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寄存器中的值就會自動纍加,從而保證一直指嚮下一條指令所在的內存地址。
  說點題外話,JMP指令實際上是一個嚮EIP寄存器賦值的指令。JMP 0x1234這種寫法,CPU會解釋為MOV EIP,0x1234,並嚮EIP賦值。也就是說,這條指令其實是篡改瞭CPU記憶中下一條該執行的指令的地址,濛瞭CPU一把。這樣一來,CPU在讀取下一條指令時,就會去讀取0x1234這個地址中的指令。你看,這不就相當於是做瞭一個跳轉嗎?
  對瞭,如果你在匯編語言裏用MOV EIP,0x1234這種寫法是會齣錯的,還是不要嘗試的好。在匯編語言中,應該使用JMP 0x1234來代替MOV EIP,0x1234。
  如果在TSS中將EIP寄存器的值記錄下來,那麼當下次再返迴這個任務的時候,CPU就可以明白應該從哪裏讀取程序來運行瞭。
  按照常識,段寄存器應該是16位的纔對,可是在TSS數據結構中卻定義成瞭int(也就是DWORD)類型。我們可以大膽想象一下,說不定英特爾公司的人將來會把段寄存器變成32位的,這樣想想也挺有意思的呢(笑)。
  第4行的ldtr和iomap也和第1行的成員一樣,是有關任務設置的部分,因此在任務切換時不會被CPU寫入。也許你會想,那就和第1行一樣,暫時先忽略好瞭--但那可是絕對不行的!如果鬍亂賦值的話,任務就無法正常切換瞭,在這裏我們先將ldtr置為0,將iomap置為0x40000000就好瞭。
  關於TSS的話題暫且先告一段落,我們迴來繼續講任務切換的方法。要進行任務切換,其實還得用JMP指令。JMP指令分為兩種,隻改寫EIP的稱為near模式,同時改寫EIP和CS的稱為far模式,在此之前我們使用的JMP指令基本上都是near模式的。不記得CS是什麼瞭?CS就是代碼段(code segment)寄存器啦。
  說起來我們其實用過一次far模式的JMP指令,就在asmhead.nas的"bootpack啓動"的最後一句(見8.5節)。
  JMP DWORD 2*8:0x0000001b
  這條指令在嚮EIP存入0x1b的同時,將CS置為2*8(=16)。像這樣在JMP目標地址中帶冒號(:)的,就是far模式的JMP指令。
  如果一條JMP指令所指定的目標地址段不是可執行的代碼,而是TSS的話,CPU就不會執行通常的改寫EIP和CS的操作,而是將這條指令理解為任務切換。也就是說,CPU會切換到目標TSS所指定的任務,說白瞭,就是JMP到一個任務那裏去瞭。
  CPU每次執行帶有段地址的指令時,都會去確認一下GDT中的設置,以便判斷接下來要執行的JMP指令到底是普通的far-JMP,還是任務切換。也就是說,從匯編程序翻譯齣來的機器語言來看,普通的far-JMP和任務切換的far-JMP,指令本身是沒有任何區彆的。
  好瞭,枯燥的講解就到這裏,讓我們實際做一次任務切換吧。我們準備兩個任務:任務A和任務B,嘗試從A切換到B。
  首先,我們需要創建兩個TSS:任務A的TSS和任務B的TSS。
  本次的HariMain節選
  struct TSS32 tss_a, tss_b;
  嚮它們的ldtr和iomap分彆存入閤適的值。
  本次的HariMain節選
  tss_a.ldtr = 0;
  tss_a.iomap = 0x40000000;
  tss_b.ldtr = 0;
  tss_b.iomap = 0x40000000;
  接著將它們兩個在GDT中進行定義。
  本次的HariMain節選
  struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;
  set_segmdesc(gdt + 3, 103, (int) &tss;_a, AR_TSS32);
  set_segmdesc(gdt + 4, 103, (int) &tss;_b, AR_TSS32);
  將tss_a定義在gdt的3號,段長限製為103字節,tss_b也采用類似的定義。
  現在兩個TSS都創建好瞭,該進行實際的切換瞭。
  我們嚮TR寄存器存入3 * 8這個值,這是因為我們剛纔把當前運行的任務定義為GDT的3號。TR寄存器以前沒有提到過,它的作用是讓CPU記住當前正在運行哪一個任務。當進行任務切換的時候,TR寄存器的值也會自動變化,它的名字也就是"task register"(任務寄存器)的縮寫。我們每次給TR寄存器賦值的時候,必須把GDT的編號乘以8,因為英特爾公司就是這樣規定的。如果你有意見的話,可以打電話找英特爾的大叔投訴哦(笑)。
  給TR寄存器賦值需要使用LTR指令,不過用C語言做不到。唉,各位是不是都已經見怪不怪瞭啊?啥?你早就料到瞭?(笑)所以說,正如你所料,我們隻能把它寫進naskfunc.nas裏麵。
  本次的HariMain節選
  load_tr(3 * 8);
  本次的naskfunc.nas節選
  _load_tr: ; void load_tr(int tr);
  LTR [ESP+4] ; tr
  RET
  對瞭,LTR指令的作用隻是改變TR寄存器的值,因此執行瞭LTR指令並不會發生任務切換。
  要進行任務切換,我們必須執行far模式的跳轉指令,可惜far跳轉這事C語言還是無能為力,這種語言還真是不方便啊。沒辦法,這個函數我們也得在naskfunc.nas裏創建。
  本次的naskfunc.nas節選
  _taskswitch4: ; void taskswitch4(void);
  JMP 4*8:0
  RET
  也許有人會問,在JMP指令後麵寫個RET有意義嗎?也對,通常情況下確實沒意義,因為已經跳轉到彆的地方瞭嘛,後麵再寫什麼指令也不會被執行瞭。不過,用作任務切換的JMP指令卻不太一樣,在切換任務之後,再返迴這個任務的時候,程序會從這條JMP指令之後恢復運行,也就是執行JMP後麵的RET,從匯編語言函數返迴,繼續運行C語言主程序。
  另外,如果far-JMP指令是用作任務切換的話,地址段(冒號前麵的4*8的部分)要指嚮TSS這一點比較重要,而偏移量(冒號後麵的0的部分)並沒有什麼實際作用,會被忽略掉,一般來說像這樣寫0就可以瞭。
  現在我們需要在HariMain的某個地方來調用taskswitch(),可到底該寫在哪裏呢?唔,有瞭,就放在顯示"10[sec]"的語句後麵好瞭。也就是說,程序啓動10秒以後進行任務切換。
  本次的HariMain節選
  } else if (i == 10) { /* 10秒計時器*/
  putfonts8_asc_sht(sht_back, 0, 64, COL8_FFFFFF, COL8_008484, "10[sec]", 7);
  taskswitch4(); /*這裏! */
  } else if (i == 3) { /* 3秒計時器 */
  大功告成瞭?不對,我們還沒準備好tss_b呢。在任務切換的時候需要讀取tss_b的內容,因此我們得在TSS中定義好寄存器的初始值纔行。
  本次的HariMain節選
  tss_b.eip = (int) &task;_b_main;
  tss_b.eflags = 0x00000202; /* IF = 1; */
  tss_b.eax = 0;
  tss_b.ecx = 0;
  tss_b.edx = 0;
  tss_b.ebx = 0;
  tss_b.esp = task_b_esp;
  tss_b.ebp = 0;
  tss_b.esi = 0;
  tss_b.edi = 0;
  tss_b.es = 1 * 8;
  tss_b.cs = 2 * 8;
  tss_b.ss = 1 * 8;
  tss_b.ds = 1 * 8;
  tss_b.fs = 1 * 8;
  tss_b.gs = 1 * 8;
  乍看之下,貌似會有很多看不懂的地方吧,我們從後半段對寄存器賦值的地方開始看。這裏我們給cs置為GDT的2號,其他寄存器都置為GDT的1號,asmhead.nas的時候也是一樣的。也就是說,我們這次使用瞭和bootpack.c相同的地址段。當然,如果你用彆的地址段也沒問題,不過這次我們隻是想隨便做個任務切換的實驗而已,這種麻煩的事情還是以後再說吧。
  繼續看剩下的部分,關於eflags的賦值,如果把STI後的EFLAGS的值通過io_load_eflags賦給變量的話,該變量的值就顯示為0x00000202,因此在這裏就直接使用瞭這個值,僅此而已。如果還有看不懂的地方,大概就是eip和esp的部分瞭吧。
  在eip中,我們需要定義在切換到這個任務的時候,要從哪裏開始運行。在這裏我們先把task_b_main這個函數的內存地址賦值給它。
  本次的bootpack.c節選
  void task_b_main(void)
  {
  for (;;) { io_hlt(); }
  }
  這個函數隻執行瞭一個HLT,沒有任何實際作用,後麵我們會對它進行各種改造,現在就先這樣吧。
  task_b_esp是專門為任務B所定義的棧。有人可能會說,直接用任務A的棧不就好瞭嗎?那可不行,如果真這麼做的話,棧就會混成一團,程序也無法正常運行。
  本次的HariMain節選
  int task_b_esp;
  task_b_esp = memman_alloc_4k(memman, 64 * 1024) + 64 * 1024;
  總之先寫成這個樣子瞭。我們為任務B的棧分配瞭64KB的內存,並計算齣棧底的內存地址。請各位迴憶一下嚮棧PUSH數據(入棧)的動作,ESP中存入的應該棧末尾的地址,而不是棧開頭的地址。
  好瞭,我們已經講解得夠多瞭,現在總算是萬事俱備啦,馬上"make run"一下吧。這個程序如果運行正常的話應該是什麼樣子呢?嗯,啓動之後的10秒內,還是跟以前一樣的,10秒一到便執行任務切換,task_b_main開始運行。因為task_b_main隻有一句HLT,所以接下來程序就全部停止瞭,鼠標和鍵盤也應該都沒有反應瞭。
  唔……這樣看起來好像很無聊啊,算瞭,總之我們先來"make run"吧。10秒鍾的等待還真是漫長……哇!停瞭停瞭!
  看來我們的首次任務切換獲得瞭圓滿成功。
  ……

前言/序言

  “好想編寫一個操作係統呀!”筆者的朋友曾說這是所有程序員都曾經懷揣的一個夢想。說“所有的程序員”可能有點誇張瞭,不過作為程序員的夢想,它至少也應該能排進前十名吧。
  也許很多人覺得編寫操作係統是個天方夜譚,這一定是操作係統業界的一個陰謀(笑)。他們故意讓大傢相信編寫操作係統是一件非常睏難的事情,這樣就可以高價兜售自己開發的操作係統,而且操作係統的作者還會被頂禮膜拜。那麼實際情況又怎麼樣呢?和彆的程序相比,其實編寫操作係統並沒有那麼難,至少筆者的感覺是這樣。
  在各位讀者之中,也許有人曾經挑戰過操作係統的編寫,但因為太難而放棄瞭。擁有這樣經曆的人也許不會認同筆者的觀點。其實你錯瞭,你的失敗並不是因為編寫操作係統太難,而是因為沒有人告訴你那其實是一件很簡單的事而已。
  不僅是編寫操作係統,任何事都是一樣的。如果講解的人認為它很難,那就不可能把它講述得通俗易懂,即便是同樣的內容,也會講得無比復雜。這樣的講解,肯定是很難懂的。
  那麼,你想不想和筆者一起再挑戰一次呢?如果你曾經夢想過編寫自己的操作係統,一定會覺得樂在其中的。
  可能有人會說,這本書足足有700多頁,怎麼會“有趣”和“簡單”呢?唔,這麼一說筆者也覺得挺心虛的,不過其實也隻是長瞭那麼一點點啦。平均下來的話,每天隻有大約23頁的內容,你看,也沒有那麼長吧?
  這本書的文風非常輕鬆,也許你不知不覺中就會讀得很快。但是這樣的話可能印象不會很深,最好還是能靜下心來慢慢地讀。書中所展示的程序代碼和文字的說明同樣重要,因此也希望大傢仔細閱讀。隻要注意這些,理解本書的內容就應該沒有問題瞭。
  在本書中,我們使用C語言和匯編語言來編寫操作係統,不過不必擔心,你可以在閱讀本書的同時來逐步學習關於這些編程語言的知識。本書在這方麵寫得非常仔細,如果能有人通過本書終於把C語言中的指針給搞懂瞭,那筆者的目的也就達到瞭。即便是從這樣的水平開始,30天後你也能夠編寫齣一個很棒的操作係統,請大傢拭目以待吧!

《30天自製操作係統》(附光盤1張):開啓你的係統開發者之旅 這是一本旨在引領你踏入操作係統開發領域的實踐指南。本書以一種循序漸進、深入淺齣的方式,為你揭示操作係統的核心奧秘,並指導你親手構建一個屬於自己的操作係統。無論你是對計算機底層原理充滿好奇的學生,還是渴望突破技術瓶頸的開發者,亦或是希望深入理解現代計算架構的愛好者,本書都將是你開啓係統開發之旅的理想伴侶。 為什麼選擇自製操作係統? 在當今數字世界中,操作係統無處不在,支撐著我們日常使用的電腦、智能手機、服務器乃至嵌入式設備。然而,大多數人僅僅是操作係統的使用者,對其內部運作機製知之甚少。瞭解操作係統是如何工作的,不僅僅是滿足好奇心,更是對計算機科學核心概念的深刻理解。 通過親手構建一個操作係統,你將: 掌握底層原理: 深入理解 CPU 如何執行指令,內存如何管理,進程如何調度,以及設備如何與係統交互。這些知識是理解任何軟件係統運行基礎的關鍵。 提升編程技能: 你將大量接觸 C 語言、匯編語言,學習如何進行低級彆的內存操作、硬件訪問和並發編程。這些技能將極大提升你的編程功力。 培養解決問題的能力: 操作係統開發是一個充滿挑戰的過程,需要細緻的分析、嚴謹的邏輯和強大的調試能力。剋服這些挑戰將極大地鍛煉你的技術解決問題的能力。 拓展技術視野: 瞭解操作係統的工作原理,能讓你更好地理解各種應用軟件、編程語言、數據庫甚至網絡協議的設計與實現。 激發創新靈感: 掌握瞭操作係統的基礎,你將更有能力去設計和實現更高效、更安全的係統,甚至探索全新的計算範式。 本書內容概覽 本書將引導你從零開始,逐步構建一個功能相對完整的操作係統。整個過程被精心設計為 30 個階段(章節),確保學習的連貫性和可控性。以下是本書涵蓋的主要內容模塊,它們構成瞭你係統開發之旅的骨架: 第一部分:基礎準備與入門 第一章:踏入係統之門: 介紹操作係統的概念、曆史、分類以及其在現代計算中的重要性。我們將討論為什麼學習操作係統開發,以及本書的學習路徑和目標。 第二章:開發環境搭建: 詳細指導你配置必要的開發工具,包括交叉編譯器、匯編器、鏈接器、模擬器/虛擬機(如 QEMU)以及調試器。確保你擁有一個穩定高效的開發環境是後續學習的基礎。 第三章:匯編語言初步: 操作係統與硬件的交互離不開匯編語言。本章將介紹 x86 架構的匯編語言基礎,包括寄存器、指令集、尋址模式等,為後續的引導程序開發打下基礎。 第四章:實模式與保護模式: 瞭解 CPU 的工作模式至關重要。我們將深入講解實模式和保護模式的區彆與聯係,以及如何從實模式切換到保護模式,這是進入更廣闊的內存空間和啓用高級特性的關鍵一步。 第二部分:引導與核心組件 第五章:編寫你的第一個引導程序: 學習如何編寫一個能夠被 BIOS 加載並執行的簡單引導程序。這個程序雖然簡陋,卻是操作係統的起點,它負責初始化硬件,加載後續的操作係統內核。 第六章:加載操作係統內核: 探討引導程序如何將操作係統內核從磁盤加載到內存中,並將其控製權交給內核。我們將講解文件係統的基本概念,以及如何設計簡單的加載機製。 第七章:內存管理概覽: 內存是操作係統最重要的資源之一。本章將介紹物理內存和虛擬內存的概念,以及初步的內存分配與迴收策略。 第八章:保護模式下的內存管理: 在保護模式下,我們需要利用分頁機製來管理內存。本章將詳細講解分頁的工作原理,如何設置頁目錄和頁錶,以及實現基本的內存映射。 第三部分:進程與調度 第九章:中斷與異常處理: 中斷是操作係統響應外部事件和內部異常的關鍵機製。本章將講解中斷嚮量錶(IVT)和中斷描述符錶(IDT),並實現基本的中斷和異常處理程序。 第十章:鍵盤輸入處理: 學習如何通過中斷處理鍵盤輸入,將用戶的按鍵轉換為可用的字符數據,這是實現人機交互的第一步。 第十一章:進程的概念: 引入進程的概念,理解進程的生命周期、狀態轉換以及進程控製塊(PCB)的作用。 第十二章:簡單的進程調度: 實現一個簡單的進程調度算法(例如,先來先服務或循環輪轉)。你將學習如何管理多個進程,並在它們之間切換執行。 第四部分:用戶界麵與設備驅動 第十三章:圖形模式初探: 學習如何進入 VGA 圖形模式,並在屏幕上繪製像素點、綫條和簡單的圖形。這將為構建更友好的用戶界麵奠定基礎。 第十四章:文本模式下的用戶界麵: 在圖形模式尚未完善的情況下,我們將在文本模式下構建一個簡單的命令行界麵(CLI)。學習如何接收用戶輸入並顯示輸齣。 第十五章:時鍾中斷與定時器: 利用可編程間隔定時器(PIT)産生時鍾中斷,為實現更精確的進程調度和定時任務提供基礎。 第十六章:簡單的設備驅動模型: 介紹設備驅動的基本概念,以及如何編寫一個簡單的設備驅動,例如與顯示器或串行端口交互。 第五部分:文件係統與多任務 第十七章:文件係統基礎: 探討文件係統的作用,包括文件、目錄、inode 等概念。我們將設計一個簡單的文件係統結構。 第十八章:實現一個簡單的文件係統: 動手實現一個基礎的文件係統,支持文件的創建、讀取、寫入和刪除操作。 第十九章:多任務與上下文切換: 深入理解多任務的原理,並學習如何實現進程的上下文切換,使多個進程能夠並發執行。 第二十章:中斷和異常的深入: 迴顧中斷和異常處理,學習如何處理更復雜的異常情況,並優化中斷響應效率。 第六部分:係統調用與進階 第二十一章:係統調用接口: 設計並實現一個係統調用接口,允許用戶程序請求內核服務,例如文件操作、進程管理等。 第二十二章:用戶模式與內核模式: 區分用戶模式和內核模式,學習如何在兩種模式之間安全地進行切換。 第二十三章:內存保護與隔離: 進一步強化內存保護機製,確保用戶進程之間以及用戶進程與內核之間內存的隔離,防止非法訪問。 第二十四章:並發與同步: 學習並發編程中的挑戰,例如競態條件,並引入互斥鎖(mutex)等同步機製來解決這些問題。 第七部分:高級特性與優化 第二十五章:驅動編寫進階: 學習編寫更復雜的設備驅動,例如鼠標、硬盤等。 第二十六章:多處理器支持(可選): 如果時間允許,我們將簡要介紹多處理器(SMP)係統的概念,以及如何為多核 CPU 進行基本適配。 第二十七章:簡單的內存分配器: 設計並實現一個更高效的內存分配器,以滿足不斷增長的內存需求。 第二十八章:錯誤處理與調試技巧: 學習更高級的係統調試技巧,以及如何優雅地處理和報告係統錯誤。 第八部分:總結與展望 第二十九章:係統整閤與測試: 將前麵構建的各個模塊整閤起來,進行全麵的測試,確保係統的穩定性和功能性。 第三十章:未來的方嚮與學習資源: 總結本次操作係統開發之旅,展望未來可以深入研究的方嚮,並推薦相關的學習資源和社區。 附帶光盤內容 本書附帶的光盤不僅僅是一張存儲介質,更是你實踐的強大助手。光盤中包含: 完整的源代碼: 光盤中提供瞭本書所有章節代碼的完整實現,你可以直接下載、編譯和運行,作為學習和參考的寶貴資源。 開發工具鏈: 包含常用的交叉編譯工具鏈(如 GCC for i386-elf)等,方便你快速搭建開發環境,避免因工具安裝和配置帶來的睏擾。 模擬器鏡像: 預先配置好的 QEMU 虛擬機鏡像,你無需花費大量時間配置模擬器,即可快速啓動你構建的操作係統進行測試。 參考文檔與資料: 收集瞭與操作係統開發相關的技術文檔、規範和推薦閱讀列錶,幫助你進一步深入學習。 常見問題解答(FAQ): 整理瞭在操作係統開發過程中可能遇到的常見問題及其解決方案,為你排憂解難。 本書的特色 理論與實踐緊密結閤: 本書不僅講解操作係統的核心理論,更強調動手實踐。每一章都伴隨著具體的代碼實現,讓你在理論學習的同時,能夠立即看到成果。 循序漸進的學習路徑: 學習過程被分解為 30 個邏輯清晰的階段,從最基礎的匯編指令到復雜的進程調度和文件係統,層層遞進,確保學習的連貫性和可理解性。 貼近實際的開發環境: 使用當下流行的開源工具鏈和模擬器,讓你接觸到的開發環境與真實世界的嵌入式係統或小型機開發環境相似。 注重細節和易懂性: 作者在講解過程中,力求用最清晰的語言解釋復雜的概念,並輔以大量的圖示和代碼注釋,幫助讀者快速掌握。 為讀者賦能: 本書的目標是讓你真正理解操作係統的運作機製,掌握係統級開發的必備技能,並有能力根據自己的需求進行擴展和創新。 適閤讀者 計算機科學與技術專業的學生: 深入理解操作係統課程的理論知識,並通過實踐鞏固。 有 C 語言基礎的程序員: 渴望突破應用層開發,進入更底層的係統編程領域。 對計算機底層原理感興趣的愛好者: 想要揭開計算機神秘麵紗,瞭解“一切的根源”。 希望提升編程技能的開發者: 學習低級編程技巧,鍛煉嚴謹的邏輯思維和強大的問題解決能力。 嵌入式係統開發者: 瞭解操作係統如何與硬件交互,為開發嵌入式係統打下堅實基礎。 立即開始你的係統構建之旅! 《30天自製操作係統》將為你打開一扇通往計算機核心世界的大門。你將不再僅僅是用戶,而是可以親手塑造和控製這個數字世界的創造者。拿起這本書,插上光盤,讓你的操作係統開發之旅,從今天開始!

用戶評價

評分

我是一名已經工作多年的軟件工程師,雖然日常工作接觸的是應用層開發,但一直對操作係統的底層細節感到好奇,總覺得不把這一塊弄明白,對整個計算機體係的理解就不夠透徹。市麵上有些關於操作係統的書,動輒幾百頁,內容又晦澀難懂,看瞭幾頁就容易打退堂鼓。這本《30天自製操作係統》的齣現,恰好滿足瞭我這種“碎片化”學習的需求。它的篇幅不算特彆厚重,而且“30天”這個概念也給瞭一個明確的學習目標。更重要的是,書中以非常務實的態度,從最基礎的環節開始,一步步構建。我喜歡它那種“從小處著手,逐步完善”的思路,比如先實現一個簡單的屏幕輸齣,再引入鍵盤輸入,然後是中斷處理等等。光盤提供的資源更是錦上添花,可以直接拿來運行和調試,這對於理解抽象的概念非常有幫助。雖然30天要“完全”掌握所有細節可能有些難度,但這本書絕對是一個非常好的入門和實踐平颱,讓我能夠快速對操作係統的核心有瞭一個清晰的認識。

評分

我是一個對技術有著狂熱追求的業餘愛好者,一直夢想著能夠親手構建一個屬於自己的操作係統。然而,這條路充滿瞭挑戰,各種知識點像迷霧一樣籠罩著我。《30天自製操作係統》這本書,就像一束光,照亮瞭我前行的道路。它的語言風格非常接地氣,沒有過多的學術術語堆砌,而是用一種能夠被普通讀者理解的方式來解釋復雜的概念。書中的每一個步驟都經過精心設計,能夠引導讀者逐步攻剋難關。我最喜歡的部分是關於如何設計和實現內核的章節,作者用非常巧妙的比喻和圖示,將原本抽象的內核工作原理變得生動形象。光盤裏附帶的源代碼,更是讓我愛不釋手,我可以直接在虛擬機上運行,觀察它的行為,並嘗試進行修改,看看不同的參數設置會帶來什麼結果。通過這本書,我不僅學習到瞭操作係統的基本原理,還培養瞭解決實際問題的能力,更重要的是,我感受到瞭創造的樂趣。這本書絕對是每個有誌於自製操作係統的人必不可少的夥伴。

評分

這本書簡直是為我量身定做的!我是一名在校的計算機專業學生,一直在尋找能夠真正將理論知識付諸實踐的項目。傳統的操作係統課程雖然有講解,但總感覺缺少瞭那種“親手打造”的感覺。《30天自製操作係統》正是彌補瞭這一遺憾。它不僅僅是一本書,更像是一位經驗豐富的導師,耐心地引導我一步步探索操作係統的世界。我尤其欣賞書中對每一項技術的講解,比如如何編寫匯編語言的引導程序,如何理解CPU的執行流程,以及如何實現簡單的內存管理。這些內容雖然在其他教材中可能有所提及,但這本書將它們串聯起來,形成瞭一個完整的學習鏈條。光盤中的源代碼更是寶藏,我不僅可以運行它,還可以嘗試修改和擴展,看看不同的設計會帶來什麼樣的效果。通過這本書,我不僅鞏固瞭課堂上學到的知識,還學到瞭很多書本上沒有的實踐技巧。我甚至開始思考,如何將書中的一些模塊應用到我自己的課程設計項目中。

評分

說實話,當我拿到這本《30天自製操作係統》的時候,心裏是抱著一絲懷疑的。畢竟“30天”這個時限聽起來就很有挑戰性,我擔心它會為瞭趕進度而犧牲內容的深度。但事實證明,我的擔憂是多餘的。這本書的作者顯然對如何引導讀者學習有著深刻的理解。它並沒有試圖在一開始就構建一個功能齊全的復雜係統,而是從最核心、最關鍵的部分入手,逐步增加功能。這種“由簡入繁”的教學方法,讓我能夠專注於理解每個階段的核心概念。書中的案例設計也非常貼切,比如,在講解中斷處理時,作者會引導讀者實現一個簡單的鍵盤輸入響應,這比單純的理論講解要生動有趣得多。我特彆喜歡書中對一些常見誤區的提醒和解釋,這大大節省瞭我自己摸索的時間。光盤裏的資源也非常豐富,包含瞭不同階段的操作係統代碼,方便我對比和學習。雖然30天完成一個完整的操作係統可能需要付齣大量的努力和時間,但這本書提供瞭一個非常堅實的基礎和清晰的路徑,讓我看到瞭實現這個目標的可能性。

評分

這本書絕對是技術學習者的一場及時雨!我一直對操作係統底層運作原理充滿好奇,但市麵上很多書籍要麼過於理論化,要麼需要紮實的計算機體係結構基礎。這本《30天自製操作係統》的齣現,恰恰填補瞭這個空白。它以一種非常直觀、循序漸進的方式,帶領讀者一步步構建自己的操作係統。從最基礎的 bootloader 到內核的初始化,再到簡單的內存管理和任務調度,每一個章節都設計得恰到好處,不會讓人望而卻步。最讓我驚喜的是,它提供瞭配套的光盤,裏麵包含瞭大量的源代碼和調試工具,這對於動手實踐來說至關重要。我花瞭整整一個周末,跟著書裏的代碼一點點調試,看著自己的代碼在虛擬機裏運行起來,那種成就感是難以言喻的。書中的講解清晰易懂,即使是初學者也能理解其中的邏輯。而且,它並不是簡單地復製代碼,而是深入淺齣地解釋瞭每一行代碼的意義和作用,這對於建立深層次的理解非常有幫助。總的來說,這本書是一次非常棒的學習體驗,我強烈推薦給所有對操作係統感興趣的朋友。

評分

好好好好好好好好好好好好好好好好好好好好好好好

評分

搞活動時候買的 暫時還沒看 東西是正品 好評

評分

評分

作為入門書籍不錯,相比編譯原理主要是實踐多一點,另外小日本寫的書都講的很詳細

評分

東京大學&東京工業大學教授執筆

評分

不錯,有必要瞭解一下編程語言的執行過程

評分

爛書一本,韆萬彆買

評分

感覺日本人寫的技術書看起來就是通俗易懂

評分

給公司買的書 他們都很喜歡 質量非常好

相關圖書

本站所有內容均為互聯網搜尋引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度google,bing,sogou

© 2025 book.cndgn.com All Rights Reserved. 新城书站 版權所有