搜档网
当前位置:搜档网 › 认识4G地址空间的局限MMIO内存映射的问题

认识4G地址空间的局限MMIO内存映射的问题

认识4G地址空间的局限MMIO内存映射的问题
认识4G地址空间的局限MMIO内存映射的问题

室内设计之储存空间设计技巧

室内设计之储存空间设计技巧 随着人们生活水平的提高,物质方面的需求也越来越丰富。因此,家庭中的储藏空间也越来越受重视。 储存空间设计主要是充分利用被忽视的空间,归纳起来主要是对闲置的角落,未被利用的家具空腹,楼梯的下部、侧部和端部,走廊的顶部等空间进行开发利用。住宅条件宽裕的,则可考虑把一个小房间或利用室内的一块空间来设置成独立储藏室。 1.储物空间的位置及时效性 设计储物空间应在如下几方面,认真分析、推敲,才能使其全面、合理、细致。 首先,储存的地点和位置直接关系到储物的使用是否便利,空间使用效率是否高。例如书籍的储存地点宜靠近经常阅读活动的沙发、床头、写字台,使人方便地拿取;化妆、清洁用具的储存地点应靠近洗手间台面、梳妆台面,并且使用者能在洗脸和梳妆时方便地拿到;而调味品的储存地点则宜靠近灶台及进行备餐活动的区域;衣物的储存应靠近卧室。 其次,考虑储物空间的使用效率,指任何一处储存空间利用得是否充分,物品的摆放是否合理。如鞋类的储藏空间的搁板应根据鞋的尺寸形状来设计,以便能更多的储存鞋;衣物的储存应结合各类衣物的特点和尺寸来选择叠放、垂挂的方式;餐具的储存空间则应认真分析各类餐具的规格、尺寸、形状,来决定摆放形式。 此外,还要考虑储存的时间性。一方面是指被储存物品使用周期的考虑,是季节性的还是每周一次,或是永久性珍藏类,或是每日都用的。另一方面,需要考虑储存空间是暂时性还是永久性,以次决定其构造是活动的还是固定。 2.储存空间的形式 储存空间的样式分为开敞式、密闭式和储藏室式三种。 (1)开敞式 开敞式的储存空间则用来陈列具有较强装饰作用值得炫耀的物品,如酒柜用来陈列种类繁多、包装精美的酒具和美酒,书柜则用来展示丰实的藏书以及各类

教你如何调整DDR内存参数

教你如何调整DDR内存参数 日期:2006-07-08 上传者:赵磊来源:https://www.sodocs.net/doc/db15146419.html, 同样的CPU,同样的频率设置,为什么别人的运行效率就比我的高呢?为什么高手能以较低CPU频率跑出更好的测试成绩呢?问题的关键就是内存参数的调校。在一般的超频中,只会调整一些基本参数,比如某超频报告中会说到内存运行状态为“520MHz、3-4-4-8 1T”,那么除频率外后5个数字就是基本参数。还有一系列参数被称之为“小参”,能起到辅助调节作用,当调节基参后仍无法提高频率,或者性能提升不明显后,调整“小参”往往会得到令人意外的惊喜。以下我们根据基本参数与小参分别介绍调校方法。 基本参数介绍 目前的内存还是使用类电容原理来存储数据,需要有充放电的过程,这个过程所带来的延迟是不可避免的。在BIOS中,所有关于内存调节的参数其实都是在调整这个充放电的时序。受颗粒品质影响,每种内存的参数几乎都不完全一样。面对这些参数,我们必须先了解其原理才能在以后的调节中做到信手拈来。以下我们讲解一些重点参数的含义。 CL CL全称CAS Latency,是数据从存储设备中输出内存颗粒的接口之间所使用的时间。一般而言是越短越好,但受于制造技术和内存控制器所限,目前的最佳值是2。

从图中,我们能够直观的看到CL值变化,对数据处理的影响。虽说在单周期内的等待的时间并不长;但在实际使用时,内存每秒要400M次以上的周期循环,此时的性能影响就相当明显了。 RAS与CAS 内存内部的存储单元是按照行(RAS)和列(CAS)排成矩阵模式,一个地址访问指令会被解码成行和列两个信号,先是行地址信号,然后是列地址信号,只有行和列地址都准备好之后才可以确定要访问的内存单元。因此内存读写第一个延迟是RAS到CAS的延迟,从行地址访问允许到读、写数据还有一个准备时间,被称为RAS转换准备时间。这也就是为什么RAS to CAS参数对性能影响要大于RAS Precharge的原因。 Tras

关于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、建议您把歌曲、视频等资料存放在外置SD卡中,可以释放手机内存空间。 3、如果以上方式操作还是不行,建议您备份手机资料,然后恢复出厂设置后尝试一下 4、下载的软件,通过“豌豆荚”设置“强制安装到SD卡中”,操作方法: 您可以在电脑上安装一个“豌豆荚”软件,然后把手机的

“USB调试”功能开启,之后用数据线把手机与电脑连接,在连接上“豌豆荚”之后,在“豌豆荚”的设置→手机管理→安装位置选择里面把位置更改成“强制安装到SD卡”,之后用“豌豆荚”软件下载自己需要的软件 第一步ROOT并安装“RE 管理器”。 第二步打开“RE 管理器”??找到“data”??“dalvik-cache”这个文件夹里面的都是系统缓存文件和卸载定制程序留下来的无用记录文件,可以放心全部删除,系统所需文件重启后能自动生成的。 不过重启的时候,时间有点久,就像第一次启动那样,系统启动加载期间,不要有任何操作,要耐心等待......系统启动加载完毕,一切正常。这时候可以看下使用前后手机空间容量对比,会发现手机内存会有大幅度提升(提醒一下,多次使用并没有效果,最好隔一段时间再清理) 第二种方法打开RE管理器,找到/data/local/目录,里面有rights和tmp两个文件夹,如果没有rights文件夹,打开tmp 文件夹,这里面都是大家之前安装失败的软件,然后清空就可以了

全面教你认识内存参数

全面教你认识内存参数 内存热点 Jany 2010-4-28

内存这样小小的一个硬件,却是PC系统中最必不可少的重要部件之一。而对于入门用户来说,可能从内存的类型、工作频率、接口类型这些简单的参数的印象都可能很模糊的,而对更深入的各项内存时序小参数就更摸不着头脑了。而对于进阶玩家来说,内存的一些具体的细小参数设置则足以影响到整套系统的超频效果和最终性能表现。如果不想当菜鸟的话,虽然不一定要把各种参数规格一一背熟,但起码有一个基本的认识,等真正需要用到的时候,查起来也不会毫无概念。 内存种类 目前,桌面平台所采用的内存主要为DDR 1、DDR 2和DDR 3三种,其中DDR1内存已经基本上被淘汰,而DDR2和DDR3是目前的主流。 DDR1内存 第一代DDR内存 DDR SDRAM 是 Double Data Rate SDRAM的缩写,是双倍速率同步动态随机存储器的意思。DDR内存是在SDRAM内存基础上发展而来的,仍然沿用SDRAM生产体系,因此对于内存厂商而言,只需对制造普通SDRAM 的设备稍加改进,即可实现DDR内存的生产,可有效的降低成本。 DDR2内存 第二代DDR内存

DDR2 是 DDR SDRAM 内存的第二代产品。它在 DDR 内存技术的基础上加以改进,从而其传输速度更快(可达800MHZ ),耗电量更低,散热性能更优良。 DDR3内存 第三代DDR内存 DDR3相比起DDR2有更低的工作电压,从DDR2的1.8V降落到1.5V,性能更好更为省电;DDR2的4bit 预读升级为8bit预读。DDR3目前最高能够1600Mhz的速度,由于目前最为快速的DDR2内存速度已经提升到800Mhz/1066Mhz的速度,因而首批DDR3内存模组将会从1333Mhz的起跳。 三种类型DDR内存之间,从内存控制器到内存插槽都互不兼容。即使是一些在同时支持两种类型内存的Combo主板上,两种规格的内存也不能同时工作,只能使用其中一种内存。 内存SPD芯片 内存SPD芯片

如何编写能够在内存中任意地址运行的程序

一般来说,编译连接之后的代码只能在固定的位置(这里的位置是指偏移地址)上执行,如果直接将其拷贝到其他位置(偏移地址跟编译时的地址不同)上运行时会发生不可预料的错误。 这是因为在汇编语言中对静态变量的寻址通常是用直接寻址方式,这种方式直接使用变量的绝对偏移地址,如果被使用的变量也随代码一起被移动到目标地址,那对该变量的访问将会是对一个无效数据的访问。比如下面这段代码: Org 100H Add SI,SI Mov AX,Var1[SI] Ret Var1 DW 0,1,2,3,4,5,6,7,8,9 它的作用是从字数组Var1中取出SI所指的那个节点的数据给AX并返回。这段程序编译后的代码如下: 0F05:0100 03F6 ADD SI,SI 0F05:0102 2E8B840801 MOV AX,CS:[SI+0108] 0F05:0107 C3 RET 0F05:0100 -00 00 01 00 02 00 03 00 ........ 0F05:0110 04 00 05 00 06 00 07 00-08 00 09 00 ............ 注意红色的数字,它就是数组Var1的绝对偏移地址。此时如果我们把子程序GetData拷贝到偏移地址200H处,可以得到如下代码: 0F05:0200 03F6 ADD SI,SI 0F05:0202 2E8B840801 MOV AX,CS:[SI+0108] 0F05:0207 C3 RET 0F05:0200 -00 00 01 00 02 00 03 00 ........ 0F05:0210 04 00 05 00 06 00 07 00-08 00 09 00 ............ 再次注意红色的数字!此时数组Var1已经被移动到偏移地址208H处,而代码中对数组的访问仍然使用的是编译时的偏移地址。如果该处的数据正好被另的模块更改过的话,后果就...... 1

各种内存概念

各种内存概念 这里需要明确的是,我们讨论的不同内存的概念是建立在寻址空间上的。 IBM推出的第一台PC机采用的CPU是8088芯片,它只有20根地址线,也就是说,它的地址空间是1MB。 PC机的设计师将1MB中的低端640KB用作RAM,供DOS及应用程序使用,高端的384KB则保留给ROM、视频适配卡等系统使用。从此,这个界限便被确定了下来并且沿用至今。低端的640KB就被称为常规内存即PC机的基本RAM区。保留内存中的低128KB是显示缓冲区,高64KB是系统BIOS(基本输入/输出系统)空间,其余192KB空间留用。从对应的物理存储器来看,基本内存区只使用了512KB芯片,占用0000至80000这512KB 地址。显示内存区虽有128KB空间,但对单色显示器(MDA卡)只需4KB就足够了,因此只安装4KB的物理存储器芯片,占用了B0000至B10000这4KB的空间,如果使用彩色显示器(CGA卡)需要安装16KB的物理存储器,占用B8000至BC000这16KB的空间,可见实际使用的地址范围都小于允许使用的地址空间。 在当时(1980年末至1981年初)这么“大”容量的内存对PC机使用者来说似乎已经足够了,但是随着程序的不断增大,图象和声音的不断丰富,以及能访问更大内存空间的新型CPU相继出现,最初的PC机和MS-DOS设计的局限性变得越来越明显。 ●1.什么是扩充内存? 到1984年,即286被普遍接受不久,人们越来越认识到640KB的限制已成为大型程序的障碍,这时,Intel和Lotus,这两家硬、软件的杰出代表,联手制定了一个由硬件和软件相结合的方案,此方法使所有PC机存取640KB以上RAM成为可能。而Microsoft刚推出Windows不久,对内存空间的要求也很高,因此它也及时加入了该行列。 在1985年初,Lotus、Intel和Microsoft三家共同定义了LIM-EMS,即扩充内存规范,通常称EMS为扩充内存。当时,EMS需要一个安装在I/O槽口的内存扩充卡和一个称为EMS的扩充内存管理程序方可使用。但是I/O插槽的地址线只有24位(ISA总线),这对于386以上档次的32位机是不能适应的。所以,现在已很少使用内存扩充卡。现在微机中的扩充内存通常是用软件如DOS中的EMM386把扩展内存模拟或扩充内存来使用。所以,扩充内存和扩展内存的区别并不在于其物理存储器的位置,而在于使用什么方法来读写它。下面将作进一步介绍。 前面已经说过扩充存储器也可以由扩展存储器模拟转换而成。EMS的原理和XMS不同,它采用了页帧方式。页帧是在1MB空间中指定一块64KB空间(通常在保留内存区内,但其物理存储器来自扩展存储器),分为4页,每页16KB。EMS存储器也按16KB分页,每次可交换4页内容,以此方式可访问全部EMS存储器。符合EMS的驱动程序很多,常用的有EMM386.EXE、QEMM、TurboEMS、386MAX等。DOS和Windows中都提供了EMM386.EXE。 ●2.什么是扩展内存? 我们知道,286有24位地址线,它可寻址16MB的地址空间,而386有32位地址线,它可寻址高达4GB的地址空间,为了区别起见,我们把1MB以上的地址空间称为扩展内存XMS(eXtend memory)。 在386以上档次的微机中,有两种存储器工作方式,一种称为实地址方式或实方式,

主板芯片和内存映射

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:

内存芯片参数介绍

内存芯片参数介绍 具体含义解释: 例: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位、

内存映射文件

内存映射文件: 内存映射文件有三种,第一种是可执行文件的映射,第二种是数据文件的映射,第三种是借助页面交换文件的内存映射.应用程序本身可以使用后两种内存映射. 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()......

mips地址空间

就是一个虚拟地址,一个物理地址。一般bootloader会连接到bfc00000,因为在MIPS上运行的程序都使用虚拟地址,而板子上的boot flash一般会被映射到物理地址1fc00000,这样上电时直接取flash的第一条指令,也就是bootloader的第一条指令。 嵌入式u-boot和mips地址空间 1.一个家用路由器的u-boot address space: memstart = 0x80000000, memsize = 0x02000000 flashstart = 0xBF000000, flashsize = 0x00400000 images in flash: u-boot:0xBF000000 ecos: 0xBF050000 linux: 0xBF0C0000 u-boot启动信息: 分析: 1.内存地址范围从0x80000000开始,到0x82000000结束。 2.u-boot被load到内存地址0x81fc0000. 3.启动流程:AP83上电后首先运行flash上面的cpu/mips/start.S这个汇编程序,并没有进入内存。接着,start.S把u-boot的代码段全部copy到内存地址0x81fc0000,并从该地址开始转入内存运行。 2.MIPS的地址空间 1.综述: 一般嵌入式的hardware有两部分存贮器,一个是RAM,另一个是ROM(flash). flash用来存放code,包括操作系统本身,当然也包括bootloader(u-boot). RAM就是相当于PC的内存了,比flash速度快的多,但掉电后会丢失所有数据,所以用作动态内存。 2.MIPS的地址空间: 32位mips的地址空间跟PC一样,是2^32=4G字节。对于嵌入式设备来说,所有的设备的地址都存在于一个地址空间。如下图:flash的地址空间一般放在Kseg1段,而RAM 的地址空间一般则放在kseg0段。

java内存空间详解

硬盘 heap stack Data code 内存 程序 操作系统代码 程序代码 New ,在堆里面为属性分配空间,初始化(String 默认值为null ) 声明的时候非配空间,初始值为null (局部变量,方法参数) 全局变量 存放程序所需要的代码 类变量,全局字符串,常量存放在数据段

Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java 在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 ◆堆:存放用new产生的数据 ◆静态域:存放在对象中用static定义的静态成员 ◆常量池:存放常量

◆非RAM存储:硬盘等永久存储空间 Java内存分配中的栈 在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。 Java内存分配中的堆 堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。 在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。引用变量就相当于是为数组或者对象起的一个名称。 引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。这也是Java 比较占内存的原因。 实际上,栈中的变量指向堆内存中的变量,这就是Java中的指针! 常量池(constant pool) 常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如: ◆类和接口的全限定名; ◆字段的名称和描述符; ◆方法和名称和描述符。 虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和floating point常量)和对其他类型,字段和

内存篇-三个影响内存性能的重要参数

内存篇-三个影响内存性能的重要参数 组装电脑选购内存时,还有一些影响其性能的重要参数需要注意,比如容量、电压和CL 值等。 ◎容量:容量是选购内存时优先考虑的性能指标,因为它代表了内存可以存储数据的多少,通常以GB 为单位。单根内存容量越大则越好。目前市面上主流的内存容量分为单条(容量为2GB、4GB、8GB、16GB)和套装(容量为2×2GB、2×4GB、2×8GB、8×4GB、4×4GB、16×2GB)两种。 ◎工作电压:内存的工作电压是指内存正常工作所需要的电压值,不同类型的内存电压不同,DDR2 内存的工作电压一般在1.8V 左右;DDR3 内存的工作电压一般在1.5V 左右;DDR4 内存的工作电压一般在1.2V 左右。电压越低,对电能的消耗越少,也就更符合目前节能减排的要求。 ◎CL 值:CL(CAS Latency,列地址控制器延迟)是指从读命令有效(在时钟上升沿发出)开始,到输出端可提供数据为止的这一段时间。对于普通用户来说,没必要太过在意CL 值,只需要了解在同等工作频率下,CL 值低的内存更具有速度优势。 小知识: 什么是内存超频?内存超频就是让内存外频运行在比它被设定的更高的速度下。一般情况下,CPU外频与内存外频是一致的,所以在提升CPU外频进行超频时,也必须相应提升内存外频,使之与CPU同频工作。内存超频技术目前在很多DDR4内存中应用,比如金士顿内存的PnP和XMP就是目前使用较多的内存自动超频技术。 CL值的含义 内存CL值通常采用4个数字表示,中间用“-”隔开,以“5-4-4-12”为例,第一个数代表CAS(Column Address Strobe)延迟时间,也就是内存存取数据所需的延迟时间,即通常说的CL值;第二个数代表RAS(Row Address Strobe)-to-CAS延迟,表示内存行地址传输到列地址的延迟时间;第三个数表示RAS Prechiarge延迟(内存行地址脉冲预充电时间);最后一个数则是Act-to-Prechiarge延迟(内存行地址选择延迟)。其中最重要的指标是第一个参数CAS,它代表内存接收到一条指令后要等待多少个时间周期才能执行任务。 1

内存地址映射的认识

内存地址映射的认识(memory map) 内存物理地址为A,即地址A 而物理地址A得地址代码又需要内存来存放,我们设地址A存的地址为地址B 所谓映射就是把存地址A代码的地址B由地址C来来指向地址B,也就是说通过C来间接的指向实际地址A 这就好比一个储藏库为A,地址代码为1111,我把这个地址代码放到B处(B里面放上A的地址代码1111),而B的地址为10000,我在把B的地址10000放到C中(01010),这样C就是对B的映射! 地址映射为了保证CPU执行指令时可正确访问存储单元,需将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址,这一过程称为地址映射地址映射原理及实现: 1、地址映射结构 在Tornado\target\h\vmLib.h文件中 typedef struct phys_mem_desc { void *virtualAddr; void *physicalAddr; UINT len; UINT initialStateMask; /* mask parameter to vmStateSet */ UINT initialState; /* state parameter to vmStateSet */ } PHYS_MEM_DESC; virtualAddr:你要映射的虚拟地址 physicalAddr:硬件设计时定义的实际物理地址 len;要进行映射的地址长度 initialStateMask:可以初始化的地址状态: 有如下状态: #define VM_STATE_MASK_VALID 0x03 #define VM_STATE_MASK_WRITABLE 0x0c #define VM_STATE_MASK_CACHEABLE 0x30 #define VM_STATE_MASK_MEM_COHERENCY 0x40 #define VM_STATE_MASK_GUARDED 0x80 不同的CPU芯片类型还有其特殊状态 initialState:实际初始化的地址状态: 有如下状态: #define VM_STATE_VALID 0x01 #define VM_STATE_VALID_NOT 0x00 #define VM_STATE_WRITABLE 0x04 #define VM_STATE_WRITABLE_NOT 0x00 #define VM_STATE_CACHEABLE 0x10 #define VM_STATE_CACHEABLE_NOT 0x00

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

在讲述文件映射的概念时, 不可避免的要牵涉到虚存(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;

相关主题