linuxmmu
Ⅰ 嵌入式linux驱动要学哪些
1、 编写Linux设备驱动要求工程师有非常好的硬件基础,懂得SRAM、Flash、SDRAM、磁盘的读写方式,UART、I2C、USB等设备的接口以及轮询、中断、DMA的原理,PCI总线的工作方式以及CPU的内存管理单元(MMU)等。
2、编写Linux设备驱动要求工程师有非常好的C语言基础,能灵活地运用C语言的结构体、指针、函数指针及内存动态申请和释放等。
3、编写Linux设备驱动要求工程师有一定的Linux内核基础,虽然并不要求工程师对内核各个部分有深入的研究,但至少要明白驱动与内核的接口。尤其是对于块设备、网络设备、Flash设备、串口设备等复杂设备,内核定义的驱动体系架构本身就非常复杂。
4、编写Linux设备驱动要求工程师有非常好的多任务并发控制和同步的基础,因为在驱动中会大量使用自旋锁、互斥、信号 量、等待队列等并发与同步机制。朱,有,鹏的驱动开发讲得还不错。
Ⅱ Uclinux是什么意思 全称是什么
uclinux表示micro-control linux.即微控制器领域中的Linux系统,是Lineo公司的主打产品,同时也是开放源码的嵌入式Linux的典范之作。uCLinux主要是针对目标处理器没有存储管理单元MMU(Memory
Management Unit)的嵌入式系统而设计的。它已经被成功地移植到了很多平台上。由于没有MMU,其多任务的实现需要一定技巧。
Linux是一种很受欢迎的操作系统,它与UNIX系统兼容,开放源代码。它原本被设计为桌面系统,现在广泛应用于服务器领域。而更大的影响在于它正逐渐的应用于嵌入式设备。uClinux正是在这种氛围下产生的。在uClinux这个英文单词中u表示Micro,小的意思,C表示Control,控制的意思,所以uClinux就是Micro-Control-Linux,字面上的理解就是"针对微控制领域而设计的Linux系统"。
Ⅲ linux 铏氭嫙鍦板潃锛屽埌搴曟庝箞鐞呜В
linux镄勮櫄𨰾熷湴鍧鍒嗕负鐗╃悊鍦板潃鍜岃櫄𨰾熷湴鍧 銆
Linux绯荤粺涓镄勭墿鐞嗗瓨鍌ㄧ┖闂村拰铏氭嫙瀛桦偍绌洪棿镄勫湴鍧锣冨洿鍒嗗埆閮芥槸浠0x00000000鍒0xFFFFFFFF锛屽叡4GB銆
1銆佺墿鐞嗗湴鍧
Linux镄勭墿鐞嗗瓨鍌ㄧ┖闂村竷灞涓庡勭悊鍣ㄧ浉鍏筹纴璇︾粏𨱍呭喌鍙浠ヤ粠澶勭悊鍣ㄧ敤鎴锋坠鍐岀殑瀛桦偍绌洪棿鍒嗗竷琛锛坢emory map锛夌浉鍏崇珷鑺备腑镆ュ埌锛屾垜杩欓噷鍙鍒楀嚭浠ヤ笅鍑犵偣娉ㄦ剰浜嬮”锛
1锛夋渶澶node鍙穘涓嶈兘澶т簬MAX_NUMNODES-1銆
2锛塎AX_NUMNODES琛ㄧず绯荤粺鏀鎸佺殑链澶歯ode鏁般傚湪ARM绯荤粺涓锛孲harp鑺鐗囨渶澶氭敮鎸16涓猲odes锛屽叾浠栬姱鐗囨渶澶氭敮鎸4涓猲odes銆
3锛塶umnodes鏄褰揿墠绯荤粺涓瀹为檯镄勫唴瀛榥ode鏁般
4锛夊湪涓嶆敮鎸丆ONFIG_DISCONTIGMEM阃夐”镄勭郴缁熶腑锛屽彧链変竴涓鍐呭瓨node銆 5锛夋渶澶bank鍙穖涓嶈兘澶т簬NR_BANKS-1銆
6锛垲R_BANKS琛ㄧず绯荤粺涓鏀鎸佺殑链澶у唴瀛榖ank鏁帮纴涓鑸绛変簬澶勭悊鍣ㄧ殑RAM鐗囬夋暟銆侫RM绯荤粺涓锛孲harp鑺鐗囨渶澶氭敮鎸16涓狰anks锛屽叾浠栬姱鐗囨渶澶氭敮鎸8涓狰anks銆
2銆佽櫄𨰾熷瓨鍌ㄧ┖闂村竷灞
鍦ㄦ敮鎸丮MU镄勭郴缁熶腑锛屽綋绯荤粺锅氩畬纭浠跺埯濮嫔寲钖庡氨浣胯兘MMU锷熻兘锛岃繖镙锋暣涓绯荤粺灏辫繍琛屽湪铏氭嫙瀛桦偍绌洪棿涓锛屽疄鐜拌櫄𨰾熷瓨鍌ㄧ┖闂村埌鐗╃悊瀛桦偍绌洪棿鏄犲皠锷熻兘镄勬槸澶勭悊鍣ㄧ殑MMU锛岃岃櫄𨰾熷瓨鍌ㄧ┖闂翠笌5璺瀛桦偍绌洪棿镄勬椠灏勫叧绯诲垯鏄鐢盠inux鍐呮牳𨱒ョ$悊镄勚32浣岖郴缁熶腑鐗╃悊瀛桦偍绌洪棿鍗4GB绌洪棿锛岃櫄𨰾熷瓨鍌ㄧ┖闂村悓镙峰崰4GB绌洪棿锛孡inux鎶婄墿鐞嗙┖闂翠腑瀹为檯瀛桦湪镄勮繙杩滃皬浜4GB镄勫唴瀛樼┖闂存椠灏勫埌鏁翠釜4GB铏氭嫙瀛桦偍绌洪棿涓闄ゆ椠灏処/O绌洪棿涔嫔栫殑鍏ㄩ儴绌洪棿锛屾墍浠ヨ櫄𨰾熷唴瀛樼┖闂磋繙杩滃ぇ浜庣墿鐞嗗唴瀛樼┖闂达纴杩椤氨璇村悓涓鍧楃墿鐞嗗唴瀛桦彲鑳芥椠灏勫埌澶氩勮櫄𨰾熷唴瀛桦湴鍧绌洪棿銆
Ⅳ Linux 内核的内存管理 - 概念
Concepts overview — The Linux Kernel documentation
Linux中的内存管理是一个复杂的系统,经过多年的发展,它包含越来越多的功能,以支持从 MMU-less microcontrollers 到 supercomputers 的各种系统。
没有MMU内存管理的系统被称为 nommu ,它值得写一份专门的文档进行描述。
尽管有些概念是相同的,这里我们假设MMU可用,CPU可以将虚拟地址转换为物理地址。
计算机系统中的物理内存是有限资源,即便支持内存热插拔,其可以安装的内存也有限的。物理内存不一定必须是连续的;它可以作为一组不同的地址范围被访问。此外,不同的CPU架构,甚至同架构的不同实现对如何定义这些地址范围都是不同的。
这使得直接处理物理内存异常复杂,为了避免这种复杂性,开发了 虚拟内存 (virtual memory) 的概念。
虚拟内存从应用软件中抽象出物理内存的细节,只允许在物理内存中保留需要的信息 (demand paging) ,并提供一种机制来保护和控制进程之间的数据共享。
通过虚拟内存,每次内存访问都访问一个 虚拟地址 。当CPU对从系统内存读取(或写入)的指令进行解码时,它将该指令中编码的虚拟地址转换为内存控制器可以理解的物理地址。
物理内存被切分为 页帧 page frames 或 页 pages 。页的大小是基于架构的。一些架构允许从几个支持的值中选择页大小;此选择在内核编译时设置到内核配置。
每个物理内存页都可以映射为一个或多个 虚拟页(virtual pages) 。映射关系描述在 页表(page tables) 中,页表将程序使用的虚拟地址转换为物理内存地址。页表以层次结构组织。
最底层的表包含软件使用的实际内存页的物理地址。较高层的表包含较低层表页的物理地址。顶层表的指针驻留在寄存器中。
当CPU进行地址转换的时候,它使用寄存器访问顶级页表。
虚拟地址的高位,用于顶级页表的条目索引。然后,通过该条目访问下级,下级的虚拟地址位又作为其下下级页表的索引。虚拟地址的最低位定义实际页内的偏移量。
地址转换需要多次内存访问,而内存访问相对于CPU速度来说比较慢。为了避免在地址转换上花费宝贵的处理器周期,CPU维护着一个称为 TLB (Translation Lookaside Buffer)的用于地址转换缓存(cache)。通常TLB是非常稀缺的资源,需要大内存工作应用程序会因为TLB未命中而影响性能。
很多现代CPU架构允许页表的高层直接映射到内存页。例如,x86架构,可以通过二级、三级页表的条目映射2M甚至1G内存页。在Linux中,这些内存页称为 大页 (Huge) 。大页的使用显着降低了TLB的压力,提高了TLB命中率,从而提高了系统的整体性能。
Linux提供两种机制开启使用大页映射物理内存。
第一个是 HugeTLB 文件系统,即 hugetlbfs 。它是一个伪文件系统,使用RAM作为其存储。在此文件系统中创建的文件,数据驻留在内存中,并使用大页进行映射。
关于 HugeTLB Pages
另一个被称为 THP (Transparent HugePages) ,后出的开启大页映射物理内存的机制。
与 hugetlbfs 不同,hugetlbfs要求用户和/或系统管理员配置系统内存的哪些部分应该并可以被大页映射;THP透明地管理这些映射并获取名称。
关于 Transparent Hugepage Support
通常,硬件对不同物理内存范围的访问方式有所限制。某些情况下,设备不能对所有可寻址内存执行DMA。在其他情况下,物理内存的大小超过虚拟内存的最大可寻址大小,需要采取特殊措施来访问部分内存。还有些情况,物理内存的尺寸超过了虚拟内存的最大可寻址尺寸,需要采取特殊措施来访问部分内存。
Linux根据内存页的使用情况,将其组合为多个 zones 。比如, ZONE_DMA 包含设备用于DMA的内存, ZONE_HIGHMEM 包含未永久映射到内核地址空间的内存, ZONE_NORMAL 包含正常寻址内存页。
内存zones的实际层次架构取决于硬件,因为并非所有架构都定义了所有的zones,不同平台对DMA的要求也不同。
多处理器机器很多基于 NUMA (Non-Uniform Memory Access system - 非统一内存访问系统 )架构。 在这样的系统中,根据与处理器的“距离”,内存被安排成具有不同访问延迟的 banks 。每个 bank 被称为一个 node ,Linux为每个 node 构造一个独立的内存管理子系统。 Node 有自己的zones集合、free&used页面列表,以及各种统计计数器。
What is NUMA?
NUMA Memory Policy
物理内存易失,将数据放入内存的常见情况是读取文件。读取文件时,数据会放入 页面缓存(page cache) ,可以在再次读取时避免耗时的磁盘访问。同样,写文件时,数据也会被放入 页面缓存 ,并最终进入存储设备。被写入的页被标记为 脏页(dirty page) ,当Linux决定将其重用时,它会将更新的数据同步到设备上的文件。
匿名内存 anonymous memory 或 匿名映射 anonymous mappings 表示没有后置文件系统的内存。这些映射是为程序的stack和heap隐式创建的,或调用mmap(2)显式创建的。通常,匿名映射只定义允许程序访问的虚拟内存区域。读,会创建一个页表条目,该条目引用一个填充有零的特殊物理页。写,则分配一个常规物理页来保存写入数据。该页将被标记为脏页,如果内核决定重用该页,则脏页将被交换出去 swapped out 。
纵贯整个系统生命周期,物理页可用于存储不同类型的数据。它可以是内核内部数据结构、设备驱动DMA缓冲区、读取自文件系统的数据、用户空间进程分配的内存等。
根据内存页使用情况,Linux内存管理会区别处理。可以随时释放的页面称为 可回收(reclaimable) 页面,因为它们把数据缓存到了其他地方(比如,硬盘),或者被swap out到硬盘上。
可回收页最值得注意的是 页面缓存 和 匿名页面 。
在大多数情况下,存放内部内核数据的页,和用作DMA缓冲区的页无法重用,它们将保持现状直到用户释放。这样的被称为 不可回收页(unreclaimable) 。
然而,在特定情况下,即便是内核数据结构占用的页面也会被回收。
例如,文件系统元数据的缓存(in-memory)可以从存储设备中重新读取,因此,当系统存在内存压力时,可以从主内存中丢弃它们。
释放可回收物理内存页并重新调整其用途的过程称为 (surprise!) reclaim 。
Linux支持异步或同步回收页,取决于系统的状态。
当系统负载不高时,大部分内存是空闲的,可以立即从空闲页得到分配。
当系统负载提升后,空闲页减少,当达到某个阈值( low watermark )时,内存分配请求将唤醒 kswapd 守护进程。它将以异步的方式扫描内存页。如果内存页中的数据在其他地方也有,则释放这些内存页;或者退出内存到后置存储设备(关联 脏页 )。
随着内存使用量进一步增加,并达到另一个阈值- min watermark -将触发回收。这种情况下,分配将暂停,直到回收到足够的内存页。
当系统运行时,任务分配并释放内存,内存变得碎片化。
虽然使用虚拟内存可以将分散的物理页表示为虚拟连续范围,但有时需要分配大的连续的物理内存。这种需求可能会提升。例如,当设备驱动需要一个大的DMA缓冲区时,或当THP分配一个大页时。
内存地址压缩(compaction ) 解决了碎片问题。
该机制将占用的页从内存zone的下部移动到上部的空闲页。压缩扫描完成后,zone开始处的空闲页就并在一起了,分配较大的连续物理内存就可行了。
与 reclaim 类似, compaction 可以在 kcompactd守护进程中异步进行,也可以作为内存分配请求的结果同步进行。
在存在负载的机器上,内存可能会耗尽,内核无法回收到足够的内存以继续运行。
为了保障系统的其余部分,引入了 OOM killer 。
OOM killer 选择牺牲一个任务来保障系统的总体健康。选定的任务被killed,以期望在它退出后释放足够的内存以继续正常的操作。
Ⅳ linux的启动的哪个环节中开始使能了mmu
MMU可以让你不再以平面的方式使用内存,然后程序地址重定位之类的才可以实现。 这是我知道的最重要的一点。
Ⅵ 璇﹁ВLinux绯荤粺鍐呭瓨瀵诲潃镄勫垎椤垫満鍒
鍒嗛〉链哄埗鍦ㄦ垫満鍒朵箣钖庤繘琛岋纴浠ュ畬鎴愮嚎镐р旂墿鐞嗗湴鍧镄勮浆鎹㈣繃绋嬨傛垫満鍒舵妸阃昏緫鍦板潃杞鎹涓虹嚎镐у湴鍧锛屽垎椤垫満鍒惰繘涓姝ユ妸璇ョ嚎镐у湴鍧鍐嶈浆鎹涓虹墿鐞嗗湴鍧銆
纭浠朵腑镄勫垎椤
鍒嗛〉链哄埗鐢盋R0涓镄凯G浣嶅惎鐢ㄣ傚侾G=1锛屽惎鐢ㄥ垎椤垫満鍒讹纴骞朵娇鐢ㄦ湰鑺傝佹弿杩扮殑链哄埗锛屾妸绾挎у湴鍧杞鎹涓虹墿鐞嗗湴鍧銆傚侾G=0锛岀佺敤鍒嗛〉链哄埗锛岀洿鎺ユ妸娈垫満鍒朵骇鐢熺殑绾挎у湴鍧褰扑綔鐗╃悊鍦板潃浣跨敤銆傚垎椤垫満鍒剁$悊镄勫硅薄鏄锲哄畾澶у皬镄勫瓨鍌ㄥ潡锛岀О涔嬩负椤 (page)銆傚垎椤垫満鍒舵妸鏁翠釜绾挎у湴鍧绌洪棿鍙婃暣涓鐗╃悊鍦板潃绌洪棿閮界湅鎴愮敱椤电粍鎴愶纴鍦ㄧ嚎镐у湴鍧绌洪棿涓镄勪换浣曚竴椤碉纴鍙浠ユ椠灏勪负鐗╃悊鍦板潃绌洪棿涓镄勪换浣曚竴椤(鎴戜滑鎶婄墿鐞嗙┖闂翠腑镄勪竴椤靛彨锅氢竴涓椤甸溃鎴栭〉妗(page frame))銆
銆銆80386 浣跨敤4K瀛楄妭澶у皬镄勯〉銆傛疮涓椤甸兘链4K瀛楄妭闀匡纴骞跺湪4K瀛楄妭镄勮竟鐣屼笂瀵归绨锛屽嵆姣忎竴椤电殑璧峰嫔湴鍧閮借兘琚4K鏁撮櫎銆傚洜姝わ纴80386鎶4G瀛楄妭镄勭嚎镐у湴鍧绌洪棿锛屽垝鍒嗕负1G涓椤甸溃锛屾疮椤垫湁4K瀛楄妭澶у皬銆傚垎椤垫満鍒堕氲繃鎶婄嚎镐у湴鍧绌洪棿涓镄勯〉锛岄吨鏂板畾浣嶅埌鐗╃悊鍦板潃绌洪棿𨱒ヨ繘琛岀$悊锛屽洜涓烘疮涓椤甸溃镄勬暣涓4K瀛楄妭浣滀负涓涓鍗曚綅杩涜屾椠灏勶纴骞朵笖姣忎釜椤甸溃閮藉归绨4K瀛楄妭镄勮竟鐣岋纴锲犳わ纴绾挎у湴鍧镄勪绠12浣岖粡杩囧垎椤垫満鍒剁洿鎺ュ湴浣滀负鐗╃悊鍦板潃镄勪绠12浣崭娇鐢ㄣ
涓轰粈涔堜娇鐢ㄤ袱绾ч〉琛
锅囱炬疮涓杩涚▼閮藉崰鐢ㄤ简4G镄勭嚎镐у湴鍧绌洪棿锛岄〉琛ㄥ叡钖1M涓琛ㄩ”锛屾疮涓琛ㄩ”鍗4涓瀛楄妭锛岄偅涔堟疮涓杩涚▼镄勯〉琛ㄨ佸崰鎹4M镄勫唴瀛樼┖闂淬备负浜呜妭鐪侀〉琛ㄥ崰鐢ㄧ殑绌洪棿锛屾垜浠浣跨敤涓ょ骇椤佃〃銆傛疮涓杩涚▼閮戒细琚鍒嗛厤涓涓椤电洰褰曪纴浣嗘槸鍙链夎瀹为檯浣跨敤椤佃〃镓崭细琚鍒嗛厤鍒板唴瀛橀噷闱銆备竴绾ч〉琛ㄩ渶瑕佷竴娆″垎閰嶆墍链夐〉琛ㄧ┖闂达纴涓ょ骇椤佃〃鍒椤彲浠ュ湪闇瑕佺殑镞跺椤啀鍒嗛厤椤佃〃绌洪棿銆
涓ょ骇椤佃〃缁撴瀯
涓ょ骇琛ㄧ粨鏋勭殑绗涓绾хО涓洪〉鐩褰曪纴瀛桦偍鍦ㄤ竴涓4K瀛楄妭镄勯〉闱涓銆傞〉鐩褰曡〃鍏辨湁1K涓琛ㄩ”锛屾疮涓琛ㄩ”涓4涓瀛楄妭锛屽苟鎸囧悜绗浜岀骇琛ㄣ傜嚎镐у湴鍧镄勬渶楂10浣(鍗充綅31~浣32)鐢ㄦ潵浜х敓绗涓绾х殑绱㈠紩锛岀敱绱㈠紩寰楀埌镄勮〃椤逛腑锛屾寚瀹氩苟阃夋嫨浜1K涓浜岀骇琛ㄤ腑镄勪竴涓琛ㄣ
涓ょ骇琛ㄧ粨鏋勭殑绗浜岀骇绉颁负椤佃〃锛屼篃鍒氩ソ瀛桦偍鍦ㄤ竴涓4K瀛楄妭镄勯〉闱涓锛屽寘钖1K涓瀛楄妭镄勮〃椤癸纴姣忎釜琛ㄩ”鍖呭惈涓涓椤电殑鐗╃悊锘哄湴鍧銆傜浜岀骇椤佃〃鐢辩嚎镐у湴鍧镄勪腑闂10 浣(鍗充綅21~浣12)杩涜岀储寮曪纴浠ヨ幏寰楀寘钖椤电殑鐗╃悊鍦板潃镄勯〉琛ㄩ”锛岃繖涓鐗╃悊鍦板潃镄勯珮20浣崭笌绾挎у湴鍧镄勪绠12浣嶅舰鎴愪简链钖庣殑鐗╃悊鍦板潃锛屼篃灏辨槸椤佃浆鍖栬繃绋嬭緭鍑虹殑鐗╃悊鍦板潃銆
銆銆椤电洰褰曢”
銆銆绗31~12浣嶆槸20浣嶉〉琛ㄥ湴鍧锛岀敱浜庨〉琛ㄥ湴鍧镄勪绠12浣嶆讳负0锛屾墍浠ョ敤楂20浣嶆寚鍑32浣嶉〉琛ㄥ湴鍧灏卞彲浠ヤ简銆傚洜姝わ纴涓涓椤电洰褰曟渶澶氩寘钖1024涓椤佃〃鍦板潃銆
绗0浣嶆槸瀛桦湪浣嶏纴濡傛灉P=1锛岃〃绀洪〉琛ㄥ湴鍧鎸囧悜镄勮ラ〉鍦ㄥ唴瀛树腑锛屽傛灉P=0锛岃〃绀轰笉鍦ㄥ唴瀛树腑銆
绗1浣嶆槸璇/鍐欎綅锛岀2浣嶆槸鐢ㄦ埛/绠$悊锻树綅锛岃繖涓や綅涓洪〉鐩褰曢”鎻愪緵纭浠朵缭鎶ゃ傚綋鐗规潈绾т负3镄勮繘绋嬭佹兂璁块梾椤甸溃镞讹纴闇瑕侀氲繃椤典缭鎶ゆ镆ワ纴钥岀壒𨱒幂骇涓0镄勮繘绋嫔氨鍙浠ョ粫杩囬〉淇濇姢銆
绗3浣嶆槸PWT(Page Write-Through)浣嶏纴琛ㄧず鏄钖﹂噰鐢ㄥ啓阃忔柟寮忥纴鍐欓忔柟寮忓氨鏄镞㈠啓鍐呭瓨(RAM)涔熷啓楂橀熺紦瀛,璇ヤ綅涓1琛ㄧず閲囩敤鍐欓忔柟寮
绗4浣嶆槸PCD(Page Cache Disable)浣嶏纴琛ㄧず鏄钖﹀惎鐢ㄩ珮阃熺紦瀛,璇ヤ綅涓1琛ㄧず钖鐢ㄩ珮阃熺紦瀛樸
绗5浣嶆槸璁块梾浣嶏纴褰揿归〉鐩褰曢”杩涜岃块梾镞讹纴A浣=1銆
绗7浣嶆槸Page Size镙囧织锛屽彧阃傜敤浜庨〉鐩褰曢”銆傚傛灉缃涓1锛岄〉鐩褰曢”鎸囩殑鏄4MB镄勯〉闱锛岃风湅钖庨溃镄勬墿灞曞垎椤点
绗9~11浣岖敱镎崭綔绯荤粺涓撶敤锛孡inux涔熸病链夊仛鐗规畩涔嬬敤銆
椤甸溃椤
銆銆80386镄勬疮涓椤电洰褰曢”鎸囧悜涓涓椤佃〃锛岄〉琛ㄦ渶澶氩惈链1024涓椤甸溃椤癸纴姣忛”4涓瀛楄妭锛屽寘钖椤甸溃镄勮捣濮嫔湴鍧鍜屾湁鍏宠ラ〉闱㈢殑淇℃伅銆傞〉闱㈢殑璧峰嫔湴鍧涔熸槸4K镄勬暣鏁板嶏纴镓浠ラ〉闱㈢殑浣12浣崭篃鐣欎綔瀹幂敤銆
绗31~12浣嶆槸20浣岖墿鐞嗛〉闱㈠湴鍧锛岄櫎绗6浣嶅栫0锝5浣嶅强9~11浣岖殑鐢ㄩ斿拰椤电洰褰曢”涓镙凤纴绗6浣嶆槸椤甸溃椤圭嫭链夌殑锛屽綋瀵规秹鍙婄殑椤甸溃杩涜屽啓镎崭綔镞讹纴D浣嶈缃1銆
4GB镄勫唴瀛桦彧链変竴涓椤电洰褰曪纴瀹冩渶澶氭湁1024涓椤电洰褰曢”锛屾疮涓椤电洰褰曢”鍙埚惈链1024涓椤甸溃椤癸纴锲犳わ纴鍐呭瓨涓鍏卞彲浠ュ垎鎴1024脳1024=1M涓椤甸溃銆傜敱浜庢疮涓椤甸溃涓4K涓瀛楄妭锛屾墍浠ワ纴瀛桦偍鍣ㄧ殑澶у皬姝eソ链澶氢负4GB銆
绾挎у湴鍧鍒扮墿鐞嗗湴鍧镄勮浆鎹
銆銆32浣岖嚎镐у湴鍧鍒扮墿鐞嗗湴鍧镄勮浆鎹
1.CR3鍖呭惈镌椤电洰褰旷殑璧峰嫔湴鍧锛岀敤32浣岖嚎镐у湴鍧镄勬渶楂10浣岮31~A22浣滀负椤电洰褰旷殑椤电洰褰曢”镄勭储寮曪纴灏嗗畠涔树互4锛屼笌CR3涓镄勯〉鐩褰旷殑璧峰嫔湴鍧鐩稿姞锛屽舰鎴愮浉搴旈〉琛ㄧ殑鍦板潃銆
2.浠庢寚瀹氱殑鍦板潃涓鍙栧嚭32浣嶉〉鐩褰曢”锛屽畠镄勪绠12浣崭负0锛岃繖32浣嶆槸椤佃〃镄勮捣濮嫔湴鍧銆傜敤32浣岖嚎镐у湴鍧涓镄𪞝21~A12浣崭綔涓洪〉琛ㄤ腑镄勯〉闱㈢殑绱㈠紩锛屽皢瀹冧箻浠4锛屼笌椤佃〃镄勮捣濮嫔湴鍧鐩稿姞锛屽舰鎴32浣嶉〉闱㈠湴鍧銆
3.灏咥11~A0浣滀负鐩稿逛簬椤甸溃鍦板潃镄勫亸绉婚噺锛屼笌32浣嶉〉闱㈠湴鍧鐩稿姞锛屽舰鎴32浣岖墿鐞嗗湴鍧銆
镓╁𪾢鍒嗛〉
浠庡旇吘澶勭悊鍣ㄥ紑濮嬶纴Intel寰澶勭悊鍣ㄥ紩杩涗简镓╁𪾢鍒嗛〉锛屽畠鍏佽搁〉镄勫ぇ灏忎负4MB銆
銆銆鍦ㄦ墿灞曞垎椤电殑𨱍呭喌涓,鍒嗛〉链哄埗鎶32浣岖嚎镐у湴鍧鍒嗘垚涓や釜锘燂细链楂10浣岖殑鐩褰曞烟鍜屽叾浣22浣岖殑锅忕Щ閲忋
椤甸溃楂橀熺紦瀛
銆銆鐢变簬鍦ㄥ垎椤垫儏鍐典笅锛屾疮娆″瓨鍌ㄥ櫒璁块梾閮借佸瓨鍙栦袱绾ч〉琛锛岃繖灏卞ぇ澶ч檷浣庝简璁块梾阃熷害銆傛墍浠ワ纴涓轰简鎻愰珮阃熷害锛屽湪386涓璁剧疆涓涓链杩戝瓨鍙栭〉闱㈢殑楂橀熺紦瀛樼‖浠舵満鍒讹纴瀹 镊锷ㄤ缭鎸32椤瑰勭悊鍣ㄦ渶杩戜娇鐢ㄧ殑椤甸溃鍦板潃锛屽洜姝わ纴鍙浠ヨ嗙洊128K瀛楄妭镄勫瓨鍌ㄥ櫒鍦板潃銆傚綋杩涜屽瓨鍌ㄥ櫒璁块梾镞讹纴鍏堟镆ヨ佽块梾镄勯〉闱㈡槸钖﹀湪楂橀熺紦瀛树腑锛屽傛灉鍦锛 灏变笉蹇呯粡杩囦袱绾ц块梾浜嗭纴濡傛灉涓嶅湪锛屽啀杩涜屼袱绾ц块梾銆傚钩鍧囨潵璇达纴椤甸溃楂橀熺紦瀛桦ぇ绾︽湁98%镄勫懡涓鐜囷纴涔熷氨鏄璇存疮娆¤块梾瀛桦偍鍣ㄦ椂锛屽彧链2%镄勬儏鍐靛繀椤昏块梾涓ょ骇鍒嗛〉链烘瀯銆傝繖灏卞ぇ澶у姞蹇浜嗛熷害銆
Linux涓镄勫垎椤垫満鍒
Linux浣跨敤浜嗕竴涓阃傚悎32浣嶅拰64浣岖郴缁熺殑鍒嗛〉链哄埗銆
銆銆椤靛叏灞鐩褰
椤甸《绾х洰褰
椤典腑闂寸洰褰
椤佃〃
椤靛叏灞鐩褰曞寘钖鑻ュ共椤典笂绾х洰褰旷殑鍦板潃锛岄〉涓婄骇鐩褰曞张渚濇″寘钖鑻ュ共椤典腑闂寸洰褰旷殑鍦板潃锛岃岄〉涓闂寸洰褰曞张鍖呭惈鑻ュ共椤佃〃镄勫湴鍧銆傛疮涓涓椤佃〃椤规寚钖戜竴涓椤垫嗐傜嚎镐у湴鍧锲犳よ鍒嗘垚浜斾釜閮ㄥ垎銆傚浘涓娌℃湁鏄剧ず浣嶆暟锛屽洜涓烘疮涓閮ㄥ垎镄勫ぇ灏忎笌鍏蜂綋镄勮$畻链轰綋绯荤粨鏋勬湁鍏炽
瀵逛簬娌℃湁钖鐢ㄧ墿鐞嗗湴鍧镓╁𪾢镄32浣岖郴缁燂纴涓ょ骇椤佃〃宸茬粡瓒冲熶简銆备粠链璐ㄤ笂璇达纴Linux阃氲繃浣库滈〉涓婄骇鐩褰曗濅綅鍜屸滈〉涓闂寸洰褰曗濅綅鍏ㄤ负0锛屽交搴曞彇娑堜简椤典笂绾х洰褰曞拰椤典腑闂寸洰褰曞瓧娈点备笉杩囷纴椤典笂绾х洰褰曞拰椤典腑闂寸洰褰曞湪鎸囬拡搴忓垪涓镄勪綅缃琚淇濈暀锛屼互渚垮悓镙风殑浠g爜鍦32浣岖郴缁熷拰64浣岖郴缁熶笅閮借兘浣跨敤銆傚唴镙镐负椤典笂绾х洰褰曞拰椤典腑闂寸洰褰曚缭鐣欎简涓涓浣岖疆锛岃繖鏄阃氲繃鎶婂畠浠镄勯〉鐩褰曢”鏁拌剧疆涓1锛屽苟鎶婅繖涓や釜鐩褰曢”鏄犲皠鍒伴〉鍏ㄥ眬鐩褰旷殑涓涓钖堥傜殑鐩褰曢”钥屽疄鐜扮殑銆
钖鐢ㄤ简鐗╃悊鍦板潃镓╁𪾢镄32 浣岖郴缁熶娇鐢ㄤ简涓夌骇椤佃〃銆侺inux镄勯〉鍏ㄥ眬鐩褰曞瑰簲80脳86 镄勯〉鐩褰曟寚阍堣〃(PDPT)锛屽彇娑堜简椤典笂绾х洰褰曪纴椤典腑闂寸洰褰曞瑰簲80脳86镄勯〉鐩褰曪纴Linux镄勯〉琛ㄥ瑰簲80脳86镄勯〉琛ㄣ
链钖庯纴64浣岖郴缁熶娇鐢ㄤ笁绾ц缮鏄锲涚骇鍒嗛〉鍙栧喅浜庣‖浠跺圭嚎镐у湴鍧镄勪綅镄勫垝鍒嗐
镐荤粨
杩欓噷鎴戜滑涓嶈ㄨ轰唬镰佸疄鐜帮纴鍙鍏虫敞铡熺悊銆备粠涓婇溃镄勮ㄨ哄彲浠ョ湅鍒板垎椤垫満鍒朵富瑕佷緷璧栫‖浠剁殑瀹炵幇銆侺inux閲囩敤镄勫洓绾ч〉琛ㄥ彧鏄涓轰简链澶у寲鍏煎逛笉钖岀殑纭浠跺疄鐜帮纴鍗曞氨IA32鏋舵瀯镄凛PU𨱒ヨ达纴灏辨湁澶氱嶅垎椤靛疄鐜帮纴甯歌勫垎椤垫満鍒讹纴PAE链哄埗绛夈
鎴戜滑铏界劧璁ㄨ虹殑鏄疞inux镄勫垎椤垫満鍒讹纴瀹为檯涓婃垜浠鐢ㄤ简澶ч儴鍒嗙瘒骞呮潵璁ㄨ篒ntel CPU镄勫垎椤垫満鍒跺疄鐜般傚洜涓篖inux镄勫垎椤垫満鍒舵槸寤虹珛鍦ㄧ‖浠跺熀纭涔嬩笂镄勶纴涓嶅悓镄勫钩鍙伴渶瑕佹湁涓嶅悓镄勫疄鐜般侺inux鍦ㄨ蒋浠跺眰闱㈡瀯阃犵殑铏氭嫙鍦板潃锛屾渶缁堣缮鏄瑕侀氲繃MMU杞鎹涓虹墿鐞嗗湴鍧锛屼篃灏辨槸璇达纴涓岖Linux镄勫垎椤垫満鍒舵槸镐庢牱瀹炵幇镄勶纴CPU鍙鎸夌収瀹幂殑鍒嗛〉瀹炵幇𨱒ヨВ璇荤嚎镐у湴鍧锛屾墍浠Linux浼犵粰CPU镄勭嚎镐у湴鍧蹇呯劧鏄婊¤冻纭浠跺疄鐜扮殑銆备緥濡傝达细Linux鍦32浣岰PU涓婏纴瀹幂殑锲涚骇椤佃〃缁撴瀯灏变细鍏煎瑰埌纭浠剁殑涓ょ骇椤佃〃缁撴瀯銆傚彲瑙侊纴Linux鍦ㄨ蒋浠跺眰闱涓婂仛浜嗕竴灞 鎶借薄锛岀敤锲涚骇椤佃〃镄勬柟寮忓吋瀹32浣嶅拰64浣岰PU鍐呭瓨瀵诲潃镄勪笉钖岀‖浠跺疄鐜般
Ⅶ 内存映射是怎么回事
内存映射文件是由一个文件到一块内存的映射,使进程虚拟地址空间的某个区域与磁盘上某个文件的部分或全部内容的建立映射。
建立映射后,通过该区域可以直接对被映射的磁盘文件进行访问.而不必执行文件I/O操作也无需对文件内容进行缓冲处理。
就好像整个被映射的文件都加载到了内存一样,因此内存文件映射非常适合于用来管理大文件。
内存映射文件对程序的提速,只在处理大文件或非常频繁的文件读写操作时效果才明显。
通过内存映射,相当于将磁盘上的文件所在空间建立成一块虚拟内存,程序访问时可按内存的方式进行,省去了普通io方式的一些环节,其实真正要读写操作时,会进行换页,将这些个“虚拟内存”读到物理内存中。
总之,内存映射文件是应用虚拟内存的技术来达到加速处理的