转自: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 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外 ...

  2. jvm 堆外内存_NIO效率高的原理之零拷贝与直接内存映射

    更多内容,欢迎关注微信公众号:全菜工程师小辉~ 前言 在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,彻底搞懂NIO效率高的原理. 这篇博客将针对第三个原因,进行更详细的讲 ...

  3. mongodb内存映射原理

    内存映射 mongodb非常吃内存,为啥这么吃内存呢,mongodb使用的是内存映射存储引擎,即Memory Mapped Storage Engine,简称MMAP,MMAP可以把磁盘文件的一部分或 ...

  4. NIO效率高的原理之零拷贝与直接内存映射

    前言 在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,点击查看. 这篇博客将针对第三个原因,进行更详细的讲解. 首先澄清,零拷贝与内存直接映射并不是Java中独有的概念,并 ...

  5. 主板芯片组和内存映射

    我将写一些关于计算机内部的文章,目的是解释现代内核的工作原理. 我希望对那些对这些东西感兴趣但没有经验的发烧友和程序员有用. 重点是Linux,Windows和Intel处理器. 内部结构对我来说是一 ...

  6. linux 文件IO与内存映射:内存映射

    前言 前面几篇我们学习了用户空间的IO缓冲区,以及IO缓冲区的分散聚合IO技术. 为了减少系统调用的次数,提升系统性能,操作系统开发者门提出了这么多的缓存技术. 但是到这里这些技术同样有不足的地方:不 ...

  7. java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射

    http://langgufu.iteye.com/blog/2107023 java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果 ...

  8. ARM Linux (S3C6410架构/2.6.35内核)的内存映射(三)

    这里记录一下Linux内核做二级内存映射的过程,以中断向量表的映射过程为例. 在S3C6410架构下,Linux采用的是粗粒度小页内存管理方式,即内存段(section)的大小为1M,而页(page) ...

  9. 使用内存映射文件在进程之间共享数据

    数据共享方法是通过让两个或多个进程映射同一个文件映射对象的视图来实现的,这意味着它们将共享物理存储器的同一个页面.因此,当一个进程将数据写入一个共享文件映射对象的视图时,其他进程可以立即看到它们视图中 ...

最新文章

  1. 解题报告:luogu P2272 [ZJOI2007]最大半连通子图(tarjan缩点、递推DP、hash、set判重)
  2. js控制页面元素的隐藏与显示
  3. 響應式設計中百分比 % 的問題
  4. 解决问题SyntaxError: Unexpected token import
  5. ./configure会报错:pr command not found
  6. JAVA Reflection(反射机制)续
  7. USB学习笔记连载(十五):USB固件更新以及安装驱动
  8. Quill – 可以灵活自定义的开源的富文本编辑器
  9. 未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格式不正确的程序。...
  10. C++求最大公约数和最小公倍数
  11. 利用leaflet做一个飞机航线 可根据方向动态掉头
  12. C语言课程设计小孩吃梨,IQ题
  13. apicloud 使用教程
  14. 【百度点石(WSDM)】 Retention Rate of Baidu Hao Kan APP Users 小白经验分享
  15. 学习笔记-Matlab之多项式详解
  16. 三坐标测圆的直径怎么测_大半径短圆弧用三坐标测不准?知道为什么吗?
  17. opencv RGB与HSV转化
  18. P3400 仓鼠窝 (单调栈 dp O(n*m
  19. C语言简易学生成绩管理系统
  20. python 发送邮件 普通邮件 HTML 发送带附件 群发邮件

热门文章

  1. 人工智能恶意使用报告:预测、预防和缓解
  2. 有生之年,人工智能会给世界带来什么变化?这里是现代机器人之父Rodney Brooks关于未来的预言
  3. 苹果女高管再指控公司存在职场欺凌,曾上班时间被强迫喝酒
  4. 又是逆袭!大四在校生 6 个月拿下京东美团滴滴等 Offer
  5. 如何惹毛一名开发者?
  6. 被法拉第夸、狄更斯为她读诗、英王参加她的成人礼,程序员祖师的人生有多传奇?...
  7. HarmonyOS 手机应用开发者 Beta 版到来,对开发者意味着什么
  8. BCH大涨带领币市小幅走高 个别币种走势逐步分化
  9. Spark Troubleshooting - Task not serializable问题分析
  10. Confluence 6 那些文件需要备份