4

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

问题:为什么显存来自 A0000 而不是来自 E0000?为什么只有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 被配置为模拟 PCI 视频卡而不是 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 标志。线性帧缓冲区和存储库始终可用。博克斯关注旗帜。在 LFB 模式下,它会忽略更改 bank 的请求,并且当您写入 bank 内存时不会发生任何事情。在 banked 模式下,当您写入 LFB 内存时不会发生任何事情。"

我不明白这个 0xE0000000 因为 Bochs 支持最大 1Gb 内存,而这远远不止。顺便说一句,通过使用 --enable-vbe 编译 Bochs 来启用 vbe 已被弃用,应该在 bochs-configfile 中使用“vga: extension=vbe”。

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

移动斧头,4F02h;设置 vbe 模式

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

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

整数 10 小时

正如 vga-modeinfo-block 所说,LFB 来自 0xE0000000。

4

1 回答 1

0

有不同的视频模式有不同的显存地址,在实模式下尝试使用int 0x10来改变视频模式。

于 2016-07-22T18:36:35.477 回答