我在Linux上使用Bochs。它工作得很好,但有一个问题我还没有设法解决。我得到vga-info(可用模式,线性帧缓冲区(LFB)的地址),然后在实模式下切换到1024*768*24。根据vga-info模式,支持118h (1024*768*24), LFB来自E000:0000(即E0000,因为segment:offset,或平面寻址中的0xE0000000,但内存不存在,因为它几乎是3.5Gb)。后来我切换到保护模式(PM)并将数据写入E0000,但没有出现像素。如果我写到0xE0000000也不会。但是,如果我写入A0000,它们会这样做,但只映射了A0000- c0000内存(128Kb)。我想使用PM,因为32位和LFB(无分页)。我知道低分辨率的视频内存(例如320*200*256)被映射到A0000。在Bochs-config vbe是启用的(vga:扩展=vbe)。bochsouth .txt显示"VBE Bochs显示扩展已启用"。
问题:为什么视频内存来自A0000而不是E0000?为什么只有128Kb的视频内存?(应该是:1024*768*3字节,即2.25 Mb)
这样就没有图形可以在PM中完成而不分页或我做错了什么。
提前感谢,rob
我在http://wiki.osdev.org/Bochs_Graphics_Adaptor找到了一些东西:
"使用线性帧缓冲区(LFB)
当使用线性帧缓冲区时,BGA以线性方式暴露所有图形内存。在旧版本的Bochs和QEMU中,该位置固定为0xE0000000 (VBE_DISPI_LFB_PHYSICAL_ADDRESS)。但是,当Bochs配置为模拟PCI显卡而不是ISA显卡时,framebuffer的地址不再固定,而是可以从设备0x1234:0x1111的第一个PCI BAR中读取。为了启用LFB,在启用VBE扩展时使用VBE_DISPI_LFB_ENABLED标志(0x40)(因此写入VBE_DISPI_LFB_ENABLED (0x41))。
QEMU不关注VBE_DISPI_LFB_ENABLED标志。线性帧缓冲器和内存库在任何时候都是可用的。Bochs注意到国旗。在LFB模式下,它忽略更改银行的请求,并且当您写入银行内存时不会发生任何事情。在银行模式下,当您写入LFB内存时不会发生任何事情。"
我不明白这个0xE0000000,因为Bochs支持最大1Gb内存,这是远远超过。顺便说一下,通过使用——enable-vbe编译Bochs来启用vbe是不可取的,在Bochs -configfile中应该使用"vga: extension=vbe"。
SOLUTION found(设置vbe模式时设置位"use LFB"):
mov ax, 4F02h;设置vbe模式
mov bx, 118h;模式1024 * 768 * 24
or bx, 0100000000000000b;设置第14位(使用LFB)
int 10h
LFB来自于0xE0000000,正如vga-modeinfo-block所说。
有不同的视频模式,有不同的显存地址,尝试使用int 0x10在实模式下改变视频模式