#:訓練訓練課程以建立操作系統。從頭開始,僅使用AMD和Intel的資源。
仍處於alpha舞台
該存儲庫尚未拋光,在Alpha階段仍然必須考慮。該代碼應該編譯和工作,但是發短信只是我在編碼和研究時提到的初稿。
與其他教程有什麼不同?
那裡有很多教程,我提出的很大一部分也涵蓋了那裡。那為什麼要打擾呢?我特別喜歡並受到這些的啟發:
- 菲爾·托多(Phil Todo):鏈接
- Intermezzos:todo:鏈接
這個版本有什麼不同?當我學習新事物時,我常常會感覺到我不知道/學習如何在下一次完全自己做的事情。我不知道這是我學習的方式還是在編寫教程時很容易省略的典型事情。這是我想定期想知道的一些觀點(我可能會錯過其他必要的東西來彌補這一點)
- 提供一些更多細節,詳細說明什麼是一致的約定,什麼是標準,什麼是體系結構。我仍然記得當我少年時期開始學習編程時,我就像是“嗯……計算機怎麼知道主要的功能必須首先稱為“功能”,而我的朋友或老師都不是新的。那隻是“魔術”。這些事情困擾著我,我想去一切。
- 指向標準並從那里工作。我不會提出您僅複製的完成解決方案。我們採用標準,實際上查找事項。就像我們想在ARM皮層而不是您的X86_64機器上運行代碼一樣,我們必須這樣做。或者,構圖不同,如果我們將是第一個編寫教程的人,我們將如何使該引導程序運行,中斷或CPU首先進入64位模式怎麼辦?
- 做兩次。我會首先走對準則,這有助於了解正在發生的事情,然後我們使用工具避免每次進行地面工作。
- 中間步驟和“檢查點”
- 首先給出大綱 - >查看大圖
- 將示例列入真實代碼 - >例如,第一個內核箱實際上是Linux的構建方式
- 我們開始使用的每個
dependency的替代方案/選擇。對我來說,如果我想遵循一個教程,並且許多外部圖書館都會做我真正想學習的魔力,那真是令人沮喪。
大綱
我想做的事情的粗略輪廓。希望以或多或少的時間順序。關鍵是我們可以做很多事情,以至於實際上很難選擇一條路徑。
首先,我想更好地了解啟動過程。在引導加載程序跳入之前會發生什麼。實際上滾動自己的引導加載程序(鏈接到OSDEV)本身就是一項巨大的任務。
我的計劃是稍微探索啟動過程中的早期階段。這樣做的目的是了解並欣賞引導加載程序為我們做的事情。最後,我想對不同的處理器模式,它們提供的內容以及如何切換到32位保護模式有一個粗略的了解。具體的目標是能夠切換到受保護的模式並打印Hello World!到屏幕。在彙編中實現的所有內容,不使用引導加載器。
之後,我計劃切換並使用grub作為引導加載程序。並從那裡繼續。
tl; dr
- 寫一個最小的可啟動圖像。
- 以16位實際模式打印
Hello World引導加載程序。 - 手動切換到32桿保護模式並打印
Hello World 。 - 手動切換到64箱長模式
- 使用grub作為引導程序,並打印
Hello World 。 - 切換到長模式(再次)。
- 跳入
C ,打印Hello World 。 - 堆
- 實現VGA視頻驅動程序。
- 中斷(第1部分) - 在ASM中告訴CPU在哪裡可以找到處理程序
- 中斷(第2部分) - 將代碼從10。移動到C
- 實施更好的處理程序
- 偵錯
- 處理中斷/異常
- 實現內存分頁。
- 重新映射內核
未指定:
後來...
- 文件系統
- 過程
- 調度
- 系統調用
- 探索堆棧,引發堆棧溢出和異常
- 通過UART與GDB連接(用於調試和嵌入式預覽)
- 跨編譯到手臂處理器的某些(或多個)零件。 (我有一個STM和Infineon板,閒置了)
預先Quesits?
沒有任何。說真的,不要害怕。本教程的全部目的是從頭開始發展所有必需的知識。我假設只有一個條件,那就是您可以進行適當的編程。到了不錯的情況,我的意思是您至少已經聽說過堆棧和堆,並且可以用某種語言提高效率。我想那應該足夠了。畢竟,我們並不是在嘗試在這裡開發下一個一代主流操作系統,而是在業餘愛好層面上進行修補。
我可以向您保證的一件事:即使您永遠不會再觸摸此代碼,也永遠不會寫OS。體驗將改變您對正在進行的系統的理解。從內核水平的發展中獲得的知識在您的職業生涯中傳播,例如種子,而洞察力將在最出乎意料的時刻被證明是有用的。
刮擦板(從這裡進行無組織的想法)
想法
- 如果您在第一個512字節之後放置說明,CPU會怎麼辦?他們被執行嗎? (CPU處於16位實際模式)
大綱
- 引導加載 - >兩個選擇滾動或使用現有的,例如grub。
- 16位模式
- 輸入32位保護模式
- 輸入64位長模式
- 輸入c
- 編寫內存管理器模塊
週期0-環境與跨補償工具鏈
- 您可以跳過一些步驟。在開始編寫C代碼之前,我們不需要交叉彙編工具鏈。
- 開始在$ home下的某個地方構建工具鏈
- 確保環境變量的範圍正確
- 諸如“沒有權限創建目錄
/usr/lib/i686-elf ”之類的錯誤表示$PREFIX未正確設置。 - 我們沒有得到“真正的”準骨CPU,我們面前仍然有BIOS。它以實際模式初始化CPU並用CPU交給我們。
週期0-引導加載程序
資源
- nasm文檔https://www.nasm.us/xdoc/2.14.02/html/nasmdoc3.html
- 英特爾手冊