Tôi phải viết mã cho một hệ điều hành mà tôi có thể chạy một máy tính. Nó giống như một máy tính để bàn. Đối với điều này tôi đang đọc brokenthorn operating development series Tôi đã hoàn thành second stage of bootloader Trình tải khởi động ở chế độ thực. Sau đó tác giả giải thích chế độ được bảo vệ. Tôi không muốn sử dụng chế độ được bảo vệ. Tôi không có thời gian cho việc đó. Vì vậy, tôi muốn viết các calculater trong chế độ thực bằng cách sử dụng bios ngắt. Có thể không? Tôi nghĩ rằng nó có thể được viết trên giai đoạn thứ hai của bộ nạp khởi động (tôi không chắc chắn.) Có nghĩa là tôi không phải sử dụng một hạt nhân (tôi không chắc chắn). Tôi không biết cách sử dụng các ngắt BIOS để xử lý bàn phím. Ai có thể cung cấp cho tôi một liên kết mà sẽ giúp tôi trong này? Và nếu bất cứ điều gì sai trái trong những gì tôi giả định ở trên là sai, xin vui lòng sửa tôi. Cảm ơn trước.Làm thế nào để xử lý bàn phím trong chế độ thực thông qua các ngắt BIOS?
Trả lời
Nếu bạn muốn sử dụng các dịch vụ bàn phím BIOS cấp cao, thay vì tự xử lý các ngắt bàn phím, thì INT 16h
là những gì bạn muốn.
INT 16h
với AH=00h
hoặc 10h
sẽ chặn chờ bấm phím (trả về kết quả ASCII AL
); sử dụng AH=01h
hoặc 11h
để truy vấn xem có nhấn phím lần đầu tiên không nếu bạn muốn tránh chặn (trả về ngay lập tức với ZF
rõ ràng nếu có khóa hay đặt nếu không). Xem ví dụ here hoặc here (hoặc Google "INT 16h" để biết thêm).
Xin lỗi, thưa ngài - bất kỳ ý tưởng làm thế nào để đi về "xử lý các bàn phím ngắt chính mình" mà không có dịch vụ bios cấp cao?Những nhược điểm của việc sử dụng dịch vụ cao cấp như thế nào? Hiệu suất có tồi tệ hơn không? – travisjayday
Bạn có thể xử lý IRQ 1 (ánh xạ tới ngắt 9 bằng bộ điều khiển x86) và đọc các phím từ cổng 60h
.
Xem http://inglorion.net/documents/tutorials/x86ostut/keyboard/.
-1. Nó không phải là IRQ 9, đó là IRQ 1: http://www.webopedia.com/quick_ref/IRQnumbers.asp. IRQ 9 có sẵn cho các thiết bị chung khác như thiết bị PCI. IRQ1 là bàn phím ngắt. – Matt
@Matt, từ liên kết trong câu trả lời của tôi: 'Bộ điều khiển bàn phím sử dụng IRQ 1. Bộ điều khiển ngắt x86 ánh xạ điều này để ngắt 9, do đó nhận được IRQ từ bộ điều khiển bàn phím có cùng tác dụng như thực thi int 9.' –
Nếu PIC không được ánh xạ lại và bạn không sử dụng IOAPIC, nó giống như thực thi INTERRUPT 9 (được chồng chéo với ngoại lệ CPU NPX_OVERRUN, không phải là trình xử lý IRQ9). Mặc dù ánh xạ giữa các IRQ và các ngắt có thể cấu hình được, IRQ9 không bao giờ == IRQ1. Thật vậy, từ liên kết của riêng bạn: 'Bộ điều khiển bàn phím sử dụng IRQ 1'. Vì tất cả các hệ điều hành sẽ remap PIC nên IRQ không chồng chéo các ngoại lệ của CPU, câu trả lời của bạn sẽ tốt hơn nếu chỉ nói rằng bàn phím sử dụng IRQ1. – Matt
Minimal boot Gas ngành BIOS dụ:
.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
Biên dịch và chạy:
as -o main.o main.S
ld --oformat binary -o main.img -Ttext 0x7C00 main.o
qemu-system-i386 -hda main.img
Hoặc chỉ cần sao chép this repository và chạy make run RUN=bios_keyboard
.
Sau đó, khi bạn nhập một ký tự, nó sẽ được in ra màn hình.
Thử nghiệm trên Ubuntu 14.04 AMD64, Binutils 2.24, QEMU 2.0.0 và trên phần cứng thực tế Lenovo Thinkpad T400.
Sự cố có thể xảy ra với mã của bạn là bạn giả định rằng bạn có phân đoạn ngăn xếp hợp lệ (SS) và con trỏ ngăn xếp (SP). Các ngắt BIOS yêu cầu không gian ngăn xếp, do đó, thực hành tốt là thiết lập một 'SS' và' SP' hợp lệ trước khi thực hiện các cuộc gọi BIOS. Bạn không thể thực sự dựa vào trạng thái của các thanh ghi phân đoạn theo thời gian BIOS nhảy vào mã của bạn được nạp từ khu vực khởi động. Môi trường mô phỏng và VM thường loại bỏ mọi thứ ở trạng thái hợp lệ, nhưng trên một số phần cứng thực sự không phải lúc nào cũng như vậy. –
@MichaelPetch cảm ơn thông tin! Tôi sẽ nhìn vào nó. Tôi nên đặt chúng thành gì? Đối với 'SP', bất kỳ bộ nhớ nào cao trên 0x7C00 đều ổn, hoặc có giá trị cụ thể hơn hay không? 'SS' đến 0 tôi giả sử. –
Mọi thứ có thể sử dụng đều tốt nhưng tôi thường tránh xa bất kỳ thứ gì nhỏ hơn 0x0000: 0x1000 trở xuống. Bạn có thể đặt phân đoạn ngăn xếp ngay dưới 0x0000: 0x7C00 (Thông thường những gì tôi đã làm trong quá khứ) –
- 1. Số trang trong BIOS ngắt
- 2. Xử lý bàn phím WP8
- 3. Làm thế nào để xử lý các sự kiện từ bàn phím và chuột trong chế độ độc quyền toàn màn hình trong java?
- 4. Làm cách nào để ghi đè ngắt bàn phím? (Python)
- 5. Bàn phím xử lý Đã nhấn sự kiện trên Iphone
- 6. Làm thế nào để xử lý một dòng mới như ngắt dòng thực trong PHP Markdown?
- 7. Xử lý ngắt trong Windows
- 8. Đóng tất cả các chủ đề bằng bàn phím ngắt
- 9. Làm thế nào để xử lý các phím "thứ yếu" trong Entity Framework
- 10. Đối tượng truyền qua Django từ chế độ xem tiếp theo để xử lý
- 11. Vấn đề với xử lý tín hiệu, xử lý ngắt
- 12. Làm thế nào để kích hoạt hoặc mô phỏng ngắt bàn phím?
- 13. Đặt Chế độ bàn phím trong bàn phím tùy chỉnh Android
- 14. Các ngắt được xử lý như thế nào trên SMP?
- 15. Các ngắt bị xử lý bởi các máy xử lý kép như thế nào?
- 16. Thêm/xóa các ngôn ngữ bàn phím thông qua .bat
- 17. Làm cách nào để hiển thị chế độ xem bộ chọn giống như bàn phím?
- 18. Độ dài cắt thông qua việc xử lý tập tin
- 19. xử lý các liên kết trong chế độ xem web
- 20. Xử lý các tệp chế độ org trong python
- 21. Bàn phím iphone không có chế độ xem văn bản
- 22. Làm thế nào để xử lý autorotation trong AVCaptureVideoPreviewLayer?
- 23. Cách thêm chế độ xem trên đầu bàn phím?
- 24. Xử lý đầu vào bàn phím hiệu quả
- 25. Làm thế nào để chơi âm thanh bấm bàn phím trong bàn phím tùy chỉnh?
- 26. Làm thế nào để đọc các mã khóa của Bàn phím USB với Phím Phương tiện
- 27. Thêm Bàn phím Binding vào Chế độ Emacs Hiện tại
- 28. Mô phỏng ngắt bàn phím Ctrl-C trong Python khi đang làm việc trong Linux
- 29. Làm thế nào để hệ thống xử lý Java ngắt như Ctrl + C
- 30. Phím bàn phím không hoạt động trong chrome.app khi ở chế độ toàn màn hình
Bạn sẽ thấy [PC Interrupts] [1] là một công cụ vô giá. Bạn có thể lấy nó tại liên kết cho <$ 4.00. [1]: http://www.amazon.com/PC-Interrupts-Programmers-Reference-Third-Party/dp/0201624850 – Tergiver