2010-11-06 31 views
5

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?

+0

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

Trả lời

7

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).

+0

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

3

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/.

+0

-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

+0

@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.' –

+0

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

1

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.

+0

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. –

+0

@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ử. –

+0

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ứ) –

Các vấn đề liên quan