我正在試圖破解一個內核的第一部分。我現在已經將整個內核編譯爲C代碼,並且我已經設法讓它在控制檯窗口中顯示文本以及所有這些優點。現在,我想開始接受鍵盤輸入,所以我實際上可以使用一些東西並開始進行流程管理。如何使用x86裸機組件獲得鍵盤輸入?
我正在使用DJGPP進行編譯,並使用GRUB加載。我還使用了一小段程序集,它基本上直接跳轉到我編譯的C代碼中,我從那裏開心。
我所做的所有研究似乎都指向了一個$ 0x16的ISR來讀取鍵盤緩衝區中的下一個字符。從我所知道的情況來看,這應該存儲在ah中的ASCII值,以及在al中存儲的密鑰代碼,或者這個效果。我試圖在內聯彙編中使用以下例程對其進行編碼:
char getc(void)
{
int output = 0;
//CRAZY VOODOO CODE
asm("xor %%ah, %%ah\n\t"
"int $0x16"
: "=a" (output)
: "a" (output)
:
);
return (char)output;
}
當調用此代碼時,內核立即崩潰。 (我在VirtualBox上運行它,我不覺得有必要在真正的硬件上嘗試一些基本的東西。)
現在我實際上有幾個問題。沒有人能夠告訴我是否(因爲我的代碼是從GRUB啓動的)我現在正在實模式或保護模式下運行。我還沒有做過這樣或那樣的跳躍,我打算以實模式運行,直到我設置了一個流程處理程序。
因此,假設我在真實模式下運行,我在做什麼錯誤,以及如何解決它?我只需要一個基本的getc例程,最好是非阻塞的,但如果谷歌幫助完成這個任務,我會感到厭煩。一旦我能做到這一點,我就可以從那裏完成剩下的工作。
我想我在這裏問的是,我在任何地方靠近正確的軌道?人們通常會如何在這個級別獲得鍵盤輸入?
編輯:OOhh ...所以我在保護模式下運行。這當然解釋了嘗試訪問真實模式功能的崩潰。
那麼我想我正在尋找如何從保護模式訪問鍵盤IO。我可以自己找到,但如果有人知道自由的話。再次感謝。
注意,只要你留在保護模式下,不長的模式,你應該能夠使用虛擬8086任務來執行BIOS中斷。 (原始鍵盤IO相對簡單,但直接與硬件接口可能更爲有用,正如@CesarB所建議的那樣)。 – bcat 2010-07-29 12:54:07