【发布时间】:2013-06-26 09:34:20
【问题描述】:
显存地址(0xB8000),谁将显存映射到这个地址?
从地址复制数据并放到屏幕上的例程,它是处理器内置功能吗(这个驱动程序是处理器自带的)?
【问题讨论】:
标签: operating-system kernel cpu processor video-memory
显存地址(0xB8000),谁将显存映射到这个地址?
从地址复制数据并放到屏幕上的例程,它是处理器内置功能吗(这个驱动程序是处理器自带的)?
【问题讨论】:
标签: operating-system kernel cpu processor video-memory
当你写信给地址时会发生什么:
地址空间的那个区域没有映射到 RAM,而是通过系统总线发送到您的 VGA 卡。 BIOS 在启动时使用您的 VGA 卡进行设置(许多地址范围是内存映射到各种设备)。当您写入地址空间的这个区域时,CPU 上没有执行任何代码来绘制像素。 VGA 卡接收此信息而不是您的 RAM,并自行完成。
如果您愿意,您可以查看 BIOS 函数调用并让它重新配置硬件,以便您可以绘制像素而不是在视频地址处放置字符。你甚至可以探测它是否支持 VESA 并切换到一个不错的 1280*768 32bpp 分辨率。然后,BIOS 会将您选择的地址空间区域映射到 VGA 卡。
有关 BIOS 的更多信息:
BIOS 是主板附带的一个程序,CPU 首次启动时会执行该程序。它设置所有硬件,映射所有内存映射设备,创建各种有用的表,分配 IO 端口,将中断挂接到它留在内存中的一堆例程。然后它从设备加载你的引导扇区并跳转到你的操作系统代码。
遗留的例程和数据结构使您能够让您的操作系统脱离实际。您可以从磁盘加载扇区,将文本写入屏幕,获取有关系统的信息(内存映射、ACPI 表、MP 表等)。如果没有这些例程和数据结构,即使不是不可能,也很难制作一个可接受的引导扇区并拥有有关系统的所有信息来构建功能内核。
但是,这些例程已经过时、缓慢并且有非常严格的限制。一方面,留在内存中的例程是 16 位实模式代码,因此一旦切换到 32 位保护模式,就必须不断切换回来或使用 VM86 模式来访问它们(在 64 位模式下完全无法访问,显然是用修改后的指令来模拟指令) linux x86emu 库是一个选项)。所以套路一般都很慢。因此,如果您不再使用实模式编程,则需要从头开始编写自己的驱动程序。
【讨论】:
在大多数情况下,PC 监视器是VGA-compatible device,standard 包括从0xB8000 地址开始设置text buffer(32 KB 大小)到MMIO 的模式。
上图总结了 MMIO 的工作原理。
【讨论】: