将视频内存映射到此地址的视频内存(0xB8000)的地址?
从地址复制数据并放入屏幕的例程,是处理器内置功能(这个驱动程序是否带有处理器)?
答案 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
。
上图总结了MMIO的工作原理。