2009-07-22 25 views
19

Khoảng 15 năm trước, tôi đã sử dụng để giải trí cho bản thân mình và làm phiền giáo viên CS của tôi bằng cách viết mã xấu có thể sửa đổi trực tiếp văn bản trên màn hình. Điều này là/được thực hiện dễ dàng bằng cách truy cập bộ nhớ video tại 0xB8000 trên các thiết bị tương thích với PC được trang bị VGA.Bộ đệm video văn bản ở đâu nếu nó không ở 0xB8000?

Nhanh chóng chuyển tiếp đến hôm nay, tôi đã quyết định thử mẹo cũ của mình thông qua một cổng gỡ lỗi cho phép tôi truy cập để đọc bộ nhớ vật lý. Để hài lòng của tôi, nó vẫn làm việc trên nền tảng đầu tiên tôi đã thử nó trên. Sau đó, chán nản, tôi phát hiện ra rằng nó không hoạt động trên nhiều hệ thống khác. Có vẻ như các hệ thống không hoạt động trên tất cả đều có đồ họa UMA (bộ nhớ chia sẻ).

Vì vậy, một câu hỏi dành cho tất cả các nhà biên soạn BIOS, người dùng hệ điều hành cấp thấp và người điều khiển video - nếu tôi ở dạng văn bản màu 80x25 thường xuyên trên một hệ thống tương thích với PC. và nội dung của 0xb8000 - 0xB8FFF là tất cả 0xFF thay vì cho tôi cái gì trên màn hình, bộ đệm màn hình đi đâu?

+0

Chỉ cần xác nhận, bạn đang ở chế độ thực sự thực sự chứ không phải bảng điều khiển "DOS" chạy trên Windows, đúng không? – David

+3

Chế độ thực, trung thực đến thực tế (đó là màn hình thiết lập BIOS mà tôi đang chụp). –

Trả lời

13

Ah, nếu đó là màn hình BIOS thì tất cả các phiên cược sẽ bị tắt. Thực tế là nó là một BIOS trên một bo mạch chủ với đồ họa tích hợp giúp mọi thứ thậm chí còn có lợi hơn về sự kỳ lạ của video.

Trong tất cả các chức năng VGA "cổ điển" có khả năng là dành cho tất cả các ý định mô phỏng. Với một card màn hình bên ngoài, điều này sẽ không nhìn thấy được với BIOS - nó vẫn thấy một card màn hình VGA. Tuy nhiên, một BIOS cứng cáp vào card màn hình sẽ không cần phải thiết lập lớp VGA giả và bản đồ bộ nhớ địa chỉ không gian địa chỉ 20 bit cũ chỉ để dán một số văn bản trên màn hình.

Thay vào đó, BIOS có thể giao tiếp trực tiếp với thẻ (thông qua một số chế độ độc quyền) cho đến khi hệ điều hành thực sự được khởi động, tại thời điểm đó bản đồ bộ nhớ tự bản đồ hóa.Điều này có lợi thế lớn trong thẻ nhớ chia sẻ bộ nhớ chính, bạn không có màn hình trống khi khởi động nếu RAM của bạn được cài đặt không chính xác (thay vào đó thẻ video chế độ BIOS propritary có thể sử dụng bộ đệm thường dành cho một số mục đích khác, cho phép bạn vào BIOS và xem 0MB RAM đã cài đặt)

+3

Đúng - Tôi vừa được một đồng nghiệp thông báo rằng Phoenix bios đang sử dụng chế độ 12h. Thông tin video có tại 0xA0000, nhưng tất cả các pixel, không có ký tự ascii. Rất tiếc. Câu trả lời đúng, nhưng một bummer ;-) –

4

CGA (Bộ điều hợp đồ họa màu) và MDA (Bộ điều hợp hiển thị đơn sắc) sử dụng các vùng khác nhau. Một (màu) là 0xB8000; nhưng đơn sắc bắt đầu tại 0xB0000. Hãy nhớ rằng, bạn có thể có cả hai màn hình hoạt động trên máy cùng một lúc.

Xem DOS Memory Map (mặc dù nó có lỗi đánh máy trong bù đắp cho CGA - phải là 8000h không phải 0800h).

As far as VGA (Video Graphics Array) đi, bộ nhớ của nó bắt đầu thấp hơn, ở ranh giới 640K tại 0xA0000 và tiếp tục cho 64K - nhưng nó có thể đi xa hơn nữa, như là thẻ có thể có đến 256K. Một số sample code for programming VGA is here. Nhưng nó không phải là khá đơn giản vì nó có nhiều chế độ video. Bạn có thể thử here để được trợ giúp.

Bạn có chắc là bạn có VGA chứ không phải EGA hoặc XGA hay Super-VGA? Tất cả những người có ngữ nghĩa hơi khác nhau ... Nhưng vẫn còn, tôi khá chắc chắn bất kỳ những người nên đặt văn bản hoặc tại 0xB0000 hoặc 0xB8000. Chuyện gì xảy ra khi bạn gõ một trong hai

MODE MONO 

hoặc

THỨC CO80

- Điều đó có ảnh hưởng đến màn hình? Những người sẽ chuyển từ chế độ văn bản một bộ chuyển đổi sang chế độ văn bản khác, dưới DOS.

+0

Tôi đã quét mọi thứ từ 0xB0000 đến 0xBFFFF - tất cả đều là rác (0xFF). Bộ nhớ tại 0xC0000 là bios VGA như mong đợi; cho phép tôi biết rằng phương pháp truy cập bộ nhớ của tôi đang hoạt động, nhưng không giúp tôi lấy nội dung màn hình ... –

0

Có thể trường hợp bộ nhớ ảo được kích hoạt tại thời điểm đó.

Ví dụ: Tôi đã cố gắng ghi vào bộ đệm video trong mã số iPXE và không phản ánh trên màn hình. Sau khi điều tra, tôi nhận ra rằng tôi cần gọi hàm:

phys_to_virt(0xB8000); 

để có thể ghi trực tiếp vào bộ đệm video.