我在Linux上使用Bochs。它工作得很好,但有一个问题我还没有设法解决。我得到vga-信息(可用模式,线性帧缓冲器(LFB)地址),然后切换到1024*768*24在真实模式。根据vga模式118 h (1024*768*24)支持,而LFB是从E 000:0000(即E0000由于段:偏移,或0xE 00000在平面寻址,但该内存不存在,因为它几乎是3.5Gb)。稍后,我切换到保护模式(PM)并将数据写入E0000,但没有出现像素。如果我写信给0xE0000000,也不会。但是,如果我写到A0000,它们就会这样做,但是只映射了一个0000-C0000内存(128 is )。我想使用PM,因为32位和LFB (没有分页)。我知道低分辨率(例如320*200*256)的视频被映射到A0000。在Bochs中,启用了vbe (vga: extension=vbe)。bochsout.txt说"VBE Bochs显示扩展已启用“。
问题是:为什么视频是来自A0000而不是来自E0000?为什么只有128 is的视频?(应该是: 1024*768*3字节,即2.25兆字节)
这样,在不分页的情况下,就不能在PM中完成任何图形,或者我正在做一些错误的事情。
谢谢你,罗伯
我在Adaptor发现了一些东西:
“使用线性帧缓冲区(LFB)
当使用线性帧缓冲区时,BGA以线性方式公开所有图形内存。在较早版本的Bochs和QEMU中,位置固定在0xE0000000 (VBE_DISPI_LFB_PHYSICAL_ADDRESS)。但是,当Bochs被配置为模拟PCI视频卡而不是ISA卡时,帧缓冲区的地址不再固定,而是可以从设备0x1234:0x1111的第一个PCI条中读取以启用LFB,在启用VBE扩展时使用VBE_DISPI_LFB_ENABLED标志(0x40) (因此可以写入VBE_DISPI_ENABLED \ VBE_DISPI_LFB_ENABLED (0x41)的值)。
QEMU不注意VBE_DISPI_LFB_ENABLED标志。线性帧缓冲区和内存库在任何时候都是可用的。Bochs注意国旗。在LFB模式下,它会忽略更改银行的请求,并且在写入银行内存时不会发生任何事情。在银行模式下,当您写入LFB内存时,不会发生任何事情。“
我不理解这个0xE0000000,因为Bochs支持最大1Gb内存,而且这要多得多。顺便说一下,通过编译带有--启用- vbe的Bochs来启用vbe,应该在bochs中使用"vga: extension=vbe“。
找到解决方案(在设置vbe模式时设置位"use“):
mov,4F02h;设置vbe模式
mov bx,118 h;模式1024*768*24
或bx,01000000000000b;设置位14(使用LFB)
int 10h
而LFB来自0xE 0000000,正如vga-modeinfo-block所说的那样。
发布于 2016-07-22 18:36:35
不同的视频模式有不同的视频存储器地址,尝试使用INT0x10来改变真实模式下的视频模式。
https://stackoverflow.com/questions/16997250
复制相似问题