大约15年前,我曾经自娱自乐,并通过编写直接修改显示器上文本的错误代码来惹恼我的CS老师。这可以通过在配备VGA的PC兼容机上访问0xB8000的视频内存来轻松完成。
快进到今天,我决定通过调试端口尝试我的旧技巧,让我可以访问读取物理内存。令我满意的是,它仍然在我尝试过的第一个平台上工作。然后,令人沮丧的是,我发现它不适用于许多其他系统。似乎它不起作用的系统都有UMA(共享内存)图形。
所以,对于所有BIOS编写者,低级操作系统人员和视频驱动程序大师的问题 - 如果我在具有共享图形内存的PC兼容系统上使用常规80x25彩色文本模式,在实模式下, 0xb8000 - 0xB8FFF的内容都是0xFF,而不是给我屏幕上的内容,屏幕缓冲区在哪里?
答案 0 :(得分:13)
啊,如果它是一个BIOS屏幕,那么所有的赌注都会关闭。事实上,它是带有集成显卡的主板上的BIOS,更倾向于视频陌生。
在所有可能的情况下,“经典”VGA功能适用于所有模拟的意图。使用外部视频卡,这对BIOS来说是不可见的 - 它仍然可以看到VGA视频卡。但硬连线到视频卡的BIOS不需要设置假的VGA层和旧学校20位地址空间内存映射只是为了在屏幕上粘贴一些文本。
相反,BIOS可以直接与卡接口(通过某种专有模式),直到操作系统实际上将要启动,此时它自己进行内存映射。这样做的一个主要优点是,对于共享主内存的卡,如果你的RAM安装不正确,你就不会在启动时出现空白屏幕(相反,视频卡的预设BIOS模式可能会使用通常为某些其他目的保留的缓冲区,允许你进入BIOS并看到安装了0MB的RAM)
答案 1 :(得分:4)
CGA(彩色图形适配器)和MDA(单色显示适配器)卡使用不同的区域。一个(颜色)位于 0xB8000 ;但是单色从 0xB0000 开始。请记住,您可以同时在机器上激活两个显示器。
请参阅DOS Memory Map(虽然CGA的偏移量中有拼写错误 - 但应该是8000h而不是0800h。)
就VGA(视频图形阵列)而言,其内存开始较低,在640K边界处 0xA0000 并继续为64K - 但它可以超越,如卡最高可达256K。一些sample code for programming VGA is here。但它并不是那么简单,因为它有多种视频模式。您可以尝试here寻求帮助。
你确定你有VGA,而不是EGA或XGA或Super-VGA吗?所有这些语义略有不同......但是,我仍然相信其中任何一个都应该将文本放在 0xB0000 或 0xB8000 。键入
时会发生什么MODE MONO
或
MODE CO80
- 这会影响显示吗?那些会在DOS下从一个适配器文本模式切换到另一个。
答案 2 :(得分:1)
可能就是此时启用了虚拟内存。
例如, 我试图写入iPXE代码库中的视频缓冲区,但它并没有在屏幕上反映出来。经过调查,我意识到我需要调用这个函数:
phys_to_virt(0xB8000);
能够直接写入视频缓冲区。