23

大约 15 年前,我曾经通过编写会直接修改显示器上的文本的糟糕代码来取悦自己并惹恼我的 CS 老师。这很容易通过在配备 VGA 的 PC 兼容机上访问 0xB8000 处的视频内存来完成。

快进到今天,我决定通过一个调试端口尝试我的旧技巧,让我可以访问读取物理内存。令我高兴的是,它仍然可以在我尝试的第一个平台上运行。然后,令人沮丧的是,我发现它不适用于许多其他系统。似乎它不适用于所有系统都具有 UMA(共享内存)图形。

因此,对于所有 BIOS 编写者、低级操作系统人员和视频驱动程序专家来说,一个问题 - 如果我在具有共享图形内存的 PC 兼容系统上处于常规 80x25 彩色文本模式,在实模式下,以及0xb8000 - 0xB8FFF 都是 0xFF 而不是给我屏幕上的内容,屏幕缓冲区到哪里去了?

4

3 回答 3

17

啊,如果是 BIOS 屏幕,那么所有的赌注都没有了。它是带有集成显卡的主板上的 BIOS,这一事实更倾向于支持视频奇怪。

在所有可能的情况下,“经典”VGA 功能都适用于模拟的所有意图。使用外部视频卡,这对 BIOS 来说是不可见的 - 它仍然可以看到 VGA 视频卡。但是硬连线到显卡的 BIOS 不需要设置假的 VGA 层和老式的 20 位地址空间内存映射,只是为了在屏幕上粘贴一些文本。

相反,BIOS 可以直接与卡接口(通过某种专有模式),直到操作系统实际启动,此时它自己进行内存映射。这有一个主要优点,因为对于共享主内存的卡,如果您的 RAM 安装不正确,您在启动时不会出现空白屏幕(相反,视频卡专有 BIOS 模式可以使用通常为其他目的保留的缓冲区,允许您进入 BIOS 并查看已安装的 0MB RAM)

于 2009-07-22T16:42:40.123 回答
6

CGA(彩色图形适配器)和MDA(单色显示适配器)卡使用不同的区域。一个(颜色)在0xB8000;但单色从0xB0000开始。请记住,您可以同时在机器上同时激活两个显示器。

请参阅DOS 内存映射(尽管CGA的偏移量中有错字- 应该是 8000h 而不是 0800h)。

VGA(视频图形阵列)而言,它的内存开始较低,在0xA0000处的 640K 边界并持续到 64K - 但它可以超越,因为卡可能有高达 256K。这里有一些用于 VGA 编程的示例代码。但它并不是那么简单,因为它有多种视频模式。您可以尝试在这里寻求帮助。

你确定你有 VGA,而不是 EGA、XGA 或 Super-VGA?所有这些都有略微不同的语义......但是,我很确定其中任何一个都应该将文本放在0xB00000xB8000。当您键入时会发生什么

MODE MONO

或者

模式 CO80

——这会影响显示吗?在 DOS 下,它们会从一种适配器文本模式切换到另一种。

于 2009-07-22T14:03:51.653 回答
3

可能是此时启用了虚拟内存。

例如,我试图写入iPXE代码库中的视频缓冲区,但它没有反映在屏幕上。经过调查,我意识到我需要调用该函数:

phys_to_virt(0xB8000);

能够直接写入视频缓冲区。

于 2014-09-14T05:43:28.340 回答