2008୍11ᄅކ٧ഽٓ࿐ჽ࿐Б ֻ26जֻ6௹ Linuxྴթԥܵ௩༅殷荣庆(ކ٧ഽٓ࿐ჽ࠹ෘࠏ॓࿐აඌ༢,νߪކ٧230061)[ᅋ ေ]本文详细论述虚拟存储管理理论基础,并以Linux操作系统为例,深入剖析Linux内核虚拟存储管理的实现原理b[ܱՍ]Linux;内核;物理内存;虚拟内存[ᇏٳোݼ] [໓ངѓ്]A [໓ᅣщݼ]1674 2273(2008)06 0054 031 ႄMEM൞896MBᇀໃແbૄ۱ܵႮ၂۱LinuxҠቔ༢ᆞᇯࡶູഅြࢸa࿐ඌࢸaሱႮstructzone_struct૭ඍ,࠺Ќ֥ܵ෭aܵೈࡱൗࢸ෮ܱᇿ,ቔູ၂۱Ӯඃ֥Ҡቔ༢,֥หॢ༽်૫֥ሹඔaॢ༽თ໊a֩րؒਙ֥ᆘaۿିaྟିರປbLinux֥ྴթԥܵᄝݗ༐іaݗ༐іնཬa֥ܵሳژԱaܵൌᇏіགྷਅݺ,ᆃაLinuxྴթԥܵหط֥նཬ֩ྐ༏bࡥֆ֥ൌགྷٚൔ൞ٳ҂ष,֥ྴթԥ༢ᇏႨ 物理页面֥ྸ؟ෘم൞Ⴎંࡅิԛ֥,ൌགྷٚمෛሢ်૫෮උ֥ܵ൞ZONE_DMAa༢ᄝᆇൌൗࢸᇏ֥ᄎሇࠎЧഈၘࣜބჰট֥ંZONE_NORMALaZONE_HIGHMEMᇏ֥၂۱,ཌྷຂbЧ໓ᄝંඍLinuxྴթԥܵંࠎԤૄ۱်૫Ⴎ၂۱structpage૭ඍ,࠺်૫Ф֥౦ঃ༯,ധೆ௩༅Linuxଽނྴթԥ֥ܵൌႄႨ֥ඔଢa်૫֥ሑa်૫ู֥ߐҦ֩ྐ༏bགྷჰbmem_map൞structpageඔቆ,ႨႿൌགྷֹᆶ2 Linuxଽթ૭ඍა်૫֥႘ഝbࢫׄaܵa်૫֥ܱ༢Linux֥ଽթФٳູྸ؟՛,ૄ۱՛Ф1bಪູ൞၂۱ࢫׄ,ૄ۱ࢫׄФٳӮޓ؟ӫູ֥ܵॶ,ႨႿіൕଽթᇏ֥ଖ۱ٓຶ,ૄ۱ॶ္ӫ်ູ૫ᆠ 节点ଽթᇏ֥ૄ۱ࢫׄႮstructpglist_data૭ඍ,࠺ھࢫׄ෮ᄝ֥ܵaٳൈ֥ܵඨஆਙaࢫ֥ׄܵඔଢaࢫ֥ׄૄ۱်૫ᆠaࢫׄఏֹᆶa်֥ܵ૫ሹඔaࢫ֥ׄIDaᆷཟ༯၂۱ࢫ֥ׄᆷᆌ֩ྐ༏b1 ࢫׄaܵa်૫֥ܱ༢ 管理区3 Linux်і֥ܵܵোٳູᇕ,ٳљູ 线性地址DMAaZONE_NORMALaZONE_HIGHMEM,ၹLinuxҐႨਔҪ်іࠏᇅটປӮଽթܵ,Վࢫׄᇏ֥ܵඔଢᄝ1ᇀ3ᆭࡗ,ؓႿX86ཌྟֹᆶႮಆअ်ଢPGDaᇏࡗ်ଢPMDa်ࠏఖ,ZONE_DMA൞ଽթ൮֥҆16MB,ZONE_і۬PTEa်ଽொ၍4҆ٳቆӮbLinuxཌྟֹᆶNORMAL൞16MBᇀ896MB,ZONE_HIGH ֥ܒӮ2b[൬۠ರ௹]2008-07-20[ቔᆀࡥࢺ]ၺ౩(1951-),ଳ,ࡾ්ཅದ,ކ٧ഽٓ࿐ჽ࠹ෘࠏ॓࿐აඌ༢ڬ࢝൱b54
ཌྟֹᆶಆअ်ଢPGDᇏࡗ်ଢPMD်і۬PTE်ଽொ၍2 LinuxཌྟֹᆶܒӮ 页表іֹᆶ,Ⴎ်і۬PTEҰPTE်і်֤૫ֹᆶ,ቋႮಆअ်ଢPGDҰPGD်і֤PMD်іުႮ်૫ֹᆶა်ଽொ၍ྙӮֹᆶbཌྟֹᆶֹᆶ,Ⴎᇏࡗ်ଢPMDҰPMD်і֤PTE်ሇߐֹູᆶ֥ݖӱ3b3 ཌྟֹᆶሇߐֹູᆶ֥ݖӱ 虚拟地址与物理地址之间的映射4 Linuxྴଽթ૭ඍLinuxϜՖ0षֹ֥ᆶ႘ഝӮ3GBषLinuxࡼ0षֹ֥ᆶ႘ഝູ3GBष֥ྴֹᆶ,ၹՎॖၛࡥֆֹࡼၩ၂۱ྴֹ֥ྴֹᆶ,vmalloc_startіൕ3GBࡆഈଽթᆶࡨಀ3GBطࠆ֤ఃֹᆶ,ّᆭֹᆶࡆഈಸਈᄜࡆഈ်૫ॢ༣षֹ֥ᆶ,ھֹᆶष֥ྴ3GBູࠧྴֹᆶbֹᆶॢࡗӫູvmallocྴֹᆶॢࡗ,ᆜ۱ 物理地址与页面之间的映射ॢࡗФٳູۄ۱vmallocٳ,ૄ۱vmallocٳLinuxࡼଽނ႘འልᄛ֞1MBఏֹ֥Ⴎstructvm_struct૭ඍ,෮Ⴕ֥vmallocٳቆӮᆶ,༢ູଽނ႘འყਔ8MB֥ྴॢࡗ,ߎູ၂۱৽vmallocٳᆭࡗႨ်૫ॢ༣ٳۯb٤৵ZONE_DMAყਔ16MB֥ྴॢࡗ,෮ၛᆇᆞ࿃်֥૫ॖ႘ഝ֞vmallocֹᆶॢࡗ֥৵࿃ିФଽނٳႨ֥ྴֹᆶॢࡗՖ3G+16MB်૫bࠧ0xC1000000ष,Վྴֹᆶ္൞mem_map෮ 连续内存分配ᄝ໊֥ᇂbॢ༽ଽթ်૫Ⴎࢲܒඔቆfree_area_tֹܵᆶሇߐݖӱٳູؽ҄,ֻ၂҄ൌགྷྴֹᆶ,ۄ৵࿃်૫ቆӮॶ,ॶᇏ෮ݣ်૫۱ඔ൞2ֹ֞ᆶ֥ሇߐ,ֻؽ҄ൌགྷֹᆶ်֞૫֥֥ٚૢ,ٳљູ2֥0Ցૢᇀ2֥9Ցૢ,նཬཌྷ႘ഝ,ྴֹᆶࡨಀ3GBֹ֤ᆶ,ֹᆶႷ֥෮ႵॶቆӮ၂۱৽,܋10۱৽,৽ᄝඔቆfree_၍ཌྟֹᆶᇏ်ଽொ၍෮ᅝ໊֥ඔ်֤૫ݼ,ࡼ်area_tᇏb૫ݼቔູmem_mapඔቆ֥༯ѓ,ࠧॖ႘ഝ်֞૫ॢ༽ଽթ်૫ܵ4b෮ᄝ໊ᇂb4 ॢ༽ଽթ်૫ܵ55
ٳൈ۴ऌ෮ླ৵࿃်૫ඔᄝൡކնཬ֥ॶ৽ 非连续内存分配ᇏҰᅳ,ھॶ৽ູ,ॢᄵࡼ༯၂ࠩॶ৽ᇏ֥ॶ֩ٳvmallocֹᆶॢࡗФٳູۄ۱vmallocٳູ2҆ٳ,၂҆ٳႨႿٳ,ਸ਼၂҆ٳҬೆഈ၂֥ࠩॶ,෮Ⴕ֥vmallocٳॶቆӮ၂۱৽,vmallocٳॶ৽ᇏ;߭൬ൈ߭൬ॶླაཌྷਣ֥ॢ༽ॶކѩުҬॶࡗႨ်૫ॢ༣ٳۯbvmallocֹᆶॢࡗೂ5ೆཌྷႋ֥ॢ༽ॶ৽ᇏb෮ൕb5 vmallocֹᆶॢࡗ ଽթᇏႨ৵࿃်֥൞ॖ౼,֥ႮႿຓ1GBູଽނॢࡗ҆ٳ,3GBၛഈնཬູRAMಸਈ်֥҆թᄝ֤ᆃᇕቓمࣜӈྛ҂๙,෮ၛLinuxࡆ်૫ॢ༣֥თႨႿ႘ഝଽթ,Їওଽނ႘Ⴈ၂ᇕvmallocࠏᇅ,ᄝᆃᇕࠏᇅᇏ,٤৵࿃֥འބ်૫႘ഝࢲܒmem_map,ഺჅູ֥vmallocֹଽթᄝྴթᇏ൞৵࿃֥bᆶॢࡗ,ႨႿࡼ٤৵࿃်֥૫႘ഝູvmalloc٤৵࿃်֥૫ٳݖӱٳູؽ,ֻ҄၂ֹ҄ᆶॢࡗ৵࿃်֥૫b۴ऌ෮ླ٤৵࿃်૫۱ඔෆ෬vmallocٳ6 ࢲඏე৽,֤֞ކൡ֥vmallocٳॶ;ֻؽ҄ٳ෮ླ֥LinuxҠቔ༢ᄝᇏݓ֥௴ࠣӱ؇ߎޓ҂ܔ,PGD࠺aPMD࠺aPTE࠺ބ်૫,ྙӮܱႿLinuxྴթԥ֥ܵ໓֖ࢠኇك,֝ᇁvmalloc်і,Վ်іؓႋvmallocֹᆶॢࡗ֥৵࿃LinuxྴթԥܵჰᆺିФޓഒ၂҆ٳଽނष်૫,ᆃུvmallocֹᆶॢࡗ֥৵࿃်૫൞٤৵࿃ؿದჴ෮ປಆࢳbЧ໓ᄝӂඍLinuxྴթԥ်ܵ૫֥႘ഝbં֥ࠎԤഈ,ሢᇗLinuxྴթԥܵऎุൌvmalloc်іѩ҂උႿ֒భࣉӱ်֥і,֒ࣉགྷჰ֥௩༅,ᆻᄝᆀॹֹᅧLinuxྴӱ٠໙vmallocֹᆶॢࡗൈ,ၹࣉӱ်֥іໃᆷཟթԥ֥ܵൌགྷჰ,ؓྴթԥ֥ܵᄎྛࠏᇅvmallocֹᆶॢࡗطӁളಌ်ᇏ؎,ಌ်ᇏ؎ԩ۷ࡆ֤ྏႋ൭,ᄝLinuxҠቔ༢֥௴ࠣٚ૫ऎႵӱႨvmalloc်і۷ྍ֒భࣉӱ်֥і,֒భᆷ֝ၩၬbࣉӱ֤ၛ٠໙vmallocֹᆶॢࡗ်֥૫,ࣉط٠໙٤৵࿃်֥૫b[ҕ ॉ ໓ ང]5[1] (ιغধ)MelGorman.ധೆࢳLinuxྴଽթܵ[M].К Linuxྴթԥൌགྷჰྴଽթ֥၂۱ᇶေݺԩࣼ൞ॖၛಞૄ۱ࣉӱࣘݴॢݴ฿ն࿐ԛϱഠ,2006,5.ႵඋႿሱ֥࠭ྴֹᆶॢࡗ,ᆃᇕॢࡗॖၛ๙ݖ[2] (ૅ)Ѱຳ,༆ථห.ധೆࢳLINUXଽނ(ֻϱ)[M].ᇏݓ৯ԛϱഠ,2007,9.Ҡቔ༢႘ഝ֞ଽթbLinuxࣉӱ֥ྴֹᆶॢ[3] (ૅ)ঘᏫ(Love,R.).Linuxଽނഡ࠹აൌགྷ(ֻؽϱ[M].ࠏࡗնཬູ4GB,ఃᇏ3GBູႨॢࡗ҆ٳ,ఃჅྀ۽ြԛϱഠ,2006, qing(DepartmentofComputerScienceandTechnology,HefeiTeachersCollege,Hefei230061,China)Abstract:Thisarticlediscussesindetailthebasisofvirtualstoragemanagementtheory,andtheLinuxop eratingsystemasanexample,atthesametime,itpresentsin :Linux,thekernel,physicalmemory,virtualmemory56