视频内存地址

时间:2013-06-28 14:53:05

标签: operating-system kernel cpu processor video-memory

将视频内存映射到此地址的视频内存(0xB8000)的地址?
从地址复制数据并放入屏幕的例程,是处理器内置功能(这个驱动程序是否带有处理器)?

2 个答案:

答案 0 :(得分:5)

写信地址时会发生什么:

地址空间的那个区域没有映射到RAM,而是通过系统总线发送到你的VGA卡。 BIOS在启动时使用您的VGA卡进行设置(许多地址范围是内存映射到各种设备)。当您写入地址空间的这个区域时,CPU上没有执行代码来绘制像素。 VGA卡接收此信息而不是RAM,并自行完成。

如果您需要,您可以查看BIOS函数调用并重新配置硬件,以便您可以绘制像素而不是在视频地址处放置字符。您甚至可以探测它是否支持VESA并切换到漂亮的1280 * 768 32bpp分辨率。然后,BIOS会将您选择的地址空间区域映射到VGA卡。

有关BIOS的更多信息:

BIOS是您的主板附带的程序,CPU在首次启动时会执行该程序。它设置所有硬件,映射所有内存映射设备,创建各种有用的表,分配IO端口,挂起中断到它留在内存中的一堆例程。然后它从设备加载您的bootsector并跳转到您的操作系统代码。

左侧的例程和数据结构使您可以让您的操作系统停止运行。您可以从磁盘加载扇区,将文本写入屏幕,获取有关系统的信息(内存映射,ACPI表,MP表.etc)。如果没有这些例程和数据结构,那么制作一个可接受的bootsector并获得有关系统的所有信息来构建一个功能内核将会困难得多。

然而,例程过时,速度慢且限制性非常严格。对于其中一个,内存中的例程是16位实模式代码,因此只要切换到32位保护模式,就必须不断切换回来或使用VM86模式访问它们(在64位模式下完全无法访问),显然用修改后的模式模拟指令linux x86emu库虽然是一个选项。因此,例程通常很慢。因此,如果您偏离实模式编程,则需要从头开始编写自己的驱动程序。

答案 1 :(得分:0)

在大多数情况下,PC监视器为VGA-compatible device,其standard包括从地址开始设置MMIO(32 KB大小)到0xB8000的模式df_fixed <- apply(df[,2:3], 2, function(x) { md <- sapply(sort(unique(df$cluster)), function(k) median(x[df$cluster==k], na.rm=TRUE)) x[is.na(x)] <- md[df$cluster][is.na(x)] return(x) }) any(is.na(df_fixed)) # [1] FALSE

How MMIO works:

上图总结了MMIO的工作原理。