在之前的博客上说过地址空间并不是全部映射到内存上,还有一些外部设备,IA手册上的1MB以下地址空间分布如下图所示。
我们都知道CPU访问外设有两种方式:IO与内存统一编址 和IO与内存独立编址,一般来说,外设中控制读写的端口都是独立编址,即用in/out指令控制,而外设中的存储器一般和内存进行统一编址,即CPU访问这些地址时和访问内存是一样的,也可以理解成这部分存储器映射到了内存中,比如上图中的各种地址段均被映射到了一些外设上。
回归正题,要在PC上要显示文字,通常需要显示器和显卡这两个硬件设备。一般来说显卡负责提供显示内容,并控制具体的显示模块和状态。显示器的职责是负责将显卡呈递的内容可视化的显示出来。既然显卡需要控制显示的数据,自然就需要存储这些待显示的内容,所以显卡就有自己的存储区域。这个存储区域叫做显示存储器(Video RAM,VRAM),简称显存。当然,访问显存就需要地址。CGA/EGA+ Chroma text video buffer 这个区域映射的就是工作在文本模式的显存。同时显卡还有另外一个工作模式叫做图形模式,这个模式是目前最常用的模式。
通常显卡内置一套关于基本英文字符的显示,很容易做到英文字符的显示。本文只使用显卡的文本模式,对于OS开发只需关注以下几点:
1、所有在PC上工作的显卡,在加电初始化之后都会自动初始化到80*25的文本模式。在这个模式下,屏幕被划分为25行,每行可以显示80个字符,所以一屏可以显示2000个字符。上图中的0xB8000~0xBFFFF这个地址段便是映射到文本模式的显存的。当访问这些地址的时候,实际上读写的是显存区域,而显卡会周期性的读取这里的数据,并且把它们按顺序显示在屏幕上。当然一些低版本显卡不支持彩色字符,只支持单色字符,其显存映射范围为0xb0000-0xb7fff。