graphics - 博赫斯与图形

标签 graphics operating-system bochs

我在 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: 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 视频卡时,帧缓冲区的地址不再固定,而是可以从设备 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 模式下,它会忽略更改存储体的请求,并且当您写入存储体内存时不会发生任何情况。在存储模式下,写入 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)

10小时

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

最佳答案

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

关于graphics - 博赫斯与图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16997250/

相关文章:

operating-system - 操作系统如何与声卡/视频卡等外围设备交互

ubuntu - Bochs:显示库 'sdl' 不可用

assembly - 在软盘镜像文件中使用 grub 在 bochs 中启动您自己的内核

c - 禁用 GDB 对 x86 异常的中断

opengl - 如何在 OpenGL GLSL 中导入库

algorithm - 如何在不压缩的情况下解码 PNG 文件的 IDAT block

c - 错误代码如何返回给用户程序?

opengl - 延迟渲染 - 使用光体积重建点光源的位置是否有效?

java - 图形未出现在窗口中

performance - 为什么/太多日志会影响我的应用程序的性能?