底板芯片组与内存映射(Motherboard Chipsets and the Memory Map) 【转】
转自: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) 【转】的更多相关文章
- Motherboard Chipsets and the Memory Map.主板芯片组与内存映射
原文标题:Motherboard Chipsets and the Memory Map 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外 ...
- x86内存映射
Contents 1 "Low" memory (< 1 MiB) 1.1 Overview 1.2 BIOS Data Area (BDA) 1.3 Extended BI ...
- linux中的 IO端口映射和IO内存映射
参考自:http://blog.csdn.net/zyhorse2010/article/details/6590488 CPU地址空间 (一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬 ...
- 内存映射文件MemoryMappedFile使用
参考资料: http://blog.csdn.net/bitfan/article/details/4438458 所谓内存映射文件,其实就是在内存中开辟出一块存放数据的专用区域,这区域往往与硬盘上特 ...
- JAVA NIO FileChannel 内存映射文件
文件通道总是阻塞式的. 文件通道不能创建,只能通过(RandomAccessFile.FileInputStream.FileOutputStream)getChannel()获得,具有与File ...
- Python之mmap内存映射模块(大文本处理)说明
背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力.关于sed的说明可以看了解sed的工作原理,本文将介绍通过 ...
- 使用ZwMapViewOfSection创建内存映射文件总结
标 题: [原创]使用ZwMapViewOfSection创建内存映射文件总结 作 者: 小覃 时 间: 2012-06-15,02:28:36 链 接: http://bbs.pediy.com/s ...
- C#大文件读取和查询--内存映射
笔者最近需要快速查询日志文件,文件大小在4G以上. 需求如下: 1.读取4G左右大小的文件中的指定行,程序运行占用内存不超过500M. 2.希望查询1G以内容,能控制在20s左右. 刚开始觉得这个应该 ...
- 用C#实现的内存映射
当文件过大时,无法一次性载入内存时,就需要分次,分段的载入文件 主要是用了以下的WinAPI LPVOID MapViewOfFile(HANDLE hFileMappingObject, DWORD ...
随机推荐
- VMware 虚拟机CentOS 7 网路连接配置 无eth0简单解决办法
个人博客:http://www.cnblogs.com/miaojinmin799/ 在前面几步基本和网上linux配置差不多,最后一步要配置eth0时出现如图所示结果使用ifconfig -a命令 ...
- navicat连接mysql报10061错
可能原因:mysql服务未启动 解决办法:进入到计算机管理,找到服务,然后找到mysql服务,并启动该服务
- TLabel的FocusControl属性什麽意思
但我们为Label设置了热键的时刻,我们按这个热键,就会移动核心倒FocusControl指定的控件上!例如,设置Label.Caption:='Test For FocusControl(& ...
- 51nod 1476 括号序列的最小代价(贪心+优先队列)
题意 我们这有一种仅由"(",")"和"?"组成的括号序列,你必须将"?"替换成括号,从而得到一个合法的括号序列. 对于 ...
- 【题解】Friends
题目描述 有三个好朋友喜欢在一起玩游戏,A君写下一个字符串S,B君将其复制一遍得到T,C君在T的任意位置(包括首尾)插入一个字符得到U.现在你得到了U,请你找出S. 输入输出格式 输入格式 第一行,一 ...
- 【刷题】BZOJ 4078 [Wf2014]Metal Processing Plant
Description 定义集合S的价值D(S)为: 现在给你n个元素,并给出其中任意两个元素之间的d(i,j)值 要你将这些元素划分成两个集合A.B. 求min{D(A)+D(B)}. 注:d(i, ...
- 解决 Microsoft Excel has stopped working
安装了project 2013后, excel 2013 一打开文件就报这个错,解决方法如下: Step1: Try to repair Office 2013 installation and ch ...
- 【转】PCB中3D相关功能详解
如果PCB Layout工程师能够在设计过程中,使用设计工具直观地看到自己设计板子的实际情况,将能够有效的帮助他们的工作.尤其现在PCB板的设计越来越复杂,密度越来越高,如果能够洞察多层板内部则可以帮 ...
- 前端学习 -- Css -- 高度坍塌问题的产生以及解决
在文档流中,父元素的高度默认是被子元素撑开的,也就是子元素多高,父元素就多高. 但是当为子元素设置浮动以后,子元素会完全脱离文档流,此时将会导致子元素无法撑起父元素的高度,导致父元素的高度塌陷. 由于 ...
- spring.net框架配置和使用
spring.net框架学习笔记 spring.net框架是用于解决企业应用开发的复杂性的一种容器框架,它的一大功能IOC(控制反转),通俗解释就是通过spring.net框架的容器创建对象实体,而不 ...