转自:http://blog.chinaunix.net/uid-25909619-id-4194650.html

底板芯片组与内存映射

我打算写一些关于计算机内部构造(computer internal)的博文(post),以解释现代操作系统内核是如何工作的。希望对一些在这方面没有经验,又感兴趣的程序员和爱好者(enthusiasts and programmers)提供些帮助。这些博文主要关注于Linux,Windows,以及Intel处理器。计算机的内部构造是我的兴趣之一。我曾经写过一些类似于内核-模式的代码,但已经很久没有做了。这第一篇博文介绍下现代的基于Intel的底板布局(the layout of modern Intel-based motherboard),CPU如何访问内存(access memory)以及系统内存映射(system memory map)。

在开始之前,让我们看一看当今的Intel计算机是如何构成的。下面的图表展示了底板的主要构成:

Diagram for modern motherboard. The northbridge and southbridge make up the chipset.

在查看上述图表时,你需要记忆的关键点是:CPU并不知道它连接着什么东西。CPU通过针脚(pin)与外界(outside world)通信,但并不关心外界是什么。可能是计算机上的一块底板(a motherboard in a computer),也许是一个烤面包机(toaster),网络路由器,脑移植物(brain implant)或者CPU测试仪。CPU与外界有三种主要的通信方式:内存地址空间(memory address space),IO地址空间(I/O address space)以及中断(interrupt)。这里我们仅关注底板与内存。

在底板上,CPU通过前端总线(front-side bus)连接到北桥(north-bridge),无论任何时候,CPU均通过该总线读取或写入内存。它通过一些管脚(pin)来传递欲写入或读取的物理内存地址(physical memory addres),另一些管脚则用于发送待写入的值(the value to be written)或者接受待读取的值。Intel双核QX660芯片用33个管脚来传输物理内存地址(physical memory address)(因而共有233个内存地址),用64个管脚来发送或读取数据(因而数据是按照64位数据宽度或8字节块(8 byte chunks)传输的)。这允许CPU访问64giga比特的物理内存地址(233*8字节),尽管多数的芯片组(chipset)仅至多处理8giga字节的RAM。

现在问题来了。通常说到内存往往是对RAM而言的----程序一直在读取与写入的东西(stuff)。的确,来自处理器的多数内存请求均通过北桥指向(routed to)RAM。但是并非总是如此【即,并非所有的请求均发送至RAM】。物理内存地址(physical memory address)也用于底板之上的各种各样设备间通信(此类通信称作 内存映射(memory-mapped)I/O)。这些设备包括视频卡(video card),大多数PCI 卡(say, a scanner or SCSI card),以及存储BIOS的闪存(flash memory)。

当北桥(northbridge)收到物理内存请求后,它决定向何处转发该请求:应该送至(go to)RAM么?或许是视频卡(Video Card)?该转发过程(routing)是通过内存地址映射(memory address map)完成的。对于每一块物理内存地址空间,内存映射(memory map)知道哪个设备拥有该内存区域。大部分(the bulk of)内存被映射至RAM,但当该内存地址不在RAM的内存映射中时,就通知了芯片组哪些设备应该响应对这些地址的请求。这些RAM之外的内存地址空间映射造就了PC上位于640KB与1M之间经典的“洞”。当为视频卡与PCI设备预留内存空间时,该“洞”会变得更大。这就是为什么32位的操作系统在使用4giga RAM时存在问题。在Linux上,文件/proc/iomem简明地列出了此类映射地址范围(address range mappings)。下面的图表展示了Intel PC上前4giga 物理内存地址空间的经典内存映射:

实际的内存地址与范围取决于计算机上特定的底板与设备,但大部分双核系统同上述描述的内存布局很相似。所有的棕色部分均映射至RAM之外【棕色为IO,灰色映射至RAM】。请务必记住:这里所列的地址是供底板总线使用的物理内存地址。在CPU内部运行的程序(例如,我们运行与编写的程序),其内存地址是逻辑的(logical),必须在使用总线获取该地址之前,通过CPU转换为物理内存地址。

将逻辑地址转换为物理地址的规则是复杂的,并且依赖于CPU运行的模式(实模式(real mode)、32-位保护模式(32-bit protected mode)、64-位保护模式(64-bit protected mode))。不考虑转换机制(translation mechanism),CPU模式据顶了可以存取的物理内存空间大小。例如,如果CPU运行在32-位模式,那么它仅能访问4GB物理地址(这里有一个例外,称作物理地址扩展(physical address extension),但现在不用考虑)。由于物理内存的顶端约1G空间用于映射底板设备(motherboard device),CPU仅能有效地使用越3G RAM(有时更少-我有一台vista机器,仅可用2.4G)。如果CPU位于实模式(real mode),那么它仅能访问1M字节的物理RAM(这是早期Intel处理器仅有的模式)。另一方面,运行与62-位模式的CPU可以访问64GB RAM(尽管很少芯片组支持那么大的RAM)。在64-位模式下,CPU可以访问超过RAM大小的物理地址,而这些地址常用于底板设备。这被称作内存回收(reclaiming memory),它通过芯片组的辅助实现的。

这就是下篇博文需要的所有内存知识背景,该文将介绍从按下电源开始,直到bootloader即将跳入到内核为止的整个过程。关于这个话题,如果你想学习更多东西,强烈建议阅读Intel手册。我已经全面的进入到了主要的源代码,但是Intel手册写的特别好并且非常准确。下面是一些(省略)。

§  Datasheet for Intel G35 Chipset documents a representative chipset for Core 2 processors. This is the main source for this post.

§  Datasheet for Intel Core 2 Quad-Core Q6000 Sequence is a processor datasheet. It documents each pin in the processor (there aren’t that many actually, and after you group them there’s really not a lot to it). Fascinating stuff, though some bits are arcane.

§  The Intel Software Developer’s Manuals are outstanding. Far from arcane, they explain beautifully all sorts of things about the architecture. Volumes 1 and 3A have the good stuff (don’t be put off by the name, the “volumes” are small and you can read selectively).

§  Pádraig Brady suggested that I link to Ulrich Drepper’s excellent paper on memory. It’s great stuff. I was waiting to link to it in a post about memory, but the more the merrier.

原文地址:http://duartes.org/gustavo/blog/post/motherboard-chipsets-memory-map

底板芯片组与内存映射(Motherboard Chipsets and the Memory Map) 【转】的更多相关文章

  1. Motherboard Chipsets and the Memory Map.主板芯片组与内存映射

    原文标题:Motherboard Chipsets and the Memory Map 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外 ...

  2. x86内存映射

    Contents 1 "Low" memory (< 1 MiB) 1.1 Overview 1.2 BIOS Data Area (BDA) 1.3 Extended BI ...

  3. linux中的 IO端口映射和IO内存映射

    参考自:http://blog.csdn.net/zyhorse2010/article/details/6590488 CPU地址空间 (一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬 ...

  4. 内存映射文件MemoryMappedFile使用

    参考资料: http://blog.csdn.net/bitfan/article/details/4438458 所谓内存映射文件,其实就是在内存中开辟出一块存放数据的专用区域,这区域往往与硬盘上特 ...

  5. JAVA NIO FileChannel 内存映射文件

      文件通道总是阻塞式的. 文件通道不能创建,只能通过(RandomAccessFile.FileInputStream.FileOutputStream)getChannel()获得,具有与File ...

  6. Python之mmap内存映射模块(大文本处理)说明

    背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力.关于sed的说明可以看了解sed的工作原理,本文将介绍通过 ...

  7. 使用ZwMapViewOfSection创建内存映射文件总结

    标 题: [原创]使用ZwMapViewOfSection创建内存映射文件总结 作 者: 小覃 时 间: 2012-06-15,02:28:36 链 接: http://bbs.pediy.com/s ...

  8. C#大文件读取和查询--内存映射

    笔者最近需要快速查询日志文件,文件大小在4G以上. 需求如下: 1.读取4G左右大小的文件中的指定行,程序运行占用内存不超过500M. 2.希望查询1G以内容,能控制在20s左右. 刚开始觉得这个应该 ...

  9. 用C#实现的内存映射

    当文件过大时,无法一次性载入内存时,就需要分次,分段的载入文件 主要是用了以下的WinAPI LPVOID MapViewOfFile(HANDLE hFileMappingObject, DWORD ...

随机推荐

  1. 每日Scrum(8)

    今天:在程序中嵌入剖面图,进行美化 明天:测试分析,找学弟学妹来体验我们的软件 任务看板: 燃尽图:

  2. oracle (+) 什么意思

    oracle中的(+)是一种特殊的用法,(+)表示外连接,并且总是放在非主表的一方. 例如左外连接:select A.a,B.a from A LEFT JOIN B ON A.b=B.b;等价于se ...

  3. Daily Scrum - 12/01

    Meeting Minutes 今天重阳去和UI设计团队的人去讨论UI方面的事宜了,剩下的人主要还是在讨论文件输入输出的事.目前总算是能实现文件存取了,尽量在明天前把文件的格式内容都弄好. Burnd ...

  4. R-CNN阅读笔记

    论文地址:<Rich feature hierarchies for accurate object detection and semantic segmentation> 论文包含两个 ...

  5. 【Leetcode】535. Encode and Decode TinyURL

    Question: TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/pro ...

  6. 页面用一个遮罩层显示加载,加载完后隐藏该div

    <div id="background" class="background" style="display: none; "> ...

  7. Python:目录和文件的操作模块os.path和OS常用方法

    1.目录和文件的操作模块os.path,在使用之前要先导入:import os.path.它主要有以下几个重要的功能函数: #!/user/bin/python #coding= utf-8 impo ...

  8. Codeforces Round #374 (Div. 2) C(DAG上的DP)

    C. Journey time limit per test 3 seconds memory limit per test 256 megabytes input standard input ou ...

  9. MT【101】分配问题举例若干

    先拿MT[100]的图表镇楼. 举几个例子: [1]52张纸牌分发给4人,每人13张,问每人手中有一张小2的概率? 分析:第一步每人分一张小2,有4!种,然后48张牌平均分成4组有$\frac{48! ...

  10. 51nod 1479 小Y的数论题

    一脸不可做题~~~233333 T<=100000,所以一定要logn出解啦. 但是完全没有头绪*&#……%*&……()……#¥*#@ 题解: 因为2^p+2^p=2^(p+1) ...