2012-04-29 97 views
14

我正在編寫一個小內核,只是爲了在低層次的東西上徘徊一下。現在,它在Virtual Box中啓動,我可以在屏幕上顯示文本,分配一些內存以及其他非常基本的東西。它是用C++編寫的,有點asm。(編寫內核)如何修改中斷描述符表?

有一個問題我想探索的東西背後的多任務機制。據我所知,它是這樣的:

  1. 內核初始化中斷描述符表,使中斷週期性發出(例如毫秒),並調用內核定義的程序。
  2. 當程序被調用,它可以決定設置的代碼/數據段和堆棧指針的那些另一個程序的上下文中,的「上下文切換」。

所以,它在概念上看起來很簡單,但我知道細節會變得更加多毛。我發現了一些在線的東西,但是術語差別很大,並且這些示例似乎來自我沒有的上下文(例如來自Linux內核)。

然而,設置描述符表的方式似乎是這樣的:

  1. 一些數據發送到PIC(outb和什麼,而不是)來初始化它。
  2. 準備中斷表在內存中,與函數指針到你想要的,小心的功能是能夠被信號處理程序例程。
  3. lidt加載表格。

但是,我無法找到很多具體的做這些事情,或者這是否是正確的。有沒有人有困惑的內核作家資源?

+0

有趣的問題,這裏是一個很酷的社區:http://www.osdever.net/不是它直接回答你的問題,但有一些有用的信息。 – 2012-04-29 04:51:29

+0

在osdev.org上可以找到更好的社區(包括論壇和wiki,以及種類相關的irc頻道 - #osdev @ irc.freenode.net)。 – Griwes 2012-04-29 13:14:06

回答

6

當你的電腦開機時,BIOS程序的PIC在這樣一種方式,通過IRQ0 IRQ15必然會通過INT的0Fh至中間體8,通過INT 77H 70H詮釋。這對於實際地址模式而言是正常的,在該模式下BIOS運行並且MSDOS工作。

但你需要改變這種映射切換到保護模式時,因爲一些重要的例外通過INT的0Fh(最值得注意的是,#GP,#SS,#PF)是在中間體8。您需要這樣做,因爲您希望能夠輕鬆地區分這些異常和來自定時器和實時時鐘,鍵盤和鼠標,磁盤和I/O端口(串行和並行)的硬件中斷。

這可能是你已經列出的第一步。所以,在線查看「PIC中斷重映射」或類似的東西。此外,請下載8259芯片(PIC)的一些規格,以更好地瞭解您正在做什麼以及它的實際工作方式。 「HelpPC」是一個很好的舊參考資料,其中包含各種PC硬件上的一些信息。

還有「PCGPE」(PC遊戲編程百科全書)和「RBIL」(Ralf Brown的中斷列表),可能會有很大幫助。

英特爾和AMD CPU文檔中介紹了IVT/IDT設置。它在那裏。不是最愉快的閱讀,但最詳細和權威。

有許多家庭釀造操作系統愛好者等網站,你可以找到更多的細節和代碼片段。

+0

我確實看到過一些重映射代碼。所以,我可能會誤解有關受保護和實模式的細節,但據我瞭解,內核以實模式運行,但可以在用戶程序運行時切換到保護模式。但是,在上下文切換時不會切換到實模式嗎?這是通過中斷完成的,對吧?在受保護的程序運行之前,中斷是否需要重新映射一次? – rovaughn 2012-04-29 16:22:26

+0

通常情況下,如果有任何切換,它是從真實到受保護的,並且只有在內核啓動時纔會執行一次。 – 2012-04-29 22:35:01

6

這個問題的答案太大了,不適合這裏。我會建議兩個資源,這將給你必要的知識:

  • JamesM's kernel development tutorial將引導你開發一個非常基本的內核,涵蓋了這一點。你需要特別注意第4章和第5章。它帶有完整的代碼。
  • OSDev.org參考資料。包含您需要的所有技術信息。比教程更詳細和更精確。

如果你真的想了解這些東西,我建議你閱讀OSDev中的文章,試着自己寫一切。從引導,屏幕輸出,圖片和irq處理開始。如果卡住了,請使用本教程。

+0

詹姆斯莫洛伊的教程非常好,但不應該推薦給新手,因爲它讓太多代碼被複制粘貼,沒有太多解釋 - 當JamesM發佈新系列時,它可能會改變。對於新手來說,www.brokenthorn.com上的教程要好得多。 – Griwes 2012-04-29 13:16:31