搜档网
当前位置:搜档网 › 主板芯片和内存映射

主板芯片和内存映射

主板芯片和内存映射
主板芯片和内存映射

astrotycoon 大道至简,贵在恒久力行

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

(补充: 北桥芯片用于与CPU、内存和AGP视频接口,这些接口具有很高的传输速率。北桥芯片还起着存储器控制作用,因此Intel把该芯片标号为MCH(Memory Controller Hub)芯片。南桥芯片用来管理低、中速的组件,例如,PCI总线、IDE硬盘接口、USB端口等,因此南桥芯片的名称为ICH(I/O Controller Hub))

As you look at this, the crucial thing to keep in mind is that the CPU doesn’t really know anything about what it’s connected to. It talks to the outside world through its pins bu t it doesn’t care what that outside world is. It might be a motherboard in a computer but it could be a toaster, network router, brain implant, or CPU test bench. There are thre e main ways by which the CPU and the outside communicate: memory address space, I/O address space, and interrupts. We only worry about motherboards and memory for now.

正如你所看到的,其实CPU是完全不知道自己与哪些外部器件相连接的。 CPU仅仅通过自己的引脚与外界沟通,而它并不关心自己是与什么设备在沟通。或许是另一台计算机的主板,或许是烤面包机,网络路由器,脑植入医疗设备,又或许是CPU测试仪。 CPU主要通过三种方式与外界通信:内存地址空间,IO地址空间,和中断。我们目前只关注主板和内存。

In a motherboard the CPU’s gateway to the world is the front-side bus connecting it to the northbridge. Whenever the CPU needs to read or write memory it does so via this b us. It uses some pins to transmit the physical memory address it wants to write or read, while other pins send the value to be written or receive the value being read. An Intel Core 2 QX6600 has 33 pins to transmit the physical memory address (so there are 233 choices of memory locations) and 64 pins to send or receive data (so data is transmitte d in a 64-bit data path, or 8-byte chunks). This allows the CPU to physically address 64 gigabytes of memory (233 locations * 8 bytes) although most chipsets only handle up to 8 gigs of RAM.

CPU通过前端总线与北桥芯片连接,作为与外界通信的桥梁。无论何时,CPU都可以通过前端总线来读写内存。 CPU通过一些引脚来传送想要读写物理内存的地址,同时通过另一些引脚来发送将要写入内存的数据或者接收从内存读取到的数据。 Intel Core 2 QX6600 用33个引脚来传送物理内存地址(因此共有233 个内存地址),并且用64个引脚来发送或接收数据(所以数据在64位通道中传输,也就是8字节的数据块)。因此C PU可以访问64G的物理内存(233*8字节),尽管多数芯片组只能处理8G大小的物理内存。

Now comes the rub. We’re used to thinking of memory only in terms of RAM, the stuff programs read from and write to all the time. And indeed most of the memory requests from the processor are routed to RAM modules by the northbridge. But not all of them. Physical memory addresses are also used for communication with assorted devices on t he motherboard (this communication is called memory-mapped I/O). These devices include video cards, most PCI cards (say, a scanner or SCSI card), and also the flash mem ory that stores the BIOS.

那么现在的问题是,通常一提起内存我们仅仅联想到RAM,以为程序一直读写的就只是RAM。的确,绝大多数来自CPU的内存访问请求都被北桥芯片映射到了RAM。但是,注意,不是全部。物理内存同样可以用来与主板上的各种设备通信(这种通信方式被称为I/O内存映射)。这些设备包括显卡,大多数PCI卡(比如,扫描仪,或者是SCSI卡),也包括存储BIOS的flash存储器。

When the northbridge receives a physical memory request it decides where to route it: should it go to RAM? Video card maybe? This routing is decided via the memory addres s map. For each region of physical memory addresses, the memory map knows the device that owns that region. The bulk of the addresses are mapped to RAM, but when the y aren’t the memory map tells the chipset which device should service requests for those addresses. This mapping of memory addresses away from RAM modules causes the c lassic hole in PC memory between 640KB and 1MB. A bigger hole arises when memory addresses are reserved for video cards and PCI devices. This is why 32-bit OSes have pr oblems using 4 gigs of RAM. In Linux the file /proc/iomem neatly lists these address range mappings. The diagram below shows a typical memory map for the first 4 gigs of p hysical memory addresses in an Intel PC:

当北桥芯片接收到来自CPU的物理内存访问请求时,它将决定应该把该物理地址映射到哪里:是映射到RAM呢?还是显卡呢?这个映射过程是通过内存地址映射完成的。内存地址映射知道物理内存地址的每一块区域所对应的设备。大多数的物理地址都被映射到了RAM,但当请求的物理地址不是映射到RAM时,内存地址映射就告诉芯片组应该由哪一个设备来负责响应处理该物理地址请求。在PC机物理内存地址中,地址640K到1M 的范围内很多区域并不是映射到RAM的,而是映射到各种各样的设备的。尤其当为视频卡和PIC设备预留物理内存地址时,该内存区域映射到RAM的地址空间就越小。这也就是为什么32位的操作系统不能完全使用4G RAM内存的原因。在linux操作系统中,文件/process/iomem清晰地列出了这些地址范围的映射关系。下图展现的是IntelPC机的前4G物理内存地址的典型的内存映射:

Memory layout for the first 4 gigabytes in an Intel system.

Actual addresses and ranges depend on the specific motherboard and devices present in the computer, but most Core 2 systems are pretty close to the above. All of the brown regions are mapped away from RAM. Remember that these are physical addresses that are used on the motherboard buses. Inside the CPU (for example, in the programs we r un and write), the memory addresses are logical and they must be translated by the CPU into a physical address before memory is accessed on the bus.

实际的物理内存地址以及地址范围取决于计算机上不同的主板和设备,但是绝大多数Core 2系统的内存映射情况与上图很接近了。图中所有棕色内存区域都不是映射到RAM中的。请注意,这里提到的主板总线上的地址指的是物理内存地址。在CPU内部(或者说,在我们运行与编写的程序里),内存地址指的是逻辑地址,在这些地址送上地址总线之前,CPU内部必须将这些逻辑地址转换成物理内存地址。

The rules for translation of logical addresses into physical addresses are complex and they depend on the mode in which the CPU is running (real mode, 32-bit protected mod e, and 64-bit protected mode). Regardless of the translation mechanism, the CPU mode determines how much physical memory can be accessed. For example, if the CPU is ru nning in 32-bit mode, then it is only capable of physically addressing 4 GB (well, there is an exception called physical address extension, but ignore it for now). Since the top 1 GB or so of physical addresses are mapped to motherboard devices the CPU can effectively use only ~3 GB of RAM (sometimes less – I have a Vista machine where only 2.4 G B are usable). If the CPU is in real mode, then it can only address 1 megabyte of physical RAM (this is the only mode early Intel processors were capable of). On the other han d, a CPU running in 64-bit mode can physically access 64GB (few chipsets support that much RAM though). In 64-bit mode it is possible to use physical addresses above the t otal RAM in the system to access the RAM regions that correspond to physical addresses stolen by motherboard devices. This is called reclaiming memory and it’s done with he lp from the chipset.

将逻辑地址转换成物理地址的过程是复杂的,并且依赖于CPU当前的运行模式(实模式,32位保护模式,和64位保护模式)。我们要知道,不管CPU采用什么样的转换机制,CPU能够访问的物理内存地址范围大小是由CPU的运行模式决定的。举例来说,如果CPU运行在32位保护模式下,那么它最大物理内存寻址范围是4G(当然,有个例外叫做物理内存扩展机制,目前先忽略这点)。因为最上面的1G内存和那些被各种设备占用的物理内存,CPU真正能访问的大约只有3G的RAM(有时更少 -- 我的Vista机器上只有2.4G可用)。如果CPU处于实模式下,那么它只能够访问到1M的物理内存(早期Intel CPU只有实模式这一种模式,1M是其最大的寻址范围)。此外,如果CPU运行在64位保护模式下,那么可以访问到64G的物理内存(目前很少有芯片组支持这么大的RAM)。并且在64位模式下,CPU甚至可以访问超过RAM大小的物理内存地址,而这些地址通常是由主板上的其他设备使用的。这叫做内存回收,当然这需要芯片组的支持才行。

That’s all the memory we need for the next post, which describes the boot process from power up until the boot loader is about to jump into the kernel. If you’d like to learn m ore about this stuff, I highly recommend the Intel manuals. I’m big into primary sources overall, but the Intel manuals in particular are well written and accurate. Here are so me:

有了这些关于内存的认识,看下篇文章就很轻松了。下篇文章中我们描述从计算机上电开始到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 gr oup 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 g ood 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 m errier.

关于VB内存映射文件的使用

VB内存映射文件的使用 引言 文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。一般来说,以上这些函数可以满足大多数场合的要求,但是对于某些特殊应用领域所需要的动辄几十GB、几百GB、乃至几TB的海量存储,再以通常的文件处理方法进行处理显然是行不通的。目前,对于上述这种大文件的操作一般是以内存映射文件的方式来加以处理的,本文下面将针对这种Windows核心编程技术展开讨论。 内存映射文件 内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页文件,而且在对该文件进行操作之前必须首先对文件进行映射,就如同将整个文件从磁盘加载到内存。由此可以看出,使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。另外,实际工程中的系统往往需要在多个进程之间共享数据,如果数据量小,处理方法是灵活多变的,如果共享数据容量巨大,那么就需要借助于内存映射文件来进行。实际上,内存映射文件正是解决本地多个进程间数据共享的最有效方法。 内存映射文件并不是简单的文件I/O操作,实际用到了Windows的核心编程技术--内存管理。所以,如果想对内存映射文件有更深刻的认识,必须对Windows操作系统的内存管理机制有清楚的认识,内存管理的相关知识非常复杂,超出了本文的讨论范畴,在此就不再赘述,感兴趣的读者可以参阅其他相关书籍。 内存映射文件使用方法 1) 首先要通过CreateFile()函数来创建或打开一个文件内核对象,这个对象标识了磁盘上将要用作内 存映射文件的文件。 2)在用CreateFile()将文件映像在物理存储器的位置通告给操作系统后,只指定了映像文件的路径, 映像的长度还没有指定。为了指定文件映射对象需要多大的物理存储空间还需要通过 CreateFileMapping()函数来创建一个文件映射内核对象以告诉系统文件的尺寸以及访问文件的方式。 3)在创建了文件映射对象后,还必须为文件数据保留一个地址空间区域,并把文件数据作为映射到该 区域的物理存储器进行提交。由MapViewOfFile()函数负责通过系统的管理而将文件映射对象的全部或部分映射到进程地址空间。此时,对内存映射文件的使用和处理同通常加载到内存中的文件数据的处理方式基本一样。 4)在完成了对内存映射文件的使用时,还要通过一系列的操作完成对其的清除和使用过资源的释放。 这部分相对比较简单,可以通过UnmapViewOfFile()完成从进程的地址空间撤消文件数据的映像、通过CloseHandle()关闭前面创建的文件映射对象和文件对象。 内存映射文件相关函数 在使用内存映射文件时,所使用的API函数主要就是前面提到过的那几个函数,下面分别对其进行介绍:

北理工操作系统内存管理实验报告

实验三:内存管理 班级: 学号:

姓名: 一、实验目的 1.通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解; 2.熟悉虚存管理的页面淘汰算法; 3.通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 二、实验要求 1.设计一个请求页式存储管理方案(自己指定页面大小),并予以程序实现。 并产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列。 2.页面淘汰算法采用FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页 表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。 3.系统运行既可以在Windows,也可以在Linux。 三、实验流程图

图1 页式存储管理程序参考流程 四、实验环境 硬件设备:个人计算机。 系统软件:windows操作系统,Visual C++6.0编译环境。 五、实验结果

说明:模拟产生35个指令地址,随机产生20个指令地址进行排队,假设主存中共有10个工作集页帧。将前9个指令调入内存,因为前9个指令中,页号为13的指令有两个,所以调入内存中共有8页。此时主存中还有两个空闲帧。此时按刚才随机顺序进行访问指令工作。前9页因都在主存中可直接调用。第10个随机地址为页号为5的指令,也在主存中,也可直接调用。页号为24,3因不在主存中,需要调用进主存。此时主存已满。然后主存需要进行调用页号为27号的指令,因主存已满,需要执行FIFO算法,将最先进入主存的页号为30的指令调出,将27号放入第1000000帧。以后需要调用的页面按照存在就无需调用,否则按FIFO原则进行调页工作。 六、实验感想 七、实验代码 #include

【CN110070029A】一种步态识别方法及装置【专利】

(19)中华人民共和国国家知识产权局 (12)发明专利申请 (10)申请公布号 (43)申请公布日 (21)申请号 201910309192.7 (22)申请日 2019.04.17 (71)申请人 北京易达图灵科技有限公司 地址 100013 北京市朝阳区安定门外大街1 号1幢9层905室 (72)发明人 袁飞 华仁红 马向军 孙文凤  (74)专利代理机构 北京路浩知识产权代理有限 公司 11002 代理人 王庆龙 苗晓静 (51)Int.Cl. G06K 9/00(2006.01) G06K 9/46(2006.01) G06N 3/04(2006.01) (54)发明名称 一种步态识别方法及装置 (57)摘要 本发明实施例提供一种步态识别方法及装 置。方法包括:获取待识别视频中任一行人对应 的人体关键点特征向量序列;将人体关键点特征 向量序列输入至目标神经网络,根据目标神经网 络的输出结果,识别人体关键点特征向量序列对 应的行人身份;其中,目标神经网络是根据带有 行人身份标签的人体关键点特征向量序列进行 训练后得到的。本发明实施例提供的方法及装 置,通过获取待识别视频中任一行人对应的人体 关键点特征向量序列,并将该序列输入至目标神 经网络,根据目标神经网络的输出结果,识别该 序列对应的行人身份。通过充分利用人体关键点 特征,自学习人体的步态特征,大大提高了步态 识别的鲁棒性和准确性,并且,对硬件的要求较 低, 便于实际应用。权利要求书2页 说明书8页 附图2页CN 110070029 A 2019.07.30 C N 110070029 A

权 利 要 求 书1/2页CN 110070029 A 1.一种步态识别方法,其特征在于,包括: 获取待识别视频中任一行人对应的人体关键点特征向量序列; 将所述人体关键点特征向量序列输入至目标神经网络,根据所述目标神经网络的输出结果,识别所述人体关键点特征向量序列对应的行人身份; 其中,所述目标神经网络是根据带有行人身份标签的人体关键点特征向量序列进行训练后得到的。 2.根据权利要求1所述的方法,其特征在于,所述获取待识别视频中任一行人对应的人体关键点特征向量序列,包括: 获取待识别视频,所述待识别视频中包括若干个行人; 对所述待识别视频进行采样,得到多帧图像并组成采样图像序列; 将所述采样图像序列输入至人体关键点检测模型,得到所述待识别视频中任一行人对应的人体关键点特征向量序列。 3.根据权利要求1所述的方法,其特征在于,所述将所述人体关键点特征向量序列输入至目标神经网络,之前还包括: 获取多个样本视频和每一样本视频中每一行人对应的行人身份标签,并获取每一样本视频中每一行人对应的人体关键点特征向量序列; 将每一行人对应的人体关键点特征向量序列和行人身份标签的组合作为一个训练样本,得到多个训练样本并组成训练集; 通过所述训练集对原始神经网络进行训练,得到所述目标神经网络。 4.根据权利要求3所述的方法,其特征在于,所述通过所述训练集对原始神经网络进行训练,得到所述目标神经网络,包括: 将所述训练集中的任一训练样本输入至所述原始神经网络,根据所述原始神经网络的输出结果和所述训练样本中的行人身份标签计算所述原始神经网络的损失值; 若所述损失值小于第一预设阈值,则将所述原始神经网络作为所述目标神经网络。 5.根据权利要求3所述的方法,其特征在于,所述通过所述训练集对原始神经网络进行训练,得到所述目标神经网络,包括: 将所述训练集中的任一训练样本输入至所述原始神经网络,根据所述原始神经网络的输出结果和所述训练样本中的行人身份标签计算所述原始神经网络的损失值; 若所述损失值小于第一预设阈值,则将所述原始神经网络作为候选神经网络; 多次调整所述神经网络的结构,每调整一次则重复执行训练过程以得到对应的候选神经网络,并从得到的多个候选神经网络中选择一个作为所述目标神经网络。 6.根据权利要求5所述的方法,其特征在于,所述从得到的多个候选神经网络中选择一个作为所述目标神经网络,包括: 从所述多个候选神经网络中,选择损失值小于第二预设阈值的若干个候选神经网络; 基于验证集对所述若干个候选神经网络中的每一候选神经网络进行验证,得到每一候选神经网络的准确率,并将准确率最高的候选神经网络作为所述目标神经网络。 7.根据权利要求1-6任一所述的方法,其特征在于,所述目标神经网络为长短期记忆网络。 8.一种步态识别装置,其特征在于,包括: 2

内存型号说明

Samsung 具体含义解释 主要含义: 第1位——芯片功能K,代表是内存芯片。 第2位——芯片类型4,代表DRAM。 第3位——芯片的更进一步的类型说明,S代表SDRAM、H代表DDR、G代表SGRAM 、T代表DDR2 DRAM、D表示GDDR1(显存颗粒)。 第4、5位——容量和刷新速率,容量相同的内存采用不同的刷新速率,也会使用不同的编号。64、62、63、65、66、67、6A代表64Mbit的容量;28、27、2A 代表128Mbit的容量;56、55、57、5A代表256Mbit的容量;51代表512Mbit 的容量。 第6、7位——数据线引脚个数,08代表8位数据;16代表16位数据;32代表32位数据;64代表64位数据。 第8位——为一个数字,表示内存的物理Bank,即颗粒的数据位宽,有3和4两个数字,分别表示4Banks和8Banks。对于内存而言,数据宽度×芯片数量=数据位宽。这个值可以是64或128,对应着这条内存就是1个或2个bank。例如256M内存32×4格式16颗芯片:4×16=64,双面内存单bank;256M内存 16M×16格式 8颗芯片:16×8=128,单面内存双bank。所以说单或双bank和内存条的单双面没有关系。另外,要强调的是主板所能支持的内存仅由主板芯片组决定。内存芯片常见的数据宽度有4、8、16这三种,芯片组对于不同的数据宽度支持的最大数据深度不同。所以当数据深度超过以上最大值时,多出的部分主板就会认不出了,比如把256M认成128M就是这个原因,但是一般还是可以正常使用。 第9位——由一个字符表示采用的电压标准,Q:SSTL-1.8V (1.8V,1.8V)。与DDR的2.5V电压相比,DDR2的1.8V是内存功耗更低,同时为超频留下更大的空间。 第10位——由一个字符代表校订版本,表示所采用的颗粒所属第几代产品,M 表示1st,A-F表示2nd-7th。目前,长方形的内存颗粒多为A、B、C三代颗粒,而现在主流的FBGA颗粒就采用E、F居多。靠前的编号并不完全代表采用的颗粒比较老,有些是由于容量、封装技术要求而不得不这样做的。 第11位——连线“-”。 第12位——由一个字符表示颗粒的封装类型,有G,S:FBGA(Leaded)、Z,Y:FBGA(Leaded-Free)。目前看到最多的是TSOP和FBGA两种封装,而FBGA是主流(之前称为mBGA)。其实进入DDR2时代,颗粒的封装基本采用FBGA了,因为TSOP封装的颗粒最高频率只支持到550MHz,DDR最高频率就只到400MHz,像DDR2 667、800根本就无法实现了。 第13位——由一个字符表示温控和电压标准,“C”表示Commercial Temp.( 0°C ~ 85°C) & Normal Power,就是常规的1.8V电压标准;“L”表示Commercial Temp.( 0°C ~ 85°C) & Low Power,是低电压版,适合超频,

实验三存储管理实验

实验三存储管理实验 Pleasure Group Office【T985AB-B866SYT-B182C-BS682T-STT18】

实验三存储管理实验 一. 目的要求: 1、通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法。 2、通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。二.实验内容: 1、设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。 可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。 算法描述: 本算法将内存的用户区分成大小相等的四个的分区,设一张分区说明表用来记录分区,其中分区的表项有分区的大小、起始地址和分区的状态,当系统为某个作业分配主存空间时,根据所需要的内存容量,在分区表中找到一个足够大的空闲分区分配给它,然后将此作业装入内存。如果找不到足够大的空闲分区,则这个作业暂时无法分配内存空间,系统将调度另一个作业。当一个作业运行结束时,系统将回收改作业所占据的分区并将该分区改为空闲。 算法原程序 #include "" #include "" #include <>

#include <> #define PCB_NUM 5 行程序."); printf("\n\t\t\t0.退出程序."); scanf("%d",&m); switch(m) { case1: break; case0: system("cls"); menu(); break; default: system("cls"); break; } } void paixu(struct MemInf* ComMem,int n) { int i,j,t; for(j=0; jComMem[i+1].size) { t=ComMem[i].size; ComMem[i].size=ComMem[i+1].size; ComMem[i+1].size=t; } } void paixu2() { int i,j,t; for(j=0; j<4; j++) for(i=0; i<4-j; i++) if(pcbList[i].size>pcbList[i+1].size) { t=pcbList[i].size; pcbList[i].size=pcbList[i+1].size; pcbList[i+1].size=t; } } void main() { DD: menu();

内存芯片参数介绍

内存芯片参数介绍 具体含义解释: 例:SAMSUNG K4H280838B-TCB0 主要含义: 第1位——芯片功能K,代表是内存芯片。 第2位——芯片类型4,代表DRAM。 第3位——芯片的更进一步的类型说明,S代表SDRAM、H代表DDR、G代表SGRAM。 第4、5位——容量和刷新速率,容量相同的内存采用不同的刷新速率,也会使用不同的编号。64、62、63、65、66、67、6A代表64Mbit的容量;28、27、2A代表128Mbit 的容量;56、55、57、5A代表256MBit的容量;51代表512Mbit的容量。 第6、7位——数据线引脚个数,08代表8位数据;16代表16位数据;32代表32位数据;64代表64位数据。 第11位——连线“-”。 第14、15位——芯片的速率,如60为6ns;70为7ns;7B为7.5ns (CL=3);7C 为7.5ns (CL=2) ;80为8ns;10 为10ns (66MHz)。 知道了内存颗粒编码主要数位的含义,拿到一个内存条后就非常容易计算出它的容量。例如一条三星DDR内存,使用18片SAMSUNG K4H280838B-TCB0颗粒封装。颗粒编号第4、5位“28”代表该颗粒是128Mbits,第6、7位“08”代表该颗粒是8位数据带宽,这样我们可以计算出该内存条的容量是128Mbits(兆数位)× 16片/8bits=256MB(兆字节)。 注:“bit”为“数位”,“B”即字节“byte”,一个字节为8位则计算时除以8。关于内存容量的计算,文中所举的例子中有两种情况:一种是非ECC内存,每8片8位数据宽度的颗粒就可以组成一条内存;另一种ECC内存,在每64位数据之后,还增加了8位的ECC 校验码。通过校验码,可以检测出内存数据中的两位错误,纠正一位错误。所以在实际计算容量的过程中,不计算校验位,具有ECC功能的18片颗粒的内存条实际容量按16乘。在购买时也可以据此判定18片或者9片内存颗粒贴片的内存条是ECC内存。 Hynix(Hyundai)现代 现代内存的含义: HY5DV641622AT-36 HY XX X XX XX XX X X X X X XX 1 2 3 4 5 6 7 8 9 10 11 12 1、HY代表是现代的产品 2、内存芯片类型:(57=SDRAM,5D=DDR SDRAM); 3、工作电压:空白=5V,V=3.3V,U=2.5V 4、芯片容量和刷新速率:16=16Mbits、4K Ref;64=64Mbits、8K Ref;65=64Mbits、4K Ref;128=128Mbits、8K Ref;129=128Mbits、4K Ref;256=256Mbits、16K Ref; 257=256Mbits、8K Ref 5、代表芯片输出的数据位宽:40、80、16、32分别代表4位、

主板芯片和内存映射

astrotycoon 大道至简,贵在恒久力行

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

(补充: 北桥芯片用于与CPU、内存和AGP视频接口,这些接口具有很高的传输速率。北桥芯片还起着存储器控制作用,因此Intel把该芯片标号为MCH(Memory Controller Hub)芯片。南桥芯片用来管理低、中速的组件,例如,PCI总线、IDE硬盘接口、USB端口等,因此南桥芯片的名称为ICH(I/O Controller Hub)) As you look at this, the crucial thing to keep in mind is that the CPU doesn’t really know anything about what it’s connected to. It talks to the outside world through its pins bu t it doesn’t care what that outside world is. It might be a motherboard in a computer but it could be a toaster, network router, brain implant, or CPU test bench. There are thre e main ways by which the CPU and the outside communicate: memory address space, I/O address space, and interrupts. We only worry about motherboards and memory for now. 正如你所看到的,其实CPU是完全不知道自己与哪些外部器件相连接的。 CPU仅仅通过自己的引脚与外界沟通,而它并不关心自己是与什么设备在沟通。或许是另一台计算机的主板,或许是烤面包机,网络路由器,脑植入医疗设备,又或许是CPU测试仪。 CPU主要通过三种方式与外界通信:内存地址空间,IO地址空间,和中断。我们目前只关注主板和内存。 In a motherboard the CPU’s gateway to the world is the front-side bus connecting it to the northbridge. Whenever the CPU needs to read or write memory it does so via this b us. It uses some pins to transmit the physical memory address it wants to write or read, while other pins send the value to be written or receive the value being read. An Intel Core 2 QX6600 has 33 pins to transmit the physical memory address (so there are 233 choices of memory locations) and 64 pins to send or receive data (so data is transmitte d in a 64-bit data path, or 8-byte chunks). This allows the CPU to physically address 64 gigabytes of memory (233 locations * 8 bytes) although most chipsets only handle up to 8 gigs of RAM. CPU通过前端总线与北桥芯片连接,作为与外界通信的桥梁。无论何时,CPU都可以通过前端总线来读写内存。 CPU通过一些引脚来传送想要读写物理内存的地址,同时通过另一些引脚来发送将要写入内存的数据或者接收从内存读取到的数据。 Intel Core 2 QX6600 用33个引脚来传送物理内存地址(因此共有233 个内存地址),并且用64个引脚来发送或接收数据(所以数据在64位通道中传输,也就是8字节的数据块)。因此C PU可以访问64G的物理内存(233*8字节),尽管多数芯片组只能处理8G大小的物理内存。 Now comes the rub. We’re used to thinking of memory only in terms of RAM, the stuff programs read from and write to all the time. And indeed most of the memory requests from the processor are routed to RAM modules by the northbridge. But not all of them. Physical memory addresses are also used for communication with assorted devices on t he motherboard (this communication is called memory-mapped I/O). These devices include video cards, most PCI cards (say, a scanner or SCSI card), and also the flash mem ory that stores the BIOS. 那么现在的问题是,通常一提起内存我们仅仅联想到RAM,以为程序一直读写的就只是RAM。的确,绝大多数来自CPU的内存访问请求都被北桥芯片映射到了RAM。但是,注意,不是全部。物理内存同样可以用来与主板上的各种设备通信(这种通信方式被称为I/O内存映射)。这些设备包括显卡,大多数PCI卡(比如,扫描仪,或者是SCSI卡),也包括存储BIOS的flash存储器。 When the northbridge receives a physical memory request it decides where to route it: should it go to RAM? Video card maybe? This routing is decided via the memory addres s map. For each region of physical memory addresses, the memory map knows the device that owns that region. The bulk of the addresses are mapped to RAM, but when the y aren’t the memory map tells the chipset which device should service requests for those addresses. This mapping of memory addresses away from RAM modules causes the c lassic hole in PC memory between 640KB and 1MB. A bigger hole arises when memory addresses are reserved for video cards and PCI devices. This is why 32-bit OSes have pr oblems using 4 gigs of RAM. In Linux the file /proc/iomem neatly lists these address range mappings. The diagram below shows a typical memory map for the first 4 gigs of p hysical memory addresses in an Intel PC:

操作系统实验之内存管理实验报告

学生学号 实验课成绩 武汉理工大学 学生实验报告书 实验课程名称 计算机操作系统 开 课 学 院 计算机科学与技术学院 指导老师姓名 学 生 姓 名 学生专业班级 2016 — 2017 学年第一学期

实验三 内存管理 一、设计目的、功能与要求 1、实验目的 掌握内存管理的相关内容,对内存的分配和回收有深入的理解。 2、实现功能 模拟实现内存管理机制 3、具体要求 任选一种计算机高级语言编程实现 选择一种内存管理方案:动态分区式、请求页式、段式、段页式等 能够输入给定的内存大小,进程的个数,每个进程所需内存空间的大小等 能够选择分配、回收操作 内购显示进程在内存的储存地址、大小等 显示每次完成内存分配或回收后内存空间的使用情况 二、问题描述 所谓分区,是把内存分为一些大小相等或不等的分区,除操作系统占用一个分区外,其余分区用来存放进程的程序和数据。本次实验中才用动态分区法,也就是在作业的处理过程中划分内存的区域,根据需要确定大小。 动态分区的分配算法:首先从可用表/自由链中找到一个足以容纳该作业的可用空白区,如果这个空白区比需求大,则将它分为两个部分,一部分成为已分配区,剩下部分仍为空白区。最后修改可用表或自由链,并回送一个所分配区的序号或该分区的起始地址。 最先适应法:按分区的起始地址的递增次序,从头查找,找到符合要求的第一个分区。

最佳适应法:按照分区大小的递增次序,查找,找到符合要求的第一个分区。 最坏适应法:按分区大小的递减次序,从头查找,找到符合要求的第一个分区。 三、数据结构及功能设计 1、数据结构 定义空闲分区结构体,用来保存内存中空闲分区的情况。其中size属性表示空闲分区的大小,start_addr表示空闲分区首地址,next指针指向下一个空闲分区。 //空闲分区 typedef struct Free_Block { int size; int start_addr; struct Free_Block *next; } Free_Block; Free_Block *free_block; 定义已分配的内存空间的结构体,用来保存已经被进程占用了内存空间的情况。其中pid作为该被分配分区的编号,用于在释放该内存空间时便于查找。size表示分区的大小,start_addr表示分区的起始地址,process_name存放进程名称,next指针指向下一个分区。 //已分配分区的结构体 typedef struct Allocate_Block { int pid; int size; int start_addr; char process_name[PROCESS_NAME_LEN]; struct Allocate_Block *next; } Allocate_Block; 2、模块说明 2.1 初始化模块 对内存空间进行初始化,初始情况内存空间为空,但是要设置内存的最大容量,该内存空间的首地址,以便之后新建进程的过程中使用。当空闲分区初始化

内存映射文件

内存映射文件: 内存映射文件有三种,第一种是可执行文件的映射,第二种是数据文件的映射,第三种是借助页面交换文件的内存映射.应用程序本身可以使用后两种内存映射. 1.可执行文件映射: Windows在执行一个Win32应用程序时使用的是内存映射文件技术.系统先在进程地址空间的0x00400000以上保留一个足够大的虚拟地址空间(0x00400000以下是由系统管理的),然后把应用程序所在的磁盘空间作为虚拟内存提交到这个保留的地址空间中去(我的理解也就是说,虚拟内存是由物理内存和磁盘上的页面文件组成的,现在应用程序所在的磁盘空间就成了虚拟地址的页面文件).做好这些准备后,系统开始执行这个应用程序,由于这个应用程序的代码不在内存中(在页面文件中),所以在执行第一条指令的时候会产生一个页面错误(页面错误也就是说,系统所访问的数据不在内存中),系统分配一块内存把它映射到0x00400000处,把实际的代码或数据读入其中(系统分配一块内存区域,把它要访问的在页面文件中的数据读入到这块内存中,需在注意是系统读入代码或数据是一页一页读入的),然后可以继续执行了.当以后要访问的数据不在内存中时,就可以通过前面的机制访问数据.对于Win32DLL的映射也是同样,不过DLL文件应该是被Win32进程共享的(我想应该被映射到x80000000以后,因为0x80000000-0xBFFFFFFF是被共享的空间). 当系统在另一个进程中执行这个应用程序时,系统知道这个程序已经有了一个实例,程序的代码和数据已被读到内存中,所以系统只需把这块内存在映射到新进程的地址空间即可,这样不就实现了在多个进程间共享数据了吗!然而这种共享数据只是针对只读数据,如果进程改写了其中的代码和数据,操作系统就会把修改的数据所在的页面复制一份到改写的进程中(我的理解也就是说共享的数据没有改变,进程改写的数据只是共享数据的一份拷贝,其它进程在需要共享数据时还是共享没有改写的数据),这样就可以避免多个进程之间的相互干扰. 2.数据文件的内存映射: 数据文件的内存映射原理与可执行文件内存映射原理一样.先把数据文件的一部分映射到虚拟地址空间的0x80000000 - 0xBFFFFFFF,但没有提交实际内存(也就是说作为页面文件),当有指令要存取这段内存时同样会产生页面错误异常.操作系统捕获到这个异常后,分配一页内存,映射内存到发生异常的位置,然后把要访问的数据读入到这块内存,继续执行刚才产生异常的指令(这里我理解的意思是把刚才产生异常的指令在执行一次,这次由于数据已经映射到内存中,指令就可以顺利执行过去),由上面的分析可知,应用程序访问虚拟地址空间时由操作系统管理数据在读入等内容,应用程序本身不需要调用文件的I/O函数(这点我觉得很重要,也就是为什么使用内存映射文件技术对内存的访问就象是对磁盘上的文件访问一样). 3.基于页面交换文件的内存映射: 内存映射的第三种情况是基于页面交换文件的.一个Win32进程利用内存映射文件可以在进程共享的地址空间保留一块区域(0x8000000 - 0xBFFFFFFF),这块区域与系统的页面交换文件相联系.我们可以用这块区域来存储临时数据,但更常见的做法是利用这块区域与其他进程通信(因为0x80000000以上是系统空间,进程切换只是私有地址空间,系统空间是所有进程共同使用的),这样多进程间就可以实现通信了.事实上Win32多进程间通信都是使用的内存映射文件技术,如PostMessage(),SentMessage()函数,在内部都使用内存映射文件技术. 使用内存映射文件的方法: 1.利用内存映射文件进行文件I/O操作: CreateFile()-->CreateFileMapping()-->MapViewOfFile()......

实验3内存管理 空闲分区表

南京信息工程大学实验(实习)报告实验(实习)名称实验3 内存管理日期 14.5.30 得分指导教师 系计软院专业软件工程年级班次姓名学号 实验3 内存管理 1、程序中使用的数据结构及符号说明。 struct form{//空闲分区表单 int startaddress;//起址 int size;//长度 char state;//状态r代表未分配,e表示空表单 }; struct work{//作业表单 int id;//作业号 int size;//申请空间大小 int from;//起址,正在执行的程序的起址,就绪程序为0k,完成程序为-1k char state;//作业状态,r表示就绪,d表示正在运作,o表示作业完成 }; 2、作业流程 【1】创建作业表 【2】创建空闲分区表 【3】为作业4申请空闲分区 【4】回收作业2、3的申请量 【5】打印作业完成情况 【6】回收作业1、4的申请量 【7】打印作业完成情况 3、打印一份源程序并附上注释。 #include #define NUM 10//表单长度 struct form{//空闲分区表单 int startaddress;//起址 int size;//长度 char state;//状态r代表未分配,e表示空表单 }; struct work{//作业表单 int id;//作业号 int size;//申请空间大小 int from;//起址 char state;//作业状态,r表示就绪,d表示正在运作,o表示作业完成 };

void showallwork(work *w){//展示所有作业情况 printf("以下是所有作业情况:\n"); printf("----------------------------------\n"); printf("作业号所需空间大小起始地址状态\n"); printf("----------------------------------\n"); for(int i = 0 ;i < 4;i++) { printf("%4d %8dk %8dk%6c\n",w[i].id ,w[i].size ,w[i].from ,w[i].state ); } printf("----------------------------------\n"); printf("《r表示就绪状态,d表示正在执行,o表示完成》"); printf("\n"); printf("\n"); } void Init_work(work *w){//初始化作业 printf(" 请输入作业号所需空间起始地址(0表示地址未分配): \n"); for(int i =0 ; i<4 ;i++) { printf(" "); scanf("%d%dk%dk",&w[i].id,&w[i].size,&w[i].from); if(w[i].from ) w[i].state = 'd'; else w[i].state = 'r'; printf("------------------------作业《%d》已经创建\n",w[i].id ); } showallwork(w); printf("初始化作业完成\n"); printf("\n"); printf("\n"); } void Init_forms(form *f){//初始化表单 printf("请输入起址长度:\n"); for(int i=0,j=1;i

内存映射和普通文件访问的区别

在讲述文件映射的概念时, 不可避免的要牵涉到虚存(SVR 4的VM). 实际上, 文件映射是虚存的中心概念, 文件映射一方面给用户提供了一组措施, 好似用户将文件映射到自己地址空间的某个部分, 使用简单的内存访问指令读写文件;另一方面, 它也可以用于内核的基本组织模式, 在这种模式种, 内核将整个地址空间视为诸如文件之类的一组不同对象的映射. 中的传统文件访问方式是, 首先用open系统调用打开文件, 然后使用read, write以及lseek等调用进行顺序或者随即的I/O. 这种方式是非常低效的, 每一次I/O操作都需要一次系统调用. 另外, 如果若干个进程访问同一个文件, 每个进程都要在自己的地址空间维护一个副本, 浪费了内存空间. 而如果能够通过一定的机制将页面映射到进程的地址空间中, 也就是说首先通过简单的产生某些内存管理数据结构完成映射的创建. 当进程访问页面时产生一个缺页中断, 内核将页面读入内存并且更新页表指向该页面. 而且这种方式非常方便于同一副本的共享. VM是面向对象的方法设计的, 这里的对象是指内存对象: 内存对象是一个软件抽象的概念, 它描述内存区与后备存储之间的映射. 系统可以使用多种类型的后备存储, 比如交换空间, 本地或者远程文件以及帧缓存等等. VM系统对它们统一处理, 采用同一操作集操作, 比如读取页面或者回写页面等. 每种不同的后备存储都可以用不同的方法实现这些操作. 这样, 系统定义了一套统一的接口, 每种后备存储给出自己的实现方法. 这样, 进程的地址空间就被视为一组映射到不同数据对象上的的映射组成. 所有的有效地址就是那些映射到数据对象上的地址. 这些对象为映射它的页面提供了持久性的后备存储. 映射使得用户可以直接寻址这些对象. 值得提出的是, VM体系结构独立于Unix系统, 所有的Unix系统语义, 如正文, 数据及堆栈区都可以建构在基本VM系统之上. 同时, VM体系结构也是独立于存储管理的, 存储管理是由操作系统实施的, 如: 究竟采取什么样的对换和请求调页算法, 究竟是采取分段还是分页机制进行存储管理, 究竟是如何将虚拟地址转换成为物理地址等等(Linux中是一种叫Three Level Page Table的机制), 这些都与内存对象的概念无关. 下面介绍Linux中 VM的实现. 一个进程应该包括一个mm_struct(memory manage struct), 该结构是进程虚拟地址空间的抽象描述, 里面包括了进程虚拟空间的一些管理信息: start_code, end_code, start_data, end_data, start_brk, end_brk等等信息. 另外, 也有一个指向进程虚存区表(vm_area_struct: virtual memory area)的指针, 该链是按照虚拟地址的增长顺序排列的. 在Linux进程的地址空间被分作许多区(vma), 每个区(vma)都对应虚拟地址空间上一段连续的区域, vma是可以被共享和保护的独立实体, 这里的vma就是前面提到的内存对象. 下面是vm_area_struct的结构, 其中, 前半部分是公共的, 与类型无关的一些数据成员, 如: 指向mm_struct的指针, 地址范围等等, 后半部分则是与类型相关的成员, 其中最重要的是一个指向vm_operation_struct向量表的指针 vm_ops, vm_pos向量表是一组虚函数, 定义了与vma类型无关的接口. 每一个特定的子类, 即每种vma类型都必须在向量表中实现这些操作. 这里包括了: open, close, unmap, protect, sync, nopage, wppage, swapout这些操作. 1.struct vm_area_struct { 2./*公共的, 与vma类型无关的 */ 3.struct mm_struct * vm_mm;

内存映射文件

内存映射文件 内存映射文件是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数(CreateFileMapping)。这样,文件内的数据就可以用内存读/写指令来访问,而不是用ReadFile和WriteFile这样的I/O系统函数,从而提高了文件存取速度。 这种函数最适用于需要读取文件并且对文件内包含的信息做语法分析的应用程序,如对输入文件进行语法分析的彩色语法编辑器,编译器等。把文件映射后进行读和分析,能让应用程序使用内存操作来操纵文件,而不必在文件里来回地读、写、移动文件指针。 有些操作,如放弃“读”一个字符,在以前是相当复杂的,用户需要处理缓冲区的刷新问题。在引入了映射文件之后,就简单的多了。应用程序要做的只是使指针减少一个值。 映射文件的另一个重要应用就是用来支持永久命名的共享内存。要在两个应用程序之间共享内存,可以在一个应用程序中创建一个文件并映射之,然后另一个应用程序可以通过打开和映射此文件把它作为共享的内存来使用。 VC++中使用内存映射文件处理大文件(1) 关键词:VC++ 内存映射 阅读提示:本文给出了一种方便实用的解决大文件的读取、存储等处理的方法,并结合相关程序代码对具体的实现过程进行了介绍。 引言 文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC 提供的CFile类等。一般来说,以上这些函数可以满足大多数场合的要求,但是对于某些特殊应用领域所需要的动辄几十GB、几百GB、乃至几TB的海量存储,再以通常的文件处理方法进行处理显然是行不通的。目前,对于上述这种大文件的操作一般是以内存映射文件的方式来加以处理的,本文下面将针对这种Windows核心编程技术展开讨论。 内存映射文件 内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页文件,而且在对该文件进行操作之前必须首先对文件进行映射,就如同将整个文件从磁盘加载到内存。由此可以看出,使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。另外,实际工程中的系统往往需要在多个进程之间共享数据,如果数据量小,处理方法是灵活多变的,如果共享数据容量巨大,那么就需要借助于内存映射文件来进行。实际上,内存映射文件正是解决本地多个进程间数据共享的最有效方法。 内存映射文件并不是简单的文件I/O操作,实际用到了Windows的核心编程技术--内存管理。所以,如果想对内存映射文件有更深刻的认识,必须对Windows操作系统的内存管理机制有清楚的认识,内存管理的相关知识非常复杂,超出了本文的讨论范畴,

相关主题