我在Linux上使用Bochs。
它工作正常,但是有一个我无法解决的问题。
我得到了vga-info(可用模式,线性帧缓冲区(LFB)的地址),然后在实模式下切换到1024 * 768 * 24。
根据vga-info模式,支持118h(1024 * 768 * 24),并且LFB从E000:0000(即E0000,因为segment:offset,或在平面寻址中为0xE0000000,但该内存不存在,因为它接近3.5 Gb)。
后来我切换到保护模式(PM)并将数据写入E0000,但是没有出现像素。如果我写入0xE0000000,也不会。但是,如果我写入A0000,但仅映射A0000-C0000内存(128Kb),它们就会执行。由于32位和LFB(无分页),我想使用PM。我知道较低分辨率(例如320 * 200 * 256)的视频存储器已映射到A0000。
在Bochs-config中,启用了vbe(vga:extension = vbe)。 bochsout.txt说“已启用VBE Bochs显示扩展”。

问题:
为什么视频存储器来自A0000而不是E0000?
为什么只有128Kb视频存储器? (应为:1024 * 768 * 3字节,即2.25 Mb)

这样,不进行分页就无法在PM中完成任何图形处理,或者我做错了什么。

提前致谢,


我在http://wiki.osdev.org/Bochs_Graphics_Adaptor找到了一些东西:

“使用线性帧缓冲区(LFB)

使用线性帧缓冲区时,BGA以线性方式公开所有图形内存。在较旧版本的Bochs和QEMU中,位置固定为0xE0000000(VBE_DISPI_LFB_PHYSICAL_ADDRESS)。但是,当Bochs配置为模拟PCI视频卡而不是ISA ISA卡时,帧缓冲区的地址不再固定,而是可以从设备0x1234:0x1111的第一个PCI BAR读取。要启用LFB,请使用VBE_DISPI_LFB_ENABLED启用VBE扩展时标记(0x40)(因此,写一个值VBE_DISPI_ENABLED | 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”。

找到解决方案(在设置vbe模式期间将位“使用LFB”置位):

mov ax,4F02h;设置vbe模式

mov bx,118h;模式1024 * 768 * 24

或bx,0100000000000000b;设置第14位(使用LFB)

整数10h

如vga-modeinfo-block所说,LFB从0xE0000000开始。

最佳答案

不同的视频模式具有不同的视频内存地址,请尝试使用int 0x10在实模式下更改视频模式。

10-07 19:11