2013-06-08 3 views
2

저는 Linux에서 Bochs를 사용하고 있습니다. 잘 작동하지만 대처할 수 없었던 문제가 있습니다. vga-info (사용 가능한 모드, 선형 프레임 버퍼 (LFB) 주소)를 얻은 다음 리얼 모드에서 1024 * 768 * 24로 전환합니다. vga 정보 모드에 따르면 118h (1024 * 768 * 24)가 지원되며 LFB는 E000 : 0000 (즉 세그먼트 : 오프셋 또는 플랫 주소 지정의 경우 0x0000000이기 때문에 E0000이지만 거의 없기 때문에 메모리가 존재하지 않음 3.5Gb). 나중에 보호 모드 (PM)로 전환하고 E0000에 데이터를 쓰지만 픽셀이 나타나지 않습니다. 0xE0000000에 쓰지도 않습니다. 그러나 그들은 A0000에 쓰기 만하면 A0000-C0000 메모리 (128Kb) 만 매핑됩니다. 32 비트와 LFB (페이징 없음) 때문에 PM을 사용하고 싶습니다. 더 낮은 해상도 (예 : 320 * 200 * 256)의 비디오 메모리가 A0000에 매핑된다는 것을 알고 있습니다. Bochs-config vbe가 활성화되어 있습니다 (vga : extension = vbe). bochsout.txt는 "VBE Bochs Display Extension Enabled"라고 말합니다.그래픽이있는 Bochs

질문 : 비디오 메모리가 E0000이 아닌 A0000에있는 이유는 무엇입니까? 왜 128Kb 비디오 메모리가 있습니까? (1024 * 768 * 3 바이트, 즉 2.25Mb 여야합니다.)

이렇게하면 페이징없이 PM에서 그래픽을 수행 할 수 없으며 잘못된 결과를 나타냅니다. 사전에

감사합니다, 강탈

내가 http://wiki.osdev.org/Bochs_Graphics_Adaptor에서 뭔가를 발견 : 선형 프레임 버퍼를 사용하는 경우 선형 프레임 버퍼 (LFB)

를 사용

가 "의 BGA가 모두 노출

그래픽 메모리를 선형 방식으로 지원합니다. 이전 버전의 Bochs 및 QEMU에서는 위치가 0xE0000000 (VBE_DISPI_LFB_PHYSICAL_ADDRESS)로 고정되었지만 Bochs가 ISA 비디오 카드가 아닌 PCI 비디오 카드를 에뮬레이트하도록 구성된 경우 프레임 버퍼의 주소는 더 이상 사용되지 않습니다 고정되어 있지만 처음부터 읽을 수있다. 장치의 PCI 바 0x1234 : 0x1111 LFB를 사용하려면 VBE 확장을 활성화 할 때 VBE_DISPI_LFB_ENABLED 플래그 (0x40)를 사용하십시오 (VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED (0x41)).

QEMU는 VBE_DISPI_LFB_ENABLED 플래그에주의하지 않습니다. 선형 프레임 버퍼와 메모리 뱅크는 항상 사용할 수 있습니다. Bochs는 깃발에주의를 기울입니다. LFB 모드에서는 뱅크 변경 요청을 무시하고 뱅크 메모리에 쓸 때 아무 것도 일어나지 않습니다. 뱅크 모드에서는 LFB 메모리에 쓸 때 아무런 변화가 없습니다. "

Bochs가 최대 1Gb 메모리를 지원하기 때문에이 0xE0000000을 이해할 수 없으며 훨씬 더 많습니다 .-enable-vbe를 사용하여 Boch를 컴파일하여 vbe를 사용하도록 설정하는 방법은"vga : extension = vbe "가되어야합니다. .; 설정된 VBE 모드

MOV의 BX

MOV 도끼 4F02h : Bochs와-에서 configFile 대신 사용될

SOLUTION은 실측치 (설정 비트는 VBE 모드 설정 중 "LFB 사용") , 118h, 모드 1024 * 768 * 24

또는 bx, 0100000000000000b; 설정된 비트 14 (사용 LFB)

의 INT 10H

및 LFB는 VGA-modeinfo 블록 말했듯 0xE0000000에서이다.

답변

0

비디오 메모리의 주소가 다른 비디오 모드가 있고, 리얼 모드에서 비디오 모드를 변경하려면 int 0x10을 사용해보십시오.