大约15年前,我常常通过编写糟糕的代码来直接修改显示器上的文本,以此来娱乐自己,并惹恼我的CS老师。通过在配备VGA的PC兼容机上访问视频内存0xB8000,可以轻松做到这一点。
快进到今天,我决定通过一个允许我访问物理内存的调试端口来尝试我的老把戏。令我满意的是,它仍然可以在我试用的第一个平台上工作。然后,令人沮丧的是,我发现它在许多其他系统上都不起作用。它不能工作的系统似乎都有UMA (共享内存)显卡。
所以,对于所有BIOS编写者、底层操作系统人员和视频驱动专家来说,一个问题-如果我在具有共享图形内存的PC兼容系统上处于常规的80x25彩色文本模式,在实模式下,0xb8000 - 0xB8FFF的内容都是0xFF,而不是给我屏幕上的内容,屏幕缓冲区到哪里去了?
发布于 2009-07-22 16:42:40
啊,如果是BIOS屏幕,那么所有的赌注都失效了。事实上,它是带有集成显卡的主板上的BIOS,这一事实更有利于视频的陌生感。
在所有可能的情况下,“经典的”VGA功能都是模拟的。使用外部显卡时,BIOS将看不到这一点-它仍然可以看到VGA显卡。但是,一个硬连接到显卡上的BIOS不需要设置假的VGA层和老式的20位地址空间内存映射,仅仅是为了在屏幕上粘贴一些文本。
取而代之的是,BIOS可以直接与卡连接(通过某种专有模式),直到操作系统实际启动,此时它自己进行内存映射。这有一个主要的优点,因为对于共享主存的卡,如果RAM安装不正确,启动时不会出现空白屏幕(相反,显卡正确的BIOS模式可以使用通常为其他目的保留的缓冲区,允许您进入BIOS并查看安装的0MB RAM )。
发布于 2009-07-22 14:03:52
CGA (彩色图形适配器)和MDA (单色显示适配器)卡使用不同的区域。一个(彩色)在0xB8000;但单色从0xB0000开始。请记住,您可以在机器上同时激活两个显示器。
参见DOS Memory Map (尽管在CGA的偏移量中有一个拼写错误-应该是8000h而不是0800h)。
至于VGA (视频图形阵列),它的内存起点较低,在0xA0000的640K边界,并持续64K -但它可以超过,因为卡可以高达256K。一些sample code for programming VGA is here。但它并不是那么简单,因为它有多种视频模式。您可以尝试使用here获得一些帮助。
您确定您有VGA,而不是EGA、XGA或Super-VGA吗?所有这些都有略微不同的语义...但我仍然非常确定,其中任何一个都应该将文本放在0xB0000或0xB8000中。当您键入以下内容时会发生什么情况
MODE MONO或
模式CO80
--这会影响显示吗?它们会在DOS下从一种适配器文本模式切换到另一种。
发布于 2014-09-14 13:43:28
可能会出现这样的情况,即在此时启用虚拟内存。
例如,我试图在iPXE代码库中写入视频缓冲区,但它没有在屏幕上反映出来。经过研究,我意识到我需要调用该函数:
phys_to_virt(0xB8000);以便能够直接写入视频缓冲器。
https://stackoverflow.com/questions/1165494
复制相似问题