2010-11-06 106 views
5

我必須編寫一個可以運行計算器的操作系統。它就像桌面計算器一樣。爲此,我正在閱讀brokenthorn operating development series我已完成second stage of bootloader引導加載程序處於實模式。在此之後,作者正在解釋保護模式。我不想使用保護模式。我沒有時間。所以我想通過使用bios中斷來以實模式編寫計算器。可能嗎?我認爲它可以寫在引導程序的第二階段(我不確定)。意思是我不必使用內核(我不確定)。我不知道如何使用BIOS中斷來處理鍵盤。任何人都可以給我一個鏈接,這將有助於我嗎?如果我認爲上述錯誤是錯誤的,請糾正我。提前感謝。如何通過BIOS中斷在實模式下處理鍵盤?

+0

你會發現[PC中斷] [1]是一個非常寶貴的工具。你可以在<$ 4.00的鏈接上找到它。 [1]:http://www.amazon.com/PC-Interrupts-Programmers-Reference-Third-Party/dp/0201624850 – Tergiver 2010-11-06 14:58:04

回答

7

如果您想要使用高級別的BIOS鍵盤服務,而不是自己處理鍵盤中斷,那麼INT 16h就是您想要的。

INT 16hAH=00h10h將阻止等待按鍵(返回ASCII結果AL);使用AH=01h11h來查詢如果您想避免阻塞(如果有密鑰可用,則立即返回ZF或者如果不可用則設置爲明確),則先查詢按鍵是否可用。見例如herehere(或谷歌「INT 16h」更多)。

+0

赦免,好的先生 - 任何想法如何在沒有高級別BIOS服務的情況下「處理鍵盤自己中斷」?使用這種高級服務有什麼缺點?表現更糟? – travisjayday 2017-08-16 20:45:08

3

您可以處理IRQ 1(由x86控制器映射到中斷9)並從端口60h讀取密鑰。

參見http://inglorion.net/documents/tutorials/x86ostut/keyboard/

+0

-1。這不是IRQ 9,它是IRQ 1:http://www.webopedia.com/quick_ref/IRQnumbers.asp。 IRQ 9適用於通用的其他設備,如PCI設備。 IRQ1是鍵盤中斷。 – Matt 2014-01-14 00:46:49

+0

@Matt,來自我的答案中的鏈接:'鍵盤控制器使用IRQ 1. x86中斷控制器將其映射到中斷9,因此從鍵盤控制器接收IRQ與執行int 9具有相同的效果.' – 2014-01-14 07:51:53

+0

如果PIC不會被重新映射,並且您沒有使用IOAPIC,這與執行INTERRUPT 9(與NPX_OVERRUN CPU異常,而不是IRQ9處理程序重疊)相同。雖然IRQ和中斷之間的映射是可配置的,但IRQ9永遠不會== IRQ1。事實上,從你自己的鏈接:'鍵盤控制器使用IRQ 1'。由於所有操作系統都會重新映射PIC,所以IRQ不會與CPU異常重疊,因此您的答案應該只是說鍵盤使用IRQ1。 – Matt 2014-01-14 13:56:29

1

最小氣的引導扇區BIOS例如:

.code16 
.global _start 
_start: 
cli 

/* Set SS and SP as they may get used by BIOS calls. */ 
xor %ax, %ax 
mov %ax, %ss 
mov 0x0000, %sp 

/* Get input to %al */ 
mov $0x00, %ah 
int $0x16 

/* Print the input from %al */ 
mov $0x0E, %ah 
int $0x10 

hlt 

.org 510 
.word 0xaa55 

編譯並運行:

as -o main.o main.S 
ld --oformat binary -o main.img -Ttext 0x7C00 main.o 
qemu-system-i386 -hda main.img 

或者只是克隆this repository和運行make run RUN=bios_keyboard

然後當你輸入一個字符時,它會被打印到屏幕上。

在Ubuntu 14.04 AMD64,Binutils 2.24,QEMU 2.0.0和真實硬件Lenovo Thinkpad T400上進行測試。

+0

您的代碼可能存在的問題是您假設您有一個有效的堆棧段(SS)和堆棧指針(SP)。 BIOS中斷需要堆棧空間,因此在發出BIOS調用之前設置有效的「SS」和「SP」是一種很好的做法。在BIOS跳轉到從引導扇區加載的代碼時,您無法真正依賴段寄存器的狀態。模擬和虛擬機環境往往會讓事情處於有效狀態,但在一些真實的硬件上並非總是如此。 – 2015-09-20 18:00:59

+0

@MichaelPetch感謝您的信息!我會仔細看看的。我應該怎樣設置它們?對於'SP',任何高於0x7C00的內存都很好,還是有更好的更具體的值?我猜想'SS'爲0。 – 2015-09-20 18:07:02

+0

任何可用的都很好,但我通常遠離小於0x0000:0x1000及以下。你可以把堆棧段放在0x0000以下:0x7C00(通常我以前做過的) – 2015-09-20 18:09:44