MTRR (Memory Type Range Register) control
在Intel P6系列的处理器上(Pentium Pro, Pentium II and later),内存类型范围寄存器(MTRRs)可以控制处理器对内存区域的访问。 如果系统中存在基于PCI或AGP总线的视频卡(VGA),MTRR将具有非常显著的作用。通过使能写捆绑(Write-combining),可以在总线传输开始前,将若干个总线写传输捆绑成一次较大的写传输操作。这可以将图像写操作的性能提高2.5倍或者更多。
Cyrix 6x86, 6x86MX 以及 M II处理器具有地址范围寄存器(ARRs:Address Range Registers),ARRs可以提供与MTRR类似的功能,能够用来模拟MTRRs。
AMD K6-2(stepping 8及以上)与K6-3处理器拥有2个MTRR。AMD Athlon系列的处理器拥有8个与Intel类似的MTRRs。
Centaur C6(WinChip)拥有8个MCRs,运行写捆绑(WC)。
VIA Cyrix III 以及 VIA C3 CPU能够提供8个类似于Intel的处理器。
选中配置选项CONFIG_MTRR后,内核将创建文件/proc/mtrr,通过此文件,能够对MTRR进行操作。X server通常就是这样做的。当然了,今后会有更加通用的接口,因而其它处理器上类似的控制寄存器也能够被轻易的支持。
文件/proc/mtrr具有2个接口:一个是ASCII接口,此接口可读可写。ASCII接口适用于管理。另一个是ioctl()接口,该接口适用于C程序(如,X Server)。下面我们将通过一些命令与C代码,详细地介绍这些接口。
在Shell中读取MTRRs:
% cat /proc/mtrr
reg00: base=0x00000000 ( 0MB), size= 128MB: write-back, count=1
reg01: base=0x08000000 ( 128MB), size= 64MB: write-back, count=1
利用C-shell创建MTRRs:
# echo "base=0xf8000000 size=0x400000 type=write-combining" >! /proc/mtrr
或者使用bash:
# echo "base=0xf8000000 size=0x400000 type=write-combining" >| /proc/mtrr
结果将变为:
% cat /proc/mtrr
reg00: base=0x00000000 ( 0MB), size= 128MB: write-back, count=1
reg01: base=0x08000000 ( 128MB), size= 64MB: write-back, count=1
reg02: base=0xf8000000 (3968MB), size= 4MB: write-combining, count=1
新增加的区域就是Video RAM,基地址为0xf8000000,大小为4MB。在X Server的输出信息中,可以找到基地址,即线性缓存地址(linear framebuffer address)。包含基地址的输出信息可能如下:
(--) S3: PCI: 968 rev 0, Linear FB @ 0xf8000000
注意:X Server可能会修改framebuffer