‘壹’ 如何将内存的一部分内容映射成一个文件
内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页文件,而且在对该文件进行操作之前必须首先对文件进行映射,就如同将整个文件从磁盘加载到内存。由此可以看出,使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。另外,实际工程中的系统往往需要在多个进程之间共享数据,如果数据量小,处理方法是灵活多变的,如果共享数据容量巨大,那么就需要借助于内存映射文件来进行。实际上,内存映射文件正是解决本地多个进程间数据共享的最有效方法。
内存映射文件并不是简单的文件I/O操作,实际用到了Windows的核心编程技术--内存管理。所以,如果想对内存映射文件有更深刻的认识,必须对Windows操作系统的内存管理机制有清楚的认识,下面给出使用内存映射文件的一般方法:
首先要通过CreateFile()函数来创建或打开一个文件内核对象,这个对象标识了磁盘上将要用作内存映射文件的文件。在用CreateFile()将文件映像在物理存储器的位置通告给操作系统后,只指定了映像文件的路径,映像的长度还没有指定。为了指定文件映射对象需要多大的物理存储空间还需要通过CreateFileMapping()函数来创建一个文件映射内核对象以告诉系统文件的尺寸以及访问文件的方式。在创建了文件映射对象后,还必须为文件数据保留一个地址空间区域,并把文件数据作为映射到该区域的物理存储器进行提交。由MapViewOfFile()函数负责通过系统的管理而将文件映射对象的全部或部分映射到进程地址空间。此时,对内存映射文件的使用和处理同通常加载到内存中的文件数据的处理方式基本一样,在完成了对内存映射文件的使用时,还要通过一系列的操作完成对其的清除和使用过资源的释放。这部分相对比较简单,可以通过UnmapViewOfFile()完成从进程的地址空间撤消文件数据的映像、通过CloseHandle()关闭前面创建的文件映射对象和文件对象。
‘贰’ 求C语言内存数据读取代码
#include<stdlib.h>
#include<string.h>
int mem(void*souceptr,void*destptr,int infolen)
{
return memcpy(destptr,souceptr,infolen);// 复制源去目标地址,位数为Infolen
}
‘叁’ cpu怎么知道某个内存地址对应的哪个物理内存块的另外,已知地址后,读取数据的原理是什么
你的问题挺有意思,说下我个人理解,交流一下。问题可以转化为内存地址、内存空间、寻址的问题。这些是从硬件的角度实现的,所以从硬件角度会比较好理解。
一、是否有个专门的硬件或机制来存储内存的地址和实际物理内存单元的对应关系?
虽然说 内存地址一个编号,代表一个内存空间;内存的地址和空间是一一对应且永久绑定的;但内存有地址却没有目录。为什么没有呢?因为划不来。
一个内存地址代表一个字节(8bit)的存储空间,但存储一个地址需要4个字节(以32位为例),如果做个对应表那就是亏大了。那么,怎么告诉CPU去哪个地址取数据呢?这就是你说的另一个问题。
二、cpu怎么知道某个内存地址对应的哪个物理内存块的?
其实cpu是不知道的(呵呵,别拍我-_-!!),cpu是个只有夹娃娃机智商的快递员。
假设cpu是个快递员(指读取数据部分),那内存就是个蜂巢柜。内存就好像是一些格子,比如一个3行3列的柜子,一共9格(0是起始位置,后面用到)。
0
123
456
789
我们想拿出2行2列的数据,那么怎么告诉cpu呢?重点来了,cpu是个只有夹娃娃机智商的快递员。
方法一:我们告诉CPU快递,请你拿出第2行第2列的数据,然儿CPU是个没目录的2货,这超出了他理解的范围,没懂。
方法二:我们只好直接命令cpu(假设cpu手放起始位置0):右移2格,下移2格,拿出。这样cpu就听懂了,因为它就是个夹娃娃机的智商,只能用夹娃娃机的方式工作。
‘肆’ DSP中有个映射文件的概念,那么映射是什么意思请详细解答!!谢谢!!
dsp软件开发的第一步是对可用存储空间的分析,存储空间分配好坏关系到一个dsp程序员的水平。对于dsp,我们有两种名称的存储空间,一种是物理空间,另一种是映射空间。物理空间是dsp上可以存放数据和程序的实际空间(包括外部存储器),我们的数据和程序最终放到物理空间上,但我们并不能直接访问它们。我们要访问物理空间,必须借助于映射空间才行!!但是映射空间本身是个“虚”空间,是个不存在的空间。所以,往往是映射空间远远大于实际的物理空间,有些映射空间,如io映射空间,它本身还代表了一种接口。只有那些物理空间映射到的映射空间才是我们真正可访问(读或写)的存储空间。
‘伍’ 数据存储形式有哪几种
【块存储】
典型设备:磁盘阵列,硬盘
块存储主要是将裸磁盘空间整个映射给主机使用的,就是说例如磁盘阵列里面有5块硬盘(为方便说明,假设每个硬盘1G),然后可以通过划逻辑盘、做Raid、或者LVM(逻辑卷)等种种方式逻辑划分出N个逻辑的硬盘。(假设划分完的逻辑盘也是5个,每个也是1G,但是这5个1G的逻辑盘已经于原来的5个物理硬盘意义完全不同了。例如第一个逻辑硬盘A里面,可能第一个200M是来自物理硬盘1,第二个200M是来自物理硬盘2,所以逻辑硬盘A是由多个物理硬盘逻辑虚构出来的硬盘。)
接着块存储会采用映射的方式将这几个逻辑盘映射给主机,主机上面的操作系统会识别到有5块硬盘,但是操作系统是区分不出到底是逻辑还是物理的,它一概就认为只是5块裸的物理硬盘而已,跟直接拿一块物理硬盘挂载到操作系统没有区别的,至少操作系统感知上没有区别。
此种方式下,操作系统还需要对挂载的裸硬盘进行分区、格式化后,才能使用,与平常主机内置硬盘的方式完全无异。
优点:
1、 这种方式的好处当然是因为通过了Raid与LVM等手段,对数据提供了保护。
2、 另外也可以将多块廉价的硬盘组合起来,成为一个大容量的逻辑盘对外提供服务,提高了容量。
3、 写入数据的时候,由于是多块磁盘组合出来的逻辑盘,所以几块磁盘可以并行写入的,提升了读写效率。
4、 很多时候块存储采用SAN架构组网,传输速率以及封装协议的原因,使得传输速度与读写速率得到提升。
缺点:
1、采用SAN架构组网时,需要额外为主机购买光纤通道卡,还要买光纤交换机,造价成本高。
2、主机之间的数据无法共享,在服务器不做集群的情况下,块存储裸盘映射给主机,再格式化使用后,对于主机来说相当于本地盘,那么主机A的本地盘根本不能给主机B去使用,无法共享数据。
3、不利于不同操作系统主机间的数据共享:另外一个原因是因为操作系统使用不同的文件系统,格式化完之后,不同文件系统间的数据是共享不了的。例如一台装了WIN7/XP,文件系统是FAT32/NTFS,而Linux是EXT4,EXT4是无法识别NTFS的文件系统的。就像一只NTFS格式的U盘,插进Linux的笔记本,根本无法识别出来。所以不利于文件共享。
【文件存储】
典型设备:FTP、NFS服务器
为了克服上述文件无法共享的问题,所以有了文件存储。
文件存储也有软硬一体化的设备,但是其实普通拿一台服务器/笔记本,只要装上合适的操作系统与软件,就可以架设FTP与NFS服务了,架上该类服务之后的服务器,就是文件存储的一种了。
主机A可以直接对文件存储进行文件的上传下载,与块存储不同,主机A是不需要再对文件存储进行格式化的,因为文件管理功能已经由文件存储自己搞定了。
优点:
1、造价交低:随便一台机器就可以了,另外普通以太网就可以,根本不需要专用的SAN网络,所以造价低。
2、方便文件共享:例如主机A(WIN7,NTFS文件系统),主机B(Linux,EXT4文件系统),想互拷一部电影,本来不行。加了个主机C(NFS服务器),然后可以先A拷到C,再C拷到B就OK了。(例子比较肤浅,请见谅……)
缺点:
读写速率低,传输速率慢:以太网,上传下载速度较慢,另外所有读写都要1台服务器里面的硬盘来承担,相比起磁盘阵列动不动就几十上百块硬盘同时读写,速率慢了许多。
【对象存储】
典型设备:内置大容量硬盘的分布式服务器
对象存储最常用的方案,就是多台服务器内置大容量硬盘,再装上对象存储软件,然后再额外搞几台服务作为管理节点,安装上对象存储管理软件。管理节点可以管理其他服务器对外提供读写访问功能。
之所以出现了对象存储这种东西,是为了克服块存储与文件存储各自的缺点,发扬它俩各自的优点。简单来说块存储读写快,不利于共享,文件存储读写慢,利于共享。能否弄一个读写快,利 于共享的出来呢。于是就有了对象存储。
首先,一个文件包含了了属性(术语叫metadata,元数据,例如该文件的大小、修改时间、存储路径等)以及内容(以下简称数据)。
以往像FAT32这种文件系统,是直接将一份文件的数据与metadata一起存储的,存储过程先将文件按照文件系统的最小块大小来打散(如4M的文件,假设文件系统要求一个块4K,那么就将文件打散成为1000个小块),再写进硬盘里面,过程中没有区分数据/metadata的。而每个块最后会告知你下一个要读取的块的地址,然后一直这样顺序地按图索骥,最后完成整份文件的所有块的读取。
这种情况下读写速率很慢,因为就算你有100个机械手臂在读写,但是由于你只有读取到第一个块,才能知道下一个块在哪里,其实相当于只能有1个机械手臂在实际工作。
而对象存储则将元数据独立了出来,控制节点叫元数据服务器(服务器+对象存储管理软件),里面主要负责存储对象的属性(主要是对象的数据被打散存放到了那几台分布式服务器中的信息),而其他负责存储数据的分布式服务器叫做OSD,主要负责存储文件的数据部分。当用户访问对象,会先访问元数据服务器,元数据服务器只负责反馈对象存储在哪些OSD,假设反馈文件A存储在B、C、D三台OSD,那么用户就会再次直接访问3台OSD服务器去读取数据。
这时候由于是3台OSD同时对外传输数据,所以传输的速度就加快了。当OSD服务器数量越多,这种读写速度的提升就越大,通过此种方式,实现了读写快的目的。
另一方面,对象存储软件是有专门的文件系统的,所以OSD对外又相当于文件服务器,那么就不存在文件共享方面的困难了,也解决了文件共享方面的问题。
所以对象存储的出现,很好地结合了块存储与文件存储的优点。
最后为什么对象存储兼具块存储与文件存储的好处,还要使用块存储或文件存储呢?
1、有一类应用是需要存储直接裸盘映射的,例如数据库。因为数据库需要存储裸盘映射给自己后,再根据自己的数据库文件系统来对裸盘进行格式化的,所以是不能够采用其他已经被格式化为某种文件系统的存储的。此类应用更适合使用块存储。
2、对象存储的成本比起普通的文件存储还是较高,需要购买专门的对象存储软件以及大容量硬盘。如果对数据量要求不是海量,只是为了做文件共享的时候,直接用文件存储的形式好了,性价比高。
‘陆’ 计算机c盘是内存中的一个区域,c盘中的文件都存放在内存中吗
不是,C盘只是硬盘的一个分区而已,家用硬盘一般分2-4个分区(C、D、E、F)并且常把C盘作为引导盘,在操作系统启动时首先从C盘将必要的文件“读取”(加载)到内存中,然后CPU直接从内存中读取数据然后“指导”系统启动。
答疑:
CPU问什么不直接从硬盘中读取数据呢?
是这样,CPU、内存、硬盘的运行速度排序是这样:CPU核心>一级缓存>二级缓存>三级缓存>内存>硬盘,在硬盘暂不发达的现阶段,如果不经过速度较高的RAM而直接从硬盘中读取数据,那操作系统运行会慢的让你难以忍受。
C盘中的所有文件都被“放到”内存中吗?
不是。只是将必要的文件加载到内存中,如果在系统在内存中找不到所需的数据时才会到硬盘中去寻找
其他配置相同但一台内存大一台内存小,是内存越大系统相对越流畅吗?
是的,内存作为最大的缓存理论上大一些比较好。
‘柒’ 请教如何在vxworks上构建文件系统
Tornado之TrueFFS编程者指南(一)
seasoblue
按:这篇文章主要根据tornado2.0 for Arm的在线帮助写成,前面大部分是翻译过来的,后面将详细介绍MTD驱动的编写,并会给出实际的例子。TrueFFS对于作嵌入式系统来说非常有用,我希望这儿的每一个开发者都能掌握它。我对TrueFFS的研究还很浅薄,所以如果有信口开河的地方还请大方之家斧正。如果能对大家有所帮助,也就无枉此笔了。
一. 概述
1.简介
Tornado的TrueFFS是和vxworks兼容的一种M-Systems Flite实现方式,版本为2.0。它为种类繁多的flash存储设备提供了统一的块设备接口,并且具有可重入、线程安全的特点,支持大多数流行的CPU构架。
有了Tornado的TrueFFS,应用程序对flash存储设备的读写就好象它们对拥有MS-DOS文件系统的磁盘设备的操作一样。这样TrueFFS就屏蔽了下层存储介质的差异,为开发者提供了统一的接口方式。然而,当你设计一个嵌入式系统的时候,了解flash存储器和磁盘设备的不同之处还是很重要的。尽管flash存储器不可能适用于所有的嵌入式系统,但由于flash存储器具有体积小,耗电省,非易失存储的特性,在许多的环境下尤其在移动设备和手持设备领域里它成为了理想的选择。
Flash存储器在拥有众多优点的同时也有一些自身的缺点。首先,它在写之前必须要进行擦除操作,而且不能一个字节一个字节的擦,它只能以一个扇区、一个块或者整片的方式进行擦操作。它的写和擦操作都需要较复杂的步骤才能完成,这就降低了它的易使用性。另外,Flash存储器最大的一个缺点就是寿命有限,可擦除的次数因不同厂商而有所不同,一般都在1万到10万次左右。
一个运行在flash存储器上性能良好的块设备应该能针对可移动的媒体(如flash卡)处理各种复杂的情况。比如,完全有这样的可能:当驱动程序正在进行写操作时用户却把flash卡抽出来了。这有时会造成灾难性的后果。幸运的是,TrueFFS在设计时已经仔细考虑了flash存储器的各种特性,以及掉电和用户由于不耐烦或好奇的原因而猛地拔出flash卡想看看发生了什么事的情况。
2.TrueFFS和块数据
Flash存储器不能无限次重复使用。它的每个扇区的擦除次数虽然很大,但却有限。因此,随着使用次数的加长,它最终会变成只读状态。所以我们应该尽最大可能延长它的寿命。行之有效的方*就是平衡使用所有的存储单元,而不让某一单元过度使用。这种技术被称之为wear leveling。TrueFFS使用一种基于一张动态维护表的block-to-flash(块对应于flash)传输系统来实现wear leveling技术。当块数据被修改、移动,或碎片回收后,这张维护表会自动调整。
就象块设备驱动需要的那样,TrueFFS把flash存储空间映射到一个特殊的连续存储块队列中,以便文件系统可以对它进行数据的读写。这些块被从0开始连续编号。
从一个数据块中读取数据的操作非常直接。文件系统请求指定块的内容,TrueFFS响应后将块号传送到flash存储匹配器(flash memory coordinates)中,找到之上的数据,然后把数据返回给文件系统。向块写数据也一样的直接,只要这个块还没有被写过。TrueFFS要作的就是传送块号到flash存储匹配器(flash memorycoordinates)中,并写数据到所指定的地址。
但如果写请求试图修改一个已经写过了的块设备内容,情况就复杂了。TrueFFS先是找到flash空间中一个已经可写的区域,然后把修改后的块数据写到那里。当数据安全地写完后,TrueFFS更新它的block-to-flash映射结构,以使块现在映射的区域为放置修改后数据的区域。这就保证了一定程度上的wear leveling。然而,如果存储在flash上的一些数据本质上是静态的,只有在修改时wear leveling才会产生一种被称为静态文件锁定的问题。
存储这些静态数据的区域根本不会被*循使用,这将降低flash期望的生命值。TrueFFS通过强制转移静态区域的方*成功克服了静态文件锁定的问题。因为block-to-flash映射表是动态的,TrueFFS能够以对文件系统不可见的方式管理这些wear-leveling转移。由于绝对强制wear-leveling方式会对性能产生一些负面的影响,所以TrueFFS采取了一种非绝对wear-leveling的算*。它保证了所有空间的使用近似平等。
最后,TrueFFS的wear-leveling算*更增强了突破被称为死锁这种模式的性能。
所谓死锁就是一些简单的wear-leveling算*只是两个或多个单元长时间循环而忽略了其余的单元的现象。
3.碎片回收
块数据的修改使得flash的一些块区域不再包含合*的数据,并且这些区域在擦除之前变得不可写。如果没有机制来回收这些区域,flash很快就会变成只读的状态了。不幸的是由于这些块不可以单独擦除,回收这些块就有些复杂了。单次擦除被限制在一个叫作擦除单元(erase unit)的较大范围内。如对于Intel的flash器件来说是64k字节。
TrueFFS使用一种被称为碎片回收(garbage collection)的机制来回收那些不再包含有效数据的块。该机制从一个预擦除单元(source erase unit)内拷贝所有的有效数据块到另一个新的被称为转移单元(transferunit)的擦除单元。TrueFFS然后更新block-to-flash映射表再擦除这个废旧的预擦除单元。
这样,原来的块出现在外界时仍然包含了原来的数据,虽然这些数据现在已经存放在flash存储器的其它空间。
怎样触发碎片回收功能呢?如果太频繁,则会降低wear-leveling的效果,并影响整个flash的性能。因此在TrueFFS内部,碎片回收只是在块分配算*需要的时候才会触发。块分配算*尽量保持在同一个擦除单元(erase unit)内有一段连续的自块池。如果块池变得太小,块分配算*就会马上采用碎片回收算*进行碎片回收。然后碎片回收算*就会找到并回收和下面标准最吻合的擦除单元(erase unit):
l 废块最多
l 擦除周期数据最少
l 最静态的区域
另外,碎片回收算*也会采用随机选择的处理方*。这样可以保证回收处理能够均匀地覆盖整修存储空间,而不会由于应用程序使用数据的方式而偏差。
‘捌’ 内存映射是怎么回事
内存映射文件是由一个文件到一块内存的映射,使进程虚拟地址空间的某个区域与磁盘上某个文件的部分或全部内容的建立映射。
建立映射后,通过该区域可以直接对被映射的磁盘文件进行访问.而不必执行文件I/O操作也无需对文件内容进行缓冲处理。
就好像整个被映射的文件都加载到了内存一样,因此内存文件映射非常适合于用来管理大文件。
内存映射文件对程序的提速,只在处理大文件或非常频繁的文件读写操作时效果才明显。
通过内存映射,相当于将磁盘上的文件所在空间建立成一块虚拟内存,程序访问时可按内存的方式进行,省去了普通io方式的一些环节,其实真正要读写操作时,会进行换页,将这些个“虚拟内存”读到物理内存中。
总之,内存映射文件是应用虚拟内存的技术来达到加速处理的
‘玖’ 嵌入式系统中的存储器映射是怎么回事,为什么要映射
我是这样理解的:
存储器空间是和硬件相关联的,可以对某些地址上写数据来控制硬件,为了方便使用(总不可能都用地址来直接控制,那样就工作量就太大了),将这些地址赋予了一些变量名,通过变量名来控制硬件(也就是寄存器的概念)。
‘拾’ 内存里的数据和显存里的数据关系是映射吗
不是映射关系,因为内存空间里有一块空间是固定作为向显卡转移数据用的,数据转移至显卡的显存后,内存数据就被丢弃,因此不存在映射关系,只是单纯的转移。