我必須編寫一個可以運行計算器的操作系統。它就像桌面計算器一樣。爲此,我正在閱讀brokenthorn operating development series我已完成second stage of bootloader引導加載程序處於實模式。在此之後,作者正在解釋保護模式。我不想使用保護模式。我沒有時間。所以我想通過使用bios中斷來以實模式編寫計算器。可能嗎?我認爲它可以寫在引導程序的第二階段(我不確定)。意思是我不必使用內核(我不確定)。我不知道如何使用BIOS中斷來處理鍵盤。任何人都可以給我一個鏈接,這將有助於我嗎?如果我認爲上述錯誤是錯誤的,請糾正我。提前感謝。如何通過BIOS中斷在實模式下處理鍵盤?
回答
如果您想要使用高級別的BIOS鍵盤服務,而不是自己處理鍵盤中斷,那麼INT 16h
就是您想要的。
INT 16h
與AH=00h
或10h
將阻止等待按鍵(返回ASCII結果AL
);使用AH=01h
或11h
來查詢如果您想避免阻塞(如果有密鑰可用,則立即返回ZF
或者如果不可用則設置爲明確),則先查詢按鍵是否可用。見例如here或here(或谷歌「INT 16h」更多)。
赦免,好的先生 - 任何想法如何在沒有高級別BIOS服務的情況下「處理鍵盤自己中斷」?使用這種高級服務有什麼缺點?表現更糟? – travisjayday 2017-08-16 20:45:08
您可以處理IRQ 1(由x86控制器映射到中斷9)並從端口60h
讀取密鑰。
參見http://inglorion.net/documents/tutorials/x86ostut/keyboard/。
-1。這不是IRQ 9,它是IRQ 1:http://www.webopedia.com/quick_ref/IRQnumbers.asp。 IRQ 9適用於通用的其他設備,如PCI設備。 IRQ1是鍵盤中斷。 – Matt 2014-01-14 00:46:49
@Matt,來自我的答案中的鏈接:'鍵盤控制器使用IRQ 1. x86中斷控制器將其映射到中斷9,因此從鍵盤控制器接收IRQ與執行int 9具有相同的效果.' – 2014-01-14 07:51:53
如果PIC不會被重新映射,並且您沒有使用IOAPIC,這與執行INTERRUPT 9(與NPX_OVERRUN CPU異常,而不是IRQ9處理程序重疊)相同。雖然IRQ和中斷之間的映射是可配置的,但IRQ9永遠不會== IRQ1。事實上,從你自己的鏈接:'鍵盤控制器使用IRQ 1'。由於所有操作系統都會重新映射PIC,所以IRQ不會與CPU異常重疊,因此您的答案應該只是說鍵盤使用IRQ1。 – Matt 2014-01-14 13:56:29
最小氣的引導扇區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上進行測試。
您的代碼可能存在的問題是您假設您有一個有效的堆棧段(SS)和堆棧指針(SP)。 BIOS中斷需要堆棧空間,因此在發出BIOS調用之前設置有效的「SS」和「SP」是一種很好的做法。在BIOS跳轉到從引導扇區加載的代碼時,您無法真正依賴段寄存器的狀態。模擬和虛擬機環境往往會讓事情處於有效狀態,但在一些真實的硬件上並非總是如此。 – 2015-09-20 18:00:59
@MichaelPetch感謝您的信息!我會仔細看看的。我應該怎樣設置它們?對於'SP',任何高於0x7C00的內存都很好,還是有更好的更具體的值?我猜想'SS'爲0。 – 2015-09-20 18:07:02
任何可用的都很好,但我通常遠離小於0x0000:0x1000及以下。你可以把堆棧段放在0x0000以下:0x7C00(通常我以前做過的) – 2015-09-20 18:09:44
- 1. Perl處理鍵盤中斷
- 2. 如何通過鍵盤,但下UIAlertView中
- 3. 用Turbo C++ 3.0處理鍵盤中斷
- 4. 鍵盤中斷處理火一次
- 5. bios和實模式
- 6. 如何判斷軟鍵盤是否處於提取模式?
- 7. 保護模式中的BIOS中斷
- 8. 其流式處理鍵盤
- 9. 如何在硬盤與BIOS寫中斷13H
- 10. 如何在UIViewController中處理鍵盤快捷方式
- 11. 如何通過鍵盤中斷來解決問題?
- 12. 如何在VS2008中通過鍵盤上下滾動
- 13. BIOS中斷_int86
- 14. 鍵盤中斷
- 15. 通過鍵盤
- 16. 在DOS下使用程序集在x86實模式下設置和重置鍵盤中斷服務例程
- 17. 處理異步zmq中的鍵盤中斷
- 18. python的多處理池中的鍵盤中斷
- 19. 如何處理ipad的UITextView鍵盤
- 20. 如何從C++程序修改鍵盤中斷(在Windows XP下)?
- 21. 在EFI模式下啓動是否意味着我無法訪問BIOS中斷?
- 22. 在python中處理鍵盤事件
- 23. 如何在全屏模式下啓用鍵盤輸入?
- 24. tkinter鍵盤中斷不處理,直到tkinter框架提出
- 25. 如何判斷Linux下哪些磁盤將被BIOS使用來啓動?
- 26. 病毒如何通過安裝在中斷處理程序中繞過檢測?
- 27. 鍵盤中斷 - PYTHON
- 28. Django鍵盤中斷
- 29. 如何通過Android Studio中的斷點進行處理?
- 30. 模擬鍵盤與織物中斷
你會發現[PC中斷] [1]是一個非常寶貴的工具。你可以在<$ 4.00的鏈接上找到它。 [1]:http://www.amazon.com/PC-Interrupts-Programmers-Reference-Third-Party/dp/0201624850 – Tergiver 2010-11-06 14:58:04