2008-10-20 86 views
13

我正在開發我正在開發的一個非常基本的內核的鍵盤輸入,並且我完全卡住了。我似乎無法在網上找到任何可以顯示我需要知道的信息的信息。x86組件上的受保護模式鍵盤訪問

我的內核現在正在保護模式下運行,所以我不能使用實模式鍵盤例程而不跳入實模式並返回,這是我試圖避免的。我希望能夠從保護模式訪問我的鍵盤。有誰知道如何做到這一點?到目前爲止,我發現的唯一一件事就是它涉及到直接使用輸入/輸出端口與控制器通話,但除此之外,我被困住了。這當然不是經常出現的東西。通常,彙編教程假設您正在運行下面的操作系統。

我對x86組件很陌生,所以我只是尋找一些好的資源來處理來自保護模式的標準硬件。我正在用NASM編譯彙編源代碼並將其鏈接到用DJGPP編譯的C源代碼。有什麼建議麼?

+0

嗨,我知道這是一個老問題,但你可以編輯你的問題的解決方案,或看看我的問題http://stackoverflow.com/questions/22744624/keyboard-interrupt-handler-for- own-kernel-c?謝謝 – 2014-03-30 14:26:35

回答

12

MIT operating systems class有很多很好的參考。特別是在鍵盤和鼠標編程上檢查出Adam Chapweske's resources

簡而言之,是的,您將使用原始輸入/輸出端口,這需要在內核模式下運行,或者在EFLAGS寄存器中設置I/O權限位(IOPL)。有關I/O權限的更多詳細信息,請參閱this page

+1

耶!由於這些頁面,我得到了它的工作。你太棒了,如果可以的話,我會投你10次。現在我只需要將掃描代碼轉換爲ASCII碼,但我可以這麼做,(另外,將掃描碼輸出到屏幕上看起來非常整齊!)謝謝! – 2008-10-20 18:51:21

+1

非常有用! – 2011-09-27 20:21:49

3

您可以在真實和受保護的模式下以相同的方式使用標準傳統硬件。在這種情況下,您需要在I/O端口0x60至0x6f處與8042進行通信,而這些端口又將與線路另一端的鍵盤內的控制器進行通信。

快速谷歌搜索發現我在http://heim.ifi.uio.no/~stanisls/helppc/8042.html(對於8042)和http://heim.ifi.uio.no/~stanisls/helppc/keyboard_commands.html(對於鍵盤)有趣的資源。如果你不習慣它,你可以通過IN(讀)和OUT(寫)操作碼來與I/O端口上的組件進行通信,這些操作碼接收I/O端口號(一個16位值)和要讀取或寫入的值(8,16或32位)。請注意,閱讀或書寫的尺寸很重要!將16位寫入需要8位(或相反)的內容是一種災難。習慣這些操作碼,因爲您將會使用它們(這是與某些外圍設備交談的唯一方式,包括幾個重要的外圍設備;其他外設使用內存映射I/O(MMIO)或總線主控DMA)。

0

8042 PS/2控制器看起來是最簡單的可能性。

的oszur11操作系統教程包含下https://sourceforge.net/p/oszur11/code/ci/master/tree/Chapter_06_Shell/04_Makepp/arch/i386/arch/devices/i8042.c

只是一個工作示例:

sudo apt-get install build-essential qemu 
sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu 
git clone git://git.code.sf.net/p/oszur11/code oszur11 
cd oszur11/Chapter_06_Shell/04_Makepp 
make qemu 

測試在Ubuntu 14.04 AMD64。

我的GitHub上鏡(上游無效):https://github.com/cirosantilli/oszur11-operating-system-examples

不在這裏重現它,因爲它的代碼過長,會如果我設法在一個小例子,鍵盤部分隔離更新。