没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
主板芯片组与内存映射
(
Motherboard Chipsets and the Memory Map
)
一组讲述计算机内幕的文章,旨在揭示现代操作系统内核的工作原理。我希望这些文章能对电脑爱好者和程序
员有所帮助,特别是对这类话题感兴趣但没有相关知识的人们。讨论的焦点是
Linux
,
Windows
,和
Intel
处理器。
钻研系统内幕是我的一个爱好。我曾经编写过不少内核模式的代码,只是最近一段时间不再写了。这第一篇文章讲
述了现代
Intel
主板的布局,
CPU
如何访问内存,以及系统的内存映射。
作为开始,让我们看看当今的
Intel
计算机是如何连接各个组件的吧。下图展示了主板上的主要组件:
现代主板的示意图,北桥和南桥构成了芯片组。
当你看图时,请牢记一个至关重要的事实:
CPU
一点也不知道它连接了什么东西。
CPU
仅仅通过一组针脚与外
界交互,它并不关心外界到底有什么。可能是一个电脑主板,但也可能是烤面包机,网络路由器,植入脑内的设备,
或
CPU
测试工作台。
CPU
主要通过
3
种方式与外界交互:内存地址空间,
I/O
地址空间,还有中断。
眼下,我们只关心主板和内存。安装在主板上的
CPU
与外界沟通的门户是前端总线(
front-side bus
),前端
总线把
CPU
与北桥连接起来。每当
CPU
需要读写内存时,都会使用这条总线。
CPU
通过一部分管脚来传输想要读
写的物理内存地址,同时另一些管脚用于发送将被写入或接收被读出的数据。一个
Intel Core 2 QX6600
有
33
个针脚用于传输物理内存地址(可以表示
233
个地址位置),
64
个针脚用于接收
/
发送数据(所以数据在
64
位通
道中传输,也就是
8
字节的数据块)。这使得
CPU
可以控制
64GB
的物理内存(
233
个地址乘以
8
字节),尽管
大多数的芯片组只能支持
8GB
的
RAM
。
现在到了最难理解的部分。我们可能曾经认为内存指的就是
RAM
,被各式各样的程序读写着。的确,大部分
CPU
发出的内存请求都被北桥转送给了
RAM
管理器,但并非全部如此。物理内存地址还可能被用于主板上各种设
备间的通信,这种通信方式叫做内存映射
I/O
。这类设备包括显卡,大多数的
PCI
卡(比如扫描仪或
SCSI
卡),
以及
BIOS
中的
flash
存储器等。
当北桥接收到一个物理内存访问请求时,它需要决定把这个请求转发到哪里:是发给
RAM
?抑或是显卡?具
体发给谁是由内存地址映射表来决定的。映射表知道每一个物理内存地址区域所对应的设备。绝大部分的地址被映
射到了
RAM
,其余地址由映射表来通知芯片组该由哪个设备来响应此地址的访问请求。这些被映射为设备的内存
地址形成了一个经典的空洞,位于
PC
内存的
640KB
到
1MB
之间。当内存地址被保留用于显卡和
PCI
设备时,就
会形成更大的空洞。这就是为什么
32
位的操作系统无法使用全部的
4GB RAM
。
Linux
中,
/proc/iomem
这个文
件简明的列举了这些空洞的地址范围。下图展示了
Intel PC
低端
4GB
物理内存地址形成的一个典型的内存映射:
Intel
系统中,低端
4GB
内存地址空间的布局。
实际的地址和范围依赖于特定的主板和电脑中接入的设备,但是对于大多数
Core 2
系统,情形都跟上图非常
接近。所有棕色的区域都被设备地址映射走了。记住,这些在主板总线上使用的都是物理地址。在
CPU
内部
(比
如我们正在编写和运行的程序),使用的是逻辑地址,必须先由
CPU
翻译成物理地址以后,才能发布到总线上去
访问内存。
这个把逻辑地址翻译成物理地址的规则比较复杂,而且还依赖于当时
CPU
的运行模式(实模式,
32
位保护模
式,
64
位保护模式)。不管采用哪种翻译机制,
CPU
的运行模式决定了有多少物理内存可以被访问。比如,当
CPU
工作于
32
位保护模式时,它只可以寻址
4GB
物理地址空间(当然,也有个例外叫做物理地址扩展,但暂且忽略这
个技术吧)。由于顶部的大约
1GB
物理地址被映射到了主板上的设备,
CPU
实际能够使用的也就只有大约
3GB
的
RAM
(有时甚至更少,我曾用过一台安装了
Vista
的电脑,它只有
2.4GB
可用)。如果
CPU
工作于实模式,那么
它将只能寻址
1MB
的物理地址空间(这是早期的
Intel
处理器所支持的唯一模式)。如果
CPU
工作于
64
位保护
模式,则可以寻址
64GB
的地址空间(虽然很少有芯片组支持这么大的
RAM
)。处于
64
位保护模式时,
CPU
就
有可能访问到
RAM
空间中被主板上的设备映射走了的区域了(即访问空洞下的
RAM
)。要达到这种效果,就需要
使用比系统中所装载的
RAM
地址区域更高的地址。这种技术叫做回收
(reclaiming)
,而且还需要芯片组的配合。
这些关于内存的知识将为下一篇文章做好铺垫。下次我们会探讨机器的启动过程:从上电开始,直到
boot
loader
准备跳转执行操作系统内核为止。如果你想更深入的学习这些东西,我强烈推荐
Intel
手册。虽然我列出的
都是第一手资料,但
Intel
手册写得很好很准确。这是一些资料:
《
Datasheet for Intel G35 Chipset
》描述了一个支持
Core 2
处理器的有代表性的芯片组。这也是本文的主
要信息来源。
《
Datasheet for Intel Core 2 Quad-Core Q6000 Sequence
》是一个处理器数据手册。它记载了处理器上
每一个管脚的作用(当你把管脚按功能分组后,其实并不算多)。很棒的资料,虽然对有些位的描述比较含糊。
《
Intel Software Developer’s Manuals
》是杰出的文档。它优美的解释了体系结构的各个部分,一点也不会
让人感到含糊不清。第一卷和第三卷
A
部很值得一读(别被
“
卷
”
字吓倒,每卷都不长,而且您可以选择性的阅读)。
计算机的引导过程
(
How Computers Boot Up
)
前一篇文章介绍了
Intel
计算机的主板与内存映射,从而为本文设定了一个系统引导阶段的场景。引导(
Booting
)
是一个复杂的,充满技巧的,涉及多个阶段,又十分有趣的过程。
下图列出了此过程的概要:
引导过程概要
当你按下计算机的电源键后(现在别按!),机器就开始运转了。一旦主板上电,它就会初始化自身的固件
(firmware)——
芯片组和其他零零碎碎的东西
——
并尝试启动
CPU
。如果此时出了什么问题(比如
CPU
坏了或根本
没装),那么很可能出现的情况是电脑没有任何动静,除了风扇在转。一些主板会在
CPU
故障或缺失时发出鸣音
提示,但以我的经验,此时大多数机器都会处于僵死状态。一些
USB
或其他设备也可能导致机器启动时僵死。对
于那些以前工作正常,突然出现这种症状的电脑,一个可能的解决办法是拔除所有不必要的设备。你也可以一次只
断开一个设备,从而发现哪个是罪魁祸首。
如果一切正常,
CPU
就开始运行了。在一个多处理器或多核处理器的系统中,会有一个
CPU
被动态的指派为
引导处理器(
bootstrap processor
简写
BSP
),用于执行全部的
BIOS
和内核初始化代码。其余的处理器,此时
被称为应用处理器(
application processor
简写
AP
),一直保持停机状态直到内核明确激活他们为止。虽然
Intel
CPU
经历了很多年的发展,但他们一直保持着完全的向后兼容性,所以现代的
CPU
可以表现得跟原先
1978
年的
Intel 8086
完全一样。其实,当
CPU
上电后,它就是这么做的。在这个基本的上电过程中,处理器工作于实模式,
分页功能是无效的。此时的系统环境,就像古老的
MS-DOS
一样,只有
1MB
内存可以寻址,任何代码都可以读写
任何地址的内存,这里没有保护或特权级的概念。
CPU
上电后,大部分寄存器的都具有定义良好的初始值,包括指令指针寄存器(
EIP
),它记录了下一条即将
被
CPU
执行的指令所在的内存地址。尽管此时的
Intel CPU
还只能寻址
1MB
的内存,但凭借一个奇特的技巧,一
个隐藏的基地址(其实就是个偏移量)会与
EIP
相加,其结果指向第一条将被执行的指令所处的地址
0xFFFFFFF0
(长
16
字节,在
4GB
内存空间的尾部,远高于
1MB
)。这个特殊的地址叫做复位向量
(reset vector)
,而且是现
代
Intel CPU
的标准。
主板保证在复位向量处的指令是一个跳转,而且是跳转到
BIOS
执行入口点所在的内存映射地址。这个跳转会
顺带清除那个隐藏的、上电时的基地址。感谢芯片组提供的内存映射功能,此时的内存地址存放着
CPU
初始化所
需的真正内容。这些内容全部是从包含有
BIOS
的闪存映射过来的,而此时的
RAM
模块还只有随机的垃圾数据。
下面的图例列出了相关的内存区域:
引导时的重要内存区域
随后,
CPU
开始执行
BIOS
的代码,初始化机器中的一些硬件。之后
BIOS
开始执行上电自检过程(
POST
),
检测计算机中的各种组件。如果找不到一个可用的显卡,
POST
就会失败,导致
BIOS
进入停机状态并发出鸣音提
示(因为此时无法在屏幕上输出提示信息)。如果显卡正常,那么电脑看起来就真的运转起来了:显示一个制造商
定制的商标,开始内存自检,天使们大声的吹响号角。另有一些
POST
失败的情况,比如缺少键盘,会导致停机,
屏幕上显示出错信息。其实
POST
即是检测又是初始化,还要枚举出所有
PCI
设备的资源
——
中断,内存范围,
I/O
端口。现代的
BIOS
会遵循高级配置与电源接口(
ACPI
)协议,创建一些用于描述设备的数据表,这些表格将来
会被操作系统内核用到。
POST
完毕后,
BIOS
就准备引导操作系统了,它必须存在于某个地方:硬盘,光驱,软盘等。
BIOS
搜索引
导设备的实际顺序是用户可定制的。如果找不到合适的引导设备,
BIOS
会显示出错信息并停机,比如
“Non-System
剩余16页未读,继续阅读
资源评论
- ymzhou1172015-01-07写的很不错,很有用
- qq_355994192017-11-12不错不错不错
wengqiancun
- 粉丝: 9
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功