底板芯片组与内存映射(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

时间: 2024-08-25 23:15:50

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

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

原文标题:Motherboard Chipsets and the Memory Map 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高手的精彩文章翻译一下.一来自己复习,二来与大家分享.] 我打算写一组讲述计算机内幕的文章,旨在揭示现代操作系统内核的工作原理.我希望这些文章能对电脑爱好者和程序员有所帮助,特别是对这类话题感兴趣但没有相关知识的人们.讨论的焦点是Linux,Windows,和Intel处理器.钻研系统内幕是我的一个

x86内存映射

Contents 1 "Low" memory (< 1 MiB) 1.1 Overview 1.2 BIOS Data Area (BDA) 1.3 Extended BIOS Data Area (EBDA) 1.4 ROM Area 2 "Upper" Memory (> 1 MiB) 3 See Also 3.1External Links 这篇文章主要内容是计算机启动时,BIOS跳转到你的bootloader代码后的计算机的物理内存. 1,&q

20150222 IO端口映射和IO内存映射(详解S3C24XX_GPIO驱动)

20150222 IO端口映射和IO内存映射(详解S3C24XX_GPIO驱动) 2015-02-22 李海沿 刚刚我们实现了linux系统内存的分配,读写,释放功能,下面,我们一鼓作气将IO端口映射及IO内存映射搞定,加油! (一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义.物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存.BIOS等).在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址

JAVA NIO 内存映射(转载)

原文地址:http://blog.csdn.net/fcbayernmunchen/article/details/8635427 Java类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段.本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原理. 在传统的文件IO操作中,我们都是调用操作系统提供的底层标准IO系统调用函数 read().write() ,此时调用此函数的进程(在JAVA中即java进程)由当

Java利用内存映射文件实现按行读取文件

我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的API里没有提供按行读取的方法,需要自己实现.下面就是我利用内存映射文件实现按行读取文件的方法,如有错误之处请指出,或者有更好更快的实现方式麻烦也提供一下代码. 代码如下: public class testMemoryMappedFile { public static void main(String[] agrs) throws IOException{ RandomAccessFile memoryMappedFi

内存映射文件

一段内存地址空间,映射着物理存储器上一个已经存在于磁盘上的文件.在对该文件进行操作之前必须首先对文件进行映射.使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作. 内存映射文件,是由一个文件到一块内存的映射.Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping). API: HANDLE CreateFileMapping(HANDLE hFile,LPSECURITY_ATTRIBUTES lpFileMappingAttribute

【转】C#大文件读取和查询--内存映射

笔者最近需要快速查询日志文件,文件大小在4G以上. 需求如下: 1.读取4G左右大小的文件中的指定行,程序运行占用内存不超过500M. 2.希望查询1G以内容,能控制在20s左右. 刚开始觉得这个应该不难.研究一天之后,发现这个需要使用内存映射技术. 查阅了相关资料之后 https://msdn.microsoft.com/zh-cn/library/dd997372(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1 发现还是

Linux下C编程-----IO/文件操作/内存映射 实现简单记录存储(3)

利用linux下的文件内存映射可以实现进程共享数据,我们可以把一个文件映射到虚拟内存中使多个进程进行共享, 到这里我们大概能想到他能应用到的领域 是很广泛的 主要涉及到 mmap  munmap   msync 三个函数的应用 下面贴代码 下面一段代码是为文件建立一个简单的记录存储,并且通过内存映射修改文件内容 /************************************************************************* > File Name: memdb

Java使用内存映射实现大文件的上传

在处理大文件时,如果利用普通的FileInputStream 或者FileOutputStream 抑或RandomAccessFile 来进行频繁的读写操作,都将导致进程因频繁读写外存而降低速度.如下为一个对比实验. package test; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOExc