Linux内存管理


w . d o c u - t r a c k.com w w PDF-X C hange Click to buy NOW! лമㆰ㾱᧿䘠Ҷ䘋〻޵ᆈ४ฏⲴ࠶ᐳ˖ ⻠ࡠа䎧DŽ ⭏DŽն֐нᗵᣵᗳԆԜՊ⻠ཤˈഐѪԆԜѻ䰤䰤䳄ᖸབྷ˄ࡠᓅབྷࡠཊቁˈ֐ਟԕӾл䶒Ⲵֻᆀ〻ᒿ䇑㇇ал˅ˈ㔍ቁᴹᵪՊ㜭 ㌫ᖸ“᳗᱗”ˈԆԜањੁл“䮯”˄i386փ㌫㔃ᶴѝḸੁлǃึੁк˅ˈањੁк“䮯”ˈ⴨ሩ㘼ޣ䏓Ⲵᱟˈึ઼Ḹєњ४ฏ к䘠ࠐ⿽޵ᆈ४ฏѝᮠᦞ⇥ǃBSS઼ึ䙊ᑨᱟ㻛䘎㔝ᆈۘⲴ——޵ᆈս㖞кᱟ䘎㔝Ⲵˈ㘼ԓ⸱⇥઼ḸᖰᖰՊ㻛⤜・ᆈ᭮DŽᴹ 䘋〻ྲօ㓴㓷䘉Ӌ४ฏ˛ 䇢ˈᡁԜਟԕᢺึḸⴻᡀањᇴᆈǃӔᦒѤᰦᮠᦞⲴ޵ᆈ४DŽ ᆈ/ᚒ༽䈳⭘⧠൪DŽӾ䘉њ᜿ѹк؍㔃ᶏਾˈ࠭ᮠⲴ䘄എ٬ҏՊ㻛ᆈ᭮എḸѝDŽ⭡ҾḸⲴݸ䘋ݸࠪ⢩⛩ˈᡰԕḸ⢩࡛ᯩׯ⭘ᶕ 䎧䈳⭘Ⲵ䘋〻Ḹѝˈᒦфᖵࡠ䈳⭘ਁޕ䟿ˈstatic᜿ણ⵰൘ᮠᦞ⇥ѝᆈ᭮ਈ䟿˅DŽ䲔↔ԕཆˈ൘࠭ᮠ㻛䈳⭘ᰦˈަ৲ᮠҏՊ㻛঻ Ḹ˖Ḹᱟ⭘ᡧᆈ᭮〻ᒿѤᰦࡋᔪⲴተ䜘ਈ䟿ˈҏቡᱟ䈤ᡁԜ࠭ᮠᤜᕗ“{}”ѝᇊѹⲴਈ䟿˄նнवᤜstatic༠᰾Ⲵਈ ึѝ㻛ࢄ䲔˄ึ㻛㕙߿˅ ⭘mallocㅹ࠭ᮠ࠶䝽޵ᆈᰦˈᯠ࠶䝽Ⲵ޵ᆈቡ㻛ࣘᘱ␫࣐ࡠึк˄ึ㻛ᢙᕐ˅˗ᖃ࡙⭘freeㅹ࠭ᮠ䟺᭮޵ᆈᰦˈ㻛䟺᭮Ⲵ޵ᆈӾ ึ˄heap˅˖ึᱟ⭘Ҿᆈ᭮䘋〻䘀㹼ѝ㻛ࣘᘱ࠶䝽Ⲵ޵ᆈ⇥ˈᆳⲴབྷሿᒦнപᇊˈਟࣘᘱᢙᕐᡆ㕙߿DŽᖃ䘋〻䈳 䜘㖞䴦DŽޘ⇥ተਈ䟿ˈ൘޵ᆈѝ bssޘBSS⇥[2]˖BSS⇥वਜ਼Ҷ〻ᒿѝᵚࡍ࿻ॆⲴ ተਈ䟿DŽޘተਈ䟿ˈᦒਕ䈍䈤ቡᱟᆈ᭮〻ᒿ䶉ᘱ࠶䝽[1]Ⲵਈ䟿઼ޘᮠᦞ⇥˖ᮠᦞ⇥⭘ᶕᆈ᭮ਟᢗ㹼᮷Ԧѝᐢࡍ࿻ॆ ؞᭩˅᫽֌——ᆳᱟнਟ߉ⲴDŽ˄ޕᰦ㻛䶎⌅؞᭩ˈᡰԕਚ߶䇨䈫ਆ᫽֌ˈ㘼нݱ䇨߉ DŽԓ⸱⇥䴰㾱䱢→൘䘀㹼ۿԓ⸱⇥˖ԓ⸱⇥ᱟ⭘ᶕᆈ᭮ਟᢗ㹼᮷ԦⲴ᫽֌ᤷԔˈҏቡᱟ䈤ᱟᆳᱟਟᢗ㹼〻ᒿ൘޵ᆈѝⲴ䮌 є⿽ᮠᦞ⇥DŽл䶒ᡁԜᶕㆰঅᖂ㓣ал䘋〻ሩᓄⲴ޵ᆈオ䰤ѝᡰवਜ਼Ⲵ5⿽н਼Ⲵᮠᦞ४DŽ ⸱⇥”ǃ“〻ᒿᮠᦞ⇥”ǃ“〻ᒿึḸ⇥”ㅹDŽн䭉ˈ䘉ࠐ⿽ᮠᦞ⇥䜭൘ަѝˈն䲔Ҷԕкࠐ⿽ᮠᦞ⇥ѻཆˈ䘋〻䘈ਖཆवਜ਼ ሩԫօањᲞ䙊䘋〻ᶕ䇢ˈᆳ䜭Պ⎹৺ࡠ5⿽н਼Ⲵᮠᦞ⇥DŽ〽ᴹ㕆〻⸕䇶Ⲵᴻ৻䜭㜭ᜣࡠ䘉ࠐњᮠᦞ⇥ѝवਜ਼ᴹ“〻ᒿԓ 㘼ᴹӋতᱟ᤹䴰㾱ࣘᘱ࠶䝽઼എ᭦ⲴDŽ ⲴᮠᦞㅹㅹDŽн䗷䘋〻ሩ䘉Ӌ޵ᆈⲴ㇑⨶ᯩᔿഐ޵ᆈ⭘䙄на㘼нቭ⴨਼ˈᴹӋ޵ᆈᱟһݸ䶉ᘱ࠶䝽઼㔏аഎ᭦Ⲵˈޕ⭘ᡧ䗃 Ⲵ〻ᒿԓ⸱ˈᡆᱟᆈ᭮ਆ㠚ޕ∛ᰐ⯁䰞ˈᡰᴹ䘋〻˄ᢗ㹼Ⲵ〻ᒿ˅䜭ᗵ享ঐ⭘аᇊᮠ䟿Ⲵ޵ᆈˈᆳᡆᱟ⭘ᶕᆈ᭮Ӿ⻱ⴈ䖭 䘋〻ྲօ֯⭘޵ᆈ˛ 䘑ぁф޻ᆎ 䇢޵ᇩ㶽Պ䍟䙊DŽ ࡠ޵Ṩѝ৫ᆖҐ޵ᆈྲօ㻛㇑⨶ㅹ⨶䇪⸕䇶DŽᴰਾ޽䙊䗷ањᇎֻ㕆〻ሶᡰޕ␡ࡠབྷᇦሩ޵ᆈⲴ֯⭘ᴹҶ䖳ⴤ㿲Ⲵ䇔䇶ਾˈ޽ լ៲䶎៲Ⲵトຳ˄ᡁᖃᒤቡ⣟Ҷ䘉њ䭉䈟ʽ˅DŽᡰԕᴰྭⲴᯩᔿᱟݸӾཆ䜘˄⭘ᡧ㕆〻㤳⮤˅ᶕ㿲ሏ䘋〻ྲօ֯⭘޵ᆈˈㅹޕ ޵Ṩ䟼৫ⴻ㌫㔏޵ᆈࡠᓅᱟྲօ㇑⨶ˈ䛓ṧᖰᖰՊ䇙֐䲧ޕ䚥ᗚ“⨶䇪ᶕⓀҾᇎ䐥”Ⲵ“ᮉᶑ”ˈᡁԜݸнᗵалᆀቡ䫫 ウDŽ␡ڊᔰਁѝⲴᇎ䐥ˈᡰԕӵӵ⛩ࡠѪ→ˈн ᖃ❦ˈ䘉ަѝᡁԜҏՊ⎹৺ࡠаӋ䈨ྲ⇥亥ㅹ޵ᆈ㇑⨶Ⲵสᵜ⨶䇪ˈնᡁԜⲴⴞⲴнᱟѪҶᕪ䈳⨶䇪ˈ㘼ᱟѪҶᤷሬ⨶䀓 ӛDŽޡ䇶оབྷᇦ ࡠⲴᱟӾᔰਁ㘵Ⲵ䀂ᓖ䈸䈸ሩ޵ᆈ㇑⨶Ⲵ⨶䀓ˈᴰ㓸ⴞⲴᱟᢺᡁԜ൘޵Ṩᔰਁѝ֯⭘޵ᆈⲴ㓿傼઼ሩLinux޵ᆈ㇑⨶Ⲵ䇔ڊਟ㜭 Ⲵ઼ڊᯉDŽഐ↔ˈᡁԜ䘉䟼ᡰ㾱߉ⲴLinux޵ᆈ㇑⨶䟷ਆ䚯䟽ቡ䖫Ⲵㆆ⮕ˈӾ⨶䇪ቲ䶒ቡн৫⨝䰘ᔴᯗˈ䍫ㅁབྷᯩҶDŽᡁԜᴰᜣ ޵ᆈ㇑⨶аੁᱟᡰᴹ᫽֌㌫㔏Җ㉽нᜌㅄ໘䟽⛩䇘䇪Ⲵ޵ᇩˈᰐ䇪ᐲ䶒кᡆᱟ㖁к䜭ݵᯕ⵰བྷ䟿⎹৺޵ᆈ㇑⨶Ⲵᮉᶀ઼䍴 ࢃ䀶 ㌫ˈᐼᵋབྷᇦᴰ㓸㜭傮傝Linux޵ᆈ㇑⨶DŽޣⲴᇎֻˈᑞࣙ㖁৻Ԝ⨶䀓޵Ṩ޵ᆈ㇑⨶о⭘ᡧ޵ᆈ㇑⨶ѻ䰤Ⲵ ޵Ṩ޵ᆈⲴ֯⭘ᯩ⌅DŽ࣋≲Ӿཆࡠ޵ǃ≤ࡠ⑐ᡀൠᕅሬ㖁৻࠶᷀LinuxⲴ޵ᆈ㇑⨶о֯⭘DŽ൘ᵜㄐᴰਾˈᡁԜ㔉ࠪањ޵ᆈ᱐ሴ ࡠ޵Ṩѝ䇘䇪㌫㔏⢙⨶޵ᆈ㇑⨶઼ޕ␡↕᪈㾱˖ᵜㄐ俆ݸԕᓄ⭘〻ᒿᔰਁ㘵Ⲵ䀂ᓖᇑ㿶LinuxⲴ䘋〻޵ᆈ㇑⨶ˈ൘↔ส⹰к䙀 Linux޵ᆈ㇑⨶ w . d o c u - t r a c k.com w w PDF-X C hange Click to buy NOW! Stack Location: ____________________________ Address of main(Code Segment):0x8048388 Text location: below are addresses of types of process's mem ᆳⲴ㔃᷌ྲл } return 0; printf("\tNew end of heap:%p\n",b); b=sbrk((ptrdiff_t)0); brk(b+4); printf("\tInitial end of heap:%p\n",b); printf("Heap Location:\n"); char *b = sbrk((ptrdiff_t)0); printf("____________________________\n"); printf("\tAddress of bss_var:%p\n",&bss_var); printf("BSS Location:\n"); printf("____________________________\n"); printf("\tNew end of data_var(Data Segment):%p\n",&data_var1); static int data_var1=4; printf("\tAddress of data_var(Data Segment):%p\n",&data_var0); printf("Data Location:\n"); printf("____________________________\n"); printf("\tnew end of stack:%p\n",&stack_var1); int stack_var1=3; printf("\tInitial end of stack:%p\n",&stack_var0); printf("Stack Location:\n"); int stack_var0=2; printf("____________________________\n"); printf("\tAddress of main(Code Segment):%p\n",main); printf("Text location:\n"); printf("below are addresses of types of process's mem\n"); { int main(int argc,char **argv) int data_var0=1; int bss_var; #include #include #include ࡛оս㖞DŽ һᇎ㜌Ҿ䳴䗙”ˈᡁԜ⭘ањሿֻᆀ˄৏ᖒਆ㠚ljUser-Level Memory ManagementNJ˅ᶕኅ⽪к䶒ᡰ䇢Ⲵ਴⿽޵ᆈ४Ⲵᐞ“ w . d o c u - t r a c k.com w w PDF-X C hange Click to buy NOW! ൠ൰オ䰤ѝⲴ޵ᆈ४ฏᱟ⿽⁑㋺ሩᓄˈҏቡᱟ䈤ˈึǃbssǃᮠᦞ⇥˄ࡍ࿻ॆ䗷Ⲵ˅䜭൘䘋〻オ䰤ѝ⭡ᮠᦞ⇥޵ᆈ४ฏ㺘⽪DŽ ⌘᜿ˈ֐аᇊՊਁ⧠䘋〻オ䰤ਚवਜ਼йњ޵ᆈ४ฏˈլѾ⋑ᴹк䶒ᡰᨀࡠⲴึǃbssㅹˈަᇎᒦ䶎ྲ↔ˈ〻ᒿ޵ᆈ⇥઼䘋〻 ѫ䇮༷ਧ˖⅑䇮༷ਧ i㢲⛩ ᮷ԦDŽ 〫ٿ ˄޵ᆈ४ฏ˅ᔰ࿻ˉ㔃ᶏ 䇯䰞ᵳ䲀 ⇿㹼ᮠᦞṬᔿྲл˖ ---------------------------------------------------------------------------------------------------------------------- bfffe000 - c0000000 rwxp ffff000 00:00 0 …………… 08049000 - 0804a000 rw-p 00000000 03:03 439029 /home/mm/src/example 08048000 - 08049000 r-xp 00000000 03:03 439029 /home/mm/src/example ------------------------------------------------------------------------------- Ⲵؑ᚟ˈ䲔Ҷࡽє㹼ԓ㺘Ⲵԓ⸱⇥઼ᮠᦞ⇥ཆˈᴰਾа㹼ᱟ䘋〻֯⭘ⲴḸオ䰤DŽޣᡁԜл䶒ਚᣭ઼ࠪexampleᴹ 亪ᒿᱟ˖ԓ⸱⇥ǃᮠᦞ⇥ǃbss⇥˅DŽ ⭡Ҿ〻ᒿexample֯⭘Ҷࣘᘱᓃˈᡰԕ䲔Ҷexampleᵜ䓛֯⭘ⲴⲴ޵ᆈ४ฏཆˈ䘈Պवਜ਼䛓Ӌࣘᘱᓃ֯⭘Ⲵ޵ᆈ४ฏ˄४ฏ ࠪⲴֻᆀ——./example &;pidׯՊᢃঠࡠቿᒅ˅ˈ֐ਟԕਁ⧠ᖸཊ㊫լҾл䶒Ⲵᮠᆇؑ᚟DŽ ྲ᷌֐㾱ḕⴻḀњ䘋〻ঐ⭘Ⲵ޵ᆈ४ฏˈਟԕ֯⭘ભԔcat /proc//maps㧧ᗇ˄pidᱟ䘋〻ਧˈ֐ਟԕ䘀㹼к䶒ᡁԜ㔉 ൘䘉䟼ᰐ䶎ᤷⲴᱟ“ਟ䈫ǃਟ߉ǃਟᢗ㹼ㅹ”DŽ 䖖սаṧᴹᒿᧂࡇDŽ䘉Ӌ४ฏⲴࡂ࠶৏ࡉᱟ“ሶ䇯䰞኎ᙗа㠤Ⲵൠ൰オ䰤ᆈ᭮൘а䎧”ˈᡰ䉃䇯䰞኎ᙗڌۿ൘䘋〻㓯ᙗൠ൰ѝ ⨶䘉ѸབྷⲴᒣඖオ䰤ਟ㔍䶎᱃һˈѪҶᯩׯ㇑⨶ˈ㲊ᤏオ䰤㻛ࡂ࠶Ѫ䇨ཊབྷሿਟਈⲴ(նᗵ享ᱟ4096Ⲵؽᮠ)޵ᆈ४ฏˈ䘉Ӌ४ฏ region˅DŽ䘋〻㲊ᤏオ䰤ᱟњ32ᡆ64սⲴ“ᒣඖ”˄⤜・Ⲵ䘎㔝४䰤˅ൠ൰オ䰤˄オ䰤ⲴާփབྷሿਆߣҾփ㌫㔃ᶴ˅DŽ㾱㔏а㇑ ᇎቡᱟ䘋〻֯⭘Ⲵ㲊ᤏ޵ᆈ४ฏ˄memoryަۿ䘉Ӌ޵ᆈ䮌ˈۿ䘋〻޵ᆈ㇑⨶Ⲵሩ䊑ᱟ䘋〻㓯ᙗൠ൰オ䰤кⲴ޵ᆈ䮌 䘋〻޵ᆈ㇑⨶ ᰦ䘀㹼ˈ䇙ᆳԜ൘䘄എࡽа਼ⶑⵐ100。੗˅ˈ֐Պⴻࡠ10њ䘋〻ঐ⭘Ⲵ㓯ᙗൠ൰а⁑аṧDŽ ǃӂн⴨ᒢⲴDŽнؑⲴ䈍ˈ֐ਟԕᢺк䶒Ⲵ〻ᒿ਼ᰦ䘀㹼10⅑˄ᖃ❦ѪҶ਼・⤜ޘz ㅜйǃ⇿њ䘋〻Ⲵ⭘ᡧオ䰤䜭ᱟᆼ ⵰䘋〻᭩ਈˈᱟപᇊⲴDŽ޵Ṩオ䰤ൠ൰ᴹ㠚ᐡሩᓄⲴ亥㺘˄init_mm.pgd˅ˈ⭘ᡧ䘋〻਴㠚ᴹн਼Ⲵ亥㺘DŽ z ㅜҼǃ⭘ᡧオ䰤ሩᓄ䘋〻ˈᡰԕ⇿ᖃ䘋〻࠷ᦒˈ⭘ᡧオ䰤ቡՊ䐏⵰ਈॆ˗㘼޵Ṩオ䰤ᱟ⭡޵Ṩ䍏䍓᱐ሴˈᆳᒦнՊ䐏 㹼㌫㔏䈳⭘˄ԓ㺘⭘ᡧ䘋〻൘޵Ṩᘱᢗ㹼˅ㅹᰦ࡫ਟԕ䇯䰞ࡠ޵Ṩオ䰤DŽ オ䰤ঐᦞ3Gࡠ4GDŽ⭘ᡧ䘋〻䙊ᑨᛵߥлਚ㜭䇯䰞⭘ᡧオ䰤Ⲵ㲊ᤏൠ൰ˈн㜭䇯䰞޵Ṩオ䰤㲊ᤏൠ൰DŽਚᴹ⭘ᡧ䘋〻䘋 z ㅜаǃ4GⲴ䘋〻ൠ൰オ䰤㻛ӪѪⲴ࠶Ѫєњ䜘࠶——⭘ᡧオ䰤о޵Ṩオ䰤DŽ⭘ᡧオ䰤Ӿ0ࡠ3G˄0xC0000000˅ˈ޵Ṩ ൘䇘䇪䘋〻オ䰤㓶㢲ࡽˈ䘉䟼ݸ㾱▴␵л䶒ࠐњ䰞仈˖ Ԧส⹰䜘࠶˅DŽ ᭸᷌˄⭘ᡧн㜭ⴤ᧕䇯䰞⢙⨶޵ᆈ˅ˈ㘼фᴤ䟽㾱Ⲵᱟˈ⭘ᡧ〻ᒿਟ֯⭘∄ᇎ䱵⢙⨶޵ᆈᴤབྷⲴൠ൰オ䰤˄ާփⲴ৏ഐ䈧ⴻ⺜ ᣔ᫽֌㌫㔏Ⲵ؍オ䰤ˈ⭘ᡧᡰⴻࡠ઼᧕䀖ࡠⲴ䜭ᱟ䈕㲊ᤏൠ൰ˈᰐ⌅ⴻࡠᇎ䱵Ⲵ⢙⨶޵ᆈൠ൰DŽ࡙⭘䘉⿽㲊ᤏൠ൰нն㜭䎧ࡠ Linux᫽֌㌫㔏䟷⭘㲊ᤏ޵ᆈ㇑⨶ᢰᵟˈ֯ᗇ⇿њ䘋〻䜭ᴹ਴㠚ӂнᒢ⎹Ⲵ䘋〻ൠ൰オ䰤DŽ䈕オ䰤ᱟඇབྷሿѪ4GⲴ㓯ᙗ㲊ᤏ 䘑ぁ޻ᆎグ䰪 ԕ৺⭡к䘠䰞仈ᕅਁⲴаӋᆀ䰞仈DŽྲ㌫㔏㲊ᤏൠ൰࠶ᐳ˗޵ᆈ࠶䝽᧕ਓ˗䘎㔝޵ᆈ࠶䝽о䶎䘎㔝޵ᆈ࠶䝽ㅹDŽ 3. ⢙⨶޵ᆈྲօ㻛㇑⨶˛ 2. 䘋〻ൠ൰ྲօ᱐ሴࡠ⢙⨶޵ᆈ˛ 1. 䘋〻オ䰤ൠ൰ྲօ㇑⨶˛ њ䰞仈DŽ オ䰤ˈն൘Linuxѝ䙫䗁ൠ൰ቡㅹҾ㓯ᙗൠ൰ˈᆳԜⲴ٬ᱟаṧⲴ˅DŽ⋯⵰䘉ᶑ㓯㍒ˈᡁԜᡰ⹄ウⲴѫ㾱䰞仈ҏቡ䳶ѝ൘л䶒ࠐ ⮉Ҷ⇥ᵪࡦˈնᱟሶᡰᴹ〻ᒿⲴ⇥ൠ൰䜭ᇊ↫Ѫ0-4Gˈᡰԕ㲭❦䙫䗁ൠ൰઼㓯ᙗൠ൰ᱟє⿽н਼Ⲵൠ൰؍❦㾱⸕䚃Linux㌫㔏㲭 ⿽ൠ൰Ⲵ䀓䟺൘ࡽ䶒ᐢ㓿䇢䘠Ҷ˅DŽ䙫䗁ൠ൰㓿⇥ᵪࡦ䖜ॆᡀ㓯ᙗൠ൰˗㓯ᙗൠ൰৸㓿䗷亥ᵪࡦ䖜ॆѪ⢙⨶ൠ൰DŽ˄նᱟᡁԜ Ҿࠐޣ˄Ӿ⭘ᡧੁ޵Ṩⴻˈᡰ֯⭘Ⲵ޵ᆈ㺘䊑ᖒᔿՊ׍⅑㓿শ“䙫䗁ൠ൰”——“㓯ᙗൠ൰”——“⢙⨶ൠ൰”ࠐ⿽ᖒᔿ փᱟྲօ䘋㹼࠶䝽઼㇑⨶ⲴDŽ ᫽֌㌫㔏޵Ṩⴻⴻˈ䘋〻ሩ޵ᆈާޕ䙊䗷ࡽ䶒ⲴֻᆀˈᡁԜሩ䘋〻֯⭘Ⲵ䙫䗁޵ᆈ࠶ᐳᐢݸⶩѪᘛDŽ䘉䜘࠶ᡁԜቡ㔗㔝䘋 նє㘵ᱟሩᓄⲴDŽˈն䘉Ӌᮠᦞᱟ〻ᒿ㕆䈁Ⲵ䶉ᘱ㔏䇑ˈ㘼к䶒ᱮ⽪Ⲵᱟ䘋〻䘀㹼ᰦⲴࣘᘱ٬ 1654 280 8 1942 796 example text data bss dec hex filename ࡙⭘sizeભԔҏਟԕⴻࡠ〻ᒿⲴ਴⇥བྷሿˈ∄ྲᢗ㹼size exampleՊᗇࡠ New end of heap:0x804986c Initial end of heap:0x8049868 Heap Location: ____________________________ Address of bss_var:0x8049864 BSS Location: ____________________________ New end of data_var(Data Segment):0x804975c Address of data_var(Data Segment):0x8049758 Data Location: ____________________________ new end of stack:0xbffffab0 Initial end of stack:0xbffffab4 w . d o c u - t r a c k.com w w PDF-X C hange Click to buy NOW! ㌫DŽޣаᑵമབྷ㠤ⴻⴻ䘋〻ൠ൰オ䰤ࡠ⢙⨶亥ѻ䰤Ⲵ䖜ᦒ ተⴞᖅDŽл䶒ᡁԜُ⭘ljlinux䇮༷傡ࣘ〻ᒿNJѝⲴޘ⇿њ䘋〻䜭ᴹ㠚ᐡⲴ亥㺘DŽ䘋〻᧿䘠ㅖⲴpgdฏᤷੁⲴቡᱟ䘋〻Ⲵ亥 亥㺘ᡆ㘵ᤷੁᴰ㓸Ⲵ⢙⨶亥䶒DŽ 㺘᡽㜭ᆼᡀˈᾲᤜൠ䇢ˈൠ൰䖜ᦒ䴰㾱ሶ㲊ᤏൠ൰࠶⇥ˈ֯⇿⇥㲊ൠ൰䜭֌Ѫањ㍒ᕅᤷੁ亥㺘ˈ㘼亥㺘亩ࡉᤷੁла㓗࡛Ⲵ ањ㲊ᤏൠ൰ᰦˈ俆ݸᗵ享ሶ㲊ᤏൠ൰䖜ॆᡀ⢙⨶ൠ൰ˈ❦ਾ༴⨶ಘ᡽㜭䀓᷀ൠ൰䇯䰞䈧≲DŽൠ൰Ⲵ䖜ᦒᐕ֌䴰㾱䙊䗷ḕ䈒亥 㲭❦ᓄ⭘〻ᒿ᫽֌Ⲵሩ䊑ᱟ᱐ሴࡠ⢙⨶޵ᆈѻкⲴ㲊ᤏ޵ᆈˈնᱟ༴⨶ಘⴤ᧕᫽֌Ⲵতᱟ⢙⨶޵ᆈDŽᡰԕᖃᓄ⭘〻ᒿ䇯䰞 ㌱㔕⢟⨼޻ᆎ㇗⨼ ᇎ䱵Ⲵ⢙⨶亥ˈᒦѪ䈕亥ᔪ・亥㺘亩DŽ൘ᴰਾⲴֻᆀѝᡁԜՊ╄⽪ྲօ֯⭘䈕ᯩ⌅DŽ 䘉䟼ᡁԜ䴰㾱䈤᰾൘޵ᆈ४ฏ㔃ᶴкⲴnopage᫽֌DŽᖃ䇯䰞Ⲵ䘋〻㲊ᤏ޵ᆈᒦᵚⵏ↓࠶䝽亥䶒ᰦˈ䈕᫽֌ׯ㻛䈳⭘ᶕ࠶䝽 䀓linux޵ṨNJаҖDŽ⨶ޕ␡㔏Ⲵ੎ੀ⦷DŽ㾱ᜣᴤ␵ᾊൠҶ䀓䈧≲亥ᵪࡦˈਟԕⴻⴻlj ᱟ࡙⭘Ҷ޵ᆈ䇯䰞Ⲵ“ተ䜘ᙗ৏⨶”ˈ䈧≲亥ᑖᶕⲴྭ༴ᱟ㢲㓖Ҷオ䰢޵ᆈˈᨀ儈Ҷ㌫ڊԓ⨶⁑ᔿ˄proxy˅˅DŽѻᡰԕ㜭䘉Ѹ 䇮䇑⁑ᔿѝⲴۿᆼ˄䘉⿽ᙍᜣᴹ⛩ڊ䘉⿽䈧≲亥ᵪࡦᢺ亥䶒Ⲵ࠶䝽᧘䘏ࡠн㜭޽᧘䘏Ѫ→ˈᒦнᙕҾᢺᡰᴹⲴһᛵ䜭а⅑ Ҷ˅ ൠ൰᡽ᇎᇎ൘൘ൠ᱐ሴࡠҶ㌫㔏Ⲵ⢙⨶޵ᆈкDŽ˄ᖃ❦ˈྲ᷌亥㻛ᦒࠪࡠ⻱ⴈˈҏՊӗ⭏㕪亥ᔲᑨˈн䗷䘉ᰦн⭘޽ᔪ・亥㺘 䇱——ᆳՊ੺䇹޵Ṩ৫ⵏ↓Ѫ䘋〻࠶䝽⢙⨶亥ˈᒦᔪ・ሩᓄⲴ亥㺘ˈ䘉ѻਾ㲊ᤏ؍䈕ᔲᑨᱟ㲊ᤏ޵ᆈᵪࡦ䎆ԕᆈ൘Ⲵสᵜ ࠶䝽ᇎ䱵亥䶒Ⲵֻ〻DŽޕᑨˈӾ㘼䘋 ᙗൠ൰४䰤Ⲵ֯⭘ᵳDŽᇎ䱵Ⲵ⢙⨶޵ᆈਚᴹᖃ䘋〻ⵏⲴ৫䇯䰞ᯠ㧧ਆⲴ㲊ᤏൠ൰ᰦˈ᡽Պ⭡“䈧≲亥ᵪࡦ”ӗ⭏“㕪亥”ᔲ ᇎ䱵Ⲵ⢙⨶ൠ൰ˈ䘋〻ᒦ⋑ᴹ㧧ᗇ⢙⨶޵ᆈ˄⢙⨶亥䶒——亥Ⲵᾲᘥ䈧བྷᇦ৲㘳⺜Ԧส⹰аㄐ˅ˈ㧧ᗇⲴӵӵᱟሩањᯠⲴ㓯 Ӿк䶒ᐢ㓿ⴻࡠ䘋〻ᡰ㜭ⴤ᧕᫽֌Ⲵൠ൰䜭Ѫ㲊ᤏൠ൰DŽᖃ䘋〻䴰㾱޵ᆈᰦˈӾ޵Ṩ㧧ᗇⲴӵӵᱟ㲊ᤏⲴ޵ᆈ४ฏˈ㘼нᱟ ྲօ⭡㲊ਈᇎʽ ਼ṧˈ䟺᭮ањ޵ᆈ४ฏᓄ֯⭘࠭ᮠdo_ummap()ˈᆳՊ䬰⇱ሩᓄⲴ޵ᆈ४ฏDŽ ᱟᢙኅᐢᆈ൘Ⲵ޵ᆈ४ฏ䘈ᱟࡋᔪањᯠⲴ४ฏDŽ ࡠ䘋〻Ⲵൠ൰オ䰤ѝˉˉᰐ䇪ޕѸቡ⺞ᇎ䴰㾱ࡋᔪањᯠⲴVMAҶDŽնᰐ䇪ଚ⿽ᛵߥˈ do_mmap()࠭ᮠ䜭Պሶањൠ൰४䰤࣐ ൰४䰤઼ањᐢ㓿ᆈ൘Ⲵൠ൰४䰤⴨䛫ˈᒦфᆳԜާᴹ⴨਼Ⲵ䇯䰞ᵳ䲀Ⲵ䈍ˈ䛓Ѹєњ४䰤ሶਸᒦѪањDŽྲ᷌н㜭ਸᒦˈ䛓 ޵Ṩ֯⭘do_mmap()࠭ᮠࡋᔪањᯠⲴ㓯ᙗൠ൰४䰤DŽնᱟ䈤䈕࠭ᮠࡋᔪҶањᯠVMAᒦн䶎ᑨ߶⺞ˈഐѪྲ᷌ࡋᔪⲴൠ ४ฏⲴ࠶䝽ᴰ㓸䜭Պᖂ㔃ࡠdo_mmap˄˅࠭ᮠкᶕ˄brk䈳⭘㻛অ⤜ԕ㌫㔏䈳⭘ᇎ⧠ˈн⭘do_mmap()˅ˈ ࠶䝽޵ᆈ㔉䘋〻DŽн䗷䘉ᰦ䘋〻⭣䈧઼㧧ᗇⲴ䘈нᱟᇎ䱵޵ᆈˈ㘼ᱟ㲊ᤏ޵ᆈˈ߶⺞Ⲵ䈤ᱟ“޵ᆈ४ฏ”DŽ䘋〻ሩ޵ᆈ ᫽֌䜭䴰㾱ޣexecve()ǃ᱐ሴ᮷Ԧmmap()ǃࣘᘱ޵ᆈ࠶䝽malloc()/brk()ㅹ䘋〻⴨ޕࡋᔪ䘋〻fork()ǃ〻ᒿ䖭 䘋〻޵ᆈⲴ࠶䝽оഎ᭦ 䜘ؑ᚟ˈަѝᖃ❦वਜ਼䘋〻Ⲵ޵ᆈ४ฏDŽ ޘⲴޣ䜘ൠ൰オ䰤ˈ——वਜ਼Ҷ઼䘋〻ൠ൰オ䰤ᴹޘ䘋〻Ⲵൠ൰オ䰤ሩᓄⲴ᧿䘠㔃ᶴᱟ“޵ᆈ᧿䘠ㅖ㔃ᶴ”,ᆳ㺘⽪䘋〻Ⲵ лമ৽᱐Ҷ䘋〻ൠ൰オ䰤Ⲵ㇑⨶⁑ර˖ ⿽н਼᫽֌䜭㜭㧧ᗇ儈ᙗ㜭ˈᡰԕ਼ᰦ֯⭘Ҷ䘉є⿽ᮠᦞ㔃ᶴDŽ DŽ޵ṨѪҶ޵ᆈ४ฏкⲴ਴ى⭘ˈ㘼㓒唁ṁ䘲⭘Ҿ൘ൠ൰オ䰤ѝᇊս⢩ᇊ޵ᆈ४ฏⲴᰦى䜘㢲⛩Ⲵᰦޘ։˖䬮㺘⭘Ҿ䴰㾱䙽শ ḕ᢮ˈ޵Ṩ৸ԕ㓒唁ṁ˄ԕࡽⲴ޵Ṩ֯⭘ᒣ㺑ṁ˅Ⲵᖒᔿ㓴㓷޵ᆈ४ฏˈԕׯ䱽վᩌ㍒㙇ᰦDŽᒦᆈⲴє⿽㓴㓷ᖒᔿˈᒦ䶎߇ 㚄䘉Ӌн਼Ⲵ޵ᆈ४ฏ઒˛བྷᇦਟ㜭䜭Պᜣࡠ֯⭘䬮㺘ˈⲴ⺞vm_area_struct㔃ᶴ⺞ᇎᱟԕ䬮㺘ᖒᔿ䬮᧕ˈн䗷ѪҶᯩׯޣօ ᰾DŽvm_area_structᱟ᧿䘠䘋〻ൠ൰オ䰤Ⲵสᵜ㇑⨶অݳˈሩҾањ䘋〻ᶕ䈤ᖰᖰ䴰㾱ཊњ޵ᆈ४ฏᶕ᧿䘠ᆳⲴ㲊ᤏオ䰤ˈྲ а⛩㺕ݵ䈤ڊ⌅䍴ᯉDŽᡁԜ䘉䟼ਚሩᆳⲴ㓴㓷ᯩޣҾᆳⲴ䈖㓶㔃ᶴ䈧৲䰵⴨ޣˈvm_area_strcut㔃ᶴ∄䖳༽ᵲ ሩ䘉Ӌ४ฏⲴ᫽֌ҏ䜭нቭ⴨਼DŽ ᫽֌ҏ䜭а㠤DŽ䟷⭘䶒ੁሩ䊑ᯩ⌅֯VMA㔃ᶴփਟԕԓ㺘ཊ⿽㊫රⲴ޵ᆈ४ฏˉˉ∄ྲ޵ᆈ᱐ሴ᮷Ԧᡆ䘋〻Ⲵ⭘ᡧオ䰤Ḹㅹˈ ൘Linux޵Ṩѝሩᓄ䘋〻޵ᆈ४ฏⲴᮠᦞ㔃ᶴᱟ: vm_area_struct, ޵Ṩሶ⇿њ޵ᆈ४ฏ֌Ѫањঅ⤜Ⲵ޵ᆈሩ䊑㇑⨶ˈ⴨ᓄⲴ w . d o c u - t r a c k.com w w PDF-X C hange Click to buy NOW! ˄free_area[MAX_ORDER]˅ᶕ㍒ᕅDŽ ㌫㓴㓷Ⲵオ䰢亥䬮㺘ޣ㓴᢮ࡠ㌫㔏ѝⲴ⇿а亥˄オ䰢ᡆ䶎オ䰢˅DŽ㘼ަѝⲴオ䰢亥䶒ࡉਟ⭡к䘠ᨀࡠⲴԕՉդ ਖཆ,䴰㾱ᨀ৺Ⲵᱟˈ⢙⨶亥൘㌫㔏ѝ⭡亥㔃ᶴstruct page᧿䘠ˈ㌫㔏ѝᡰᴹⲴ亥䶒䜭ᆈۘ൘ᮠ㓴mem_map[]ѝˈਟԕ䙊䗷䈕ᮠ オ䰤࠶䝽޵ᆈਟԕԕᆇ㢲Ѫঅս࠶䝽,ն޵Ṩ൘޵䜘ӽ❦Պᱟԕ亥Ѫঅս࠶䝽ⲴDŽ ሿⲴؽᮠѪঅսˈᢙᕐᡆ᭦㕙ሩᓄⲴ޵ᆈ४ฏˈնbrk٬ᒦ䶎ԕ亥䶒བྷሿѪؽᮠ؞᭩ˈ㘼ᱟ᤹ᇎ䱵䈧≲؞᭩DŽഐ↔Malloc൘⭘ᡧ 䈳⭘ˈ䈕䈳⭘Ⲵ֌⭘ᱟᢙབྷᡆ㕙ሿ䘋〻ึオ䰤˄ᆳՊ؞᭩䘋〻Ⲵbrkฏ˅DŽྲ᷌⧠ᴹⲴ޵ᆈ४ฏнཏᇩ㓣ึオ䰤ˈࡉՊԕ亥䶒བྷ ⌘᜿˖get_free_pageᱟ൘޵Ṩѝ࠶䝽޵ᆈˈн਼Ҿmalloc൘⭘ᡧオ䰤ѝ࠶䝽ˈmalloc࡙⭘ึࣘᘱ࠶䝽ˈᇎ䱵кᱟ䈳⭘brk()㌫㔏 ˄2ǃ4ǃ8…512亥˅DŽ ሿDŽ޵Ṩѝ࠶䝽オ䰢亥䶒Ⲵสᵜ࠭ᮠᱟget_free_page/get_free_pagesˈᆳԜᡆᱟ࠶䝽অ亥ᡆᱟ࠶䝽ᤷᇊⲴ亥䶒 ㌫ˈᴰሿঅսਚ㜭ᱟ2Ⲵᑲؽ亥䶒བྷޣ㌫ˈഐ↔オ䰢亥䶒࠶䝽ᰦҏ䴰㾱䚥ᗚՉդޣ᰾ⲭLinuxѝオ䰢亥䶒Ⲵ㓴㓷઼㇑⨶࡙⭘ҶՉդ 䍴ᯉDŽ䘉䟼ਚ䴰㾱བྷᇦޣᇦᓄ䈕н䱼⭏——ࠐѾᡰᴹ᫽֌㌫㔏ᯩ䶒ⲴҖ䜭Պᨀࡠ,ᡁԜн৫䈖㓶䈤ᆳҶˈྲ᷌н᰾ⲭਟԕ৲ⴻᴹ ㌫࠶䝽㇇⌅བྷޣ㌫ᶕ㇑⨶オ䰢亥䶒DŽՉդޣ”䢤Ҿк䘠䴰≲ˈ޵Ṩ࠶䝽⢙⨶亥䶒ᰦѪҶቭ䟿߿ቁн䘎㔝ᛵߥˈ䟷⭘Ҷ“Չդ ඇˈഐѪ࠶䝽䘎㔝޵ᆈᰦˈ亥㺘н䴰㾱ᴤ᭩ˈഐ↔㜭䱽վTLBⲴࡧᯠ⦷˄仁㑱ࡧᯠՊ൘ᖸབྷ〻ᓖк䱽վ䇯䰞䙏ᓖ˅DŽ Ҿ࠶䝽䘎㔝Ⲵ޵ᆈੁٮ㌫㔏ਟԕьа亥ǃ㾯а亥Ⲵࠁࠪᡰ䴰㾱Ⲵ޵ᆈ׋䘋〻֯⭘DŽ㲭❦ྲ↔ˈնᱟᇎ䱵к㌫㔏֯⭘޵ᆈᰦ䘈ᱟ എ᭦޵ᆈⲴสᵜঅսׯᱟ޵ᆈ亥ҶDŽ࡙⭘࠶亥㇑⨶ᴹࣙҾ⚥⍫࠶䝽޵ᆈൠ൰ˈഐѪ࠶䝽ᰦнᗵ㾱≲ᗵ享ᴹབྷඇⲴ䘎㔝޵ᆈ[3]ˈ Linux޵Ṩ㇑⨶⢙⨶޵ᆈᱟ䙊䗷࠶亥ᵪࡦᇎ⧠Ⲵˈᆳሶᮤњ޵ᆈࡂ࠶ᡀᰐᮠњ4k˄൘i386փ㌫㔃ᶴѝ˅བྷሿⲴ亥ˈӾ㘼࠶䝽઼ ⢙⨶޵ᆈ㇑⨶˄亥㇑⨶˅ 䰢亥ˈᒦᔪ・亥㺘DŽл䶒ᡁԜӻ㓽ал޵Ṩ㇑⨶⢙⨶޵ᆈⲴᵪࡦDŽ 䎧ᶕ䳮ੰDŽഐѪ൘㲊ᤏൠ൰᱐ሴࡠ亥ѻࡽᗵ享ݸ࠶䝽⢙⨶亥——ҏቡᱟ䈤ᗵ享ݸӾ޵Ṩѝ㧧ਆオڊˈк䶒Ⲵ䗷〻䈤䎧ᶕㆰঅ w . d o c u - t r a c k.com w w PDF-X C hange Click to buy NOW! ޵ᆈˈᡰԕн䴰㾱ᴤᯠ޵Ṩ亥㺘DŽ ㌫DŽഐ↔vmalloc࠶䝽޵Ṩ㲊ᤏൠ൰ᗵ享ᴤᯠ޵Ṩ亥㺘ˈ㘼kmallocᡆget_free_page⭡Ҿ࠶䝽Ⲵ䘎㔝ޣ㔏޵Ṩオ䰤˄3G-4G˅Ⲵ᱐ሴ о⭘ᡧ䘋〻⴨լ,޵Ṩҏᴹањ਽Ѫinit_mmⲴmm_strcut㔃ᶴᶕ᧿䘠޵Ṩൠ൰オ䰤ˈަѝ亥㺘亩pdg=swapper_pg_dirवਜ਼Ҷ㌫ Ṩ亥㺘ˈഐ↔࠶䝽᭸⦷к㾱վаӋ˄⭘オ䰤ᦒᰦ䰤˅ ᆈオ䰤˄ਟ䘌བྷҾ128Kˈնᗵ享ᱟ亥བྷሿⲴؽᮠ˅ˈն⴨∄Kmallocᶕ䈤,Vmalloc䴰㾱ሩ޵Ṩ㲊ᤏൠ൰䘋㹼䟽᱐ሴˈᗵ享ᴤᯠ޵ ޵ᆈ֯⭘ѝⲴཆ䜘࠶⡷䰞仈DŽ޵Ṩᨀ׋vmalloc࠭ᮠ࠶䝽޵Ṩ㲊ᤏ޵ᆈˈ䈕࠭ᮠн਼Ҿkmallocˈᆳਟԕ࠶䝽䖳KmallocབྷᗇཊⲴ޵ ᒿ൘޵Ṩൠ൰オ䰤ѝ࠶䝽㲊ᤏൠ൰ˈ਼ṧҏ࡙⭘亥㺘˄޵Ṩ亥㺘˅ሶ㲊ᤏൠ൰᱐ሴࡠ࠶ᮓⲴ޵ᆈ亥кDŽԕ↔ᆼ㖾ൠ䀓ߣҶ޵Ṩ Ҿ⭘ᡧオ䰤࠶䝽㲊ᤏ޵ᆈˈ޵ᆈ䙫䗁к䘎㔝ˈަᇎ᱐ሴࡠᒦнаᇊ䘎㔝Ⲵ⢙⨶޵ᆈкDŽLinux޵Ṩُ⭘Ҷ䘉њᢰᵟˈݱ䇨޵Ṩ〻 ᡰԕ䚯ݽཆ䜘࠶⡷Ⲵᴰ㓸ᙍ䐟䘈ᱟ㩭ࡠҶྲօ࡙⭘н䘎㔝Ⲵ޵ᆈඇ㓴ਸᡀ“ⴻ䎧ᶕᖸབྷⲴ޵ᆈඇ”——䘉䟼Ⲵᛵߥᖸ㊫լ ࢙։ᛵߥ੗DŽ ㌫ਚᱟ߿䖫Ҷཆ䜘࠶⡷ˈնᒦᵚᖫᓅ⎸䲔DŽ֐㠚ᐡ∄ࡂалཊ⅑࠶䝽亥䶒ਾˈオ䰢޵ᆈⲴޣ᤹➗བྷሿ׍⅑ᴹᒿ䘋㹼ˈн䗷Չդ ㌫ᢺ޵ᆈඇ᤹བྷሿ࠶㓴㇑⨶ˈаᇊ〻ᓖк߿䖫Ҷཆ䜘࠶⡷ⲴডᇣˈഐѪ亥Ṷ࠶䝽н൘ⴢⴞˈ㘼ᱟޣ⡷ˈ㢲㓖Ҷオ䰢޵ᆈDŽՉդ 䇪օ⿽࠶⡷䜭ᱟ㌫㔏ᴹ᭸࡙⭘޵ᆈⲴ䳌⺽DŽslab࠶䝽ಘ֯ᗇањ亥䶒޵वਜ਼ⲴՇཊሿඇ޵ᆈਟ⤜・㻛࠶䝽֯⭘ˈ䚯ݽҶ޵䜘࠶ ᆳˈӾ㘼䙐ᡀҶオ䰤⎚䍩˗ཆ䜘࠶⡷ᱟᤷ㌫㔏㲭ᴹ䏣ཏⲴ޵ᆈˈնতᱟ࠶ᮓⲴ⺾⡷ˈᰐ⌅┑䏣ሩབྷඇ“䘎㔝޵ᆈ”Ⲵ䴰≲DŽᰐ ཆ䜘࠶⡷઼޵䜘࠶⡷ѻ䈤ˈᡰ䉃޵䜘࠶⡷ᱟ䈤㌫㔏ѪҶ┑䏣аሿ⇥޵ᆈ४˄䘎㔝˅Ⲵ䴰㾱ˈнᗇн࠶䝽Ҷаབྷ४ฏ䘎㔝޵ᆈ㔉 ㌫ҏྭǃslabᢰᵟҏྭˈӾ޵ᆈ㇑⨶⨶䇪䀂ᓖ㘼䀰ⴞⲴสᵜᱟа㠤ⲴˈᆳԜ䜭ᱟѪҶ䱢→“࠶⡷”ˈн䗷࠶⡷৸࠶ѪޣՉդ ޵Ṩ䶎䘎㔝޵ᆈ࠶䝽˄Vmalloc˅ Ӿؑ᚟ѝਟԕⴻࡠ㌫㔏ѝ䲔Ҷу⭘㔃ᶴփ֯⭘Ⲵslabཆˈ䘈ᆈ൘བྷ䟿ѪKmalloc㘼߶༷ⲴSlab˄ަѝᴹӋѪdma߶༷Ⲵ˅DŽ 䏓Ⲵ䈍ˈਟԕࡠ/proc/slabinfoѝ᢮ࡠ޵Ṩᢗ㹼⧠൪֯⭘Ⲵ਴⿽slabؑ᚟㔏䇑ˈަѝ֐Պⴻࡠ㌫㔏ѝᡰᴹslabⲴ֯⭘ؑ᚟DŽޤᴹ ҶDŽ ޵ᆈ˅DŽӾ޵Ṩ޵ᆈ࠶䝽Ⲵ䀂ᓖᶕ䇢ˈkmallocਟ㻛ⴻᡀᱟget_free_page˄s˅Ⲵањᴹ᭸㺕ݵˈ޵ᆈ࠶䝽㋂ᓖᴤ⚥⍫ 㡜ᶕ䈤޵Ṩ〻ᒿѝሩሿҾа亥Ⲵሿඇ޵ᆈⲴ䈧≲᡽䙊䗷Slab࠶䝽ಘᨀ׋Ⲵ᧕ਓKmallocᶕᆼᡀ˄㲭❦ᆳਟ࠶䝽32 ࡠ131072ᆇ㢲Ⲵ Slab࠶䝽ಘнӵӵਚ⭘ᶕᆈ᭮޵Ṩу⭘Ⲵ㔃ᶴփˈᆳ䘈㻛⭘ᶕ༴⨶޵Ṩሩሿඇ޵ᆈⲴ䈧≲DŽᖃ❦䢤ҾSlab࠶䝽ಘⲴ⢩⛩ˈа Kmalloc ⭘kmem_cache_allocоkmem_cache_freeDŽ ㌫㇑⨶Ⲵオ䰢亥䶒䬮㺘˅᫅⺾ᡀՇཊሿ޵ᆈඇԕ׋࠶䝽ˈslabѝⲴሩ䊑࠶䝽઼䬰⇱֯ޣՉդ ㌫㘼⤜・ᆈ൘Ⲵа⿽޵ᆈ࠶䝽ᯩᔿˈslabӽ❦ᱟᔪ・൘亥䶒ส⹰ѻкˈᦒਕ䈍䈤ˈSlabሶ亥䶒˄ᶕ㠚ҾޣSlabᒦ䶎ᱟ㝡⿫Չդ 䇯䰞䙏ᓖDŽ Ⲵ䈳⭘⅑ᮠ——仁㑱࠶䝽઼എ᭦ᗵ❦Պሬ㠤޵ᆈ⺾⡷——䳮ԕ᢮ࡠབྷඇ䘎㔝Ⲵਟ⭘޵ᆈ˅ˈ㘼фਟԕᖸྭൠ࡙⭘⺜Ԧ㕃ᆈᨀ儈 Slab࠶䝽ಘⲴѫ㾱ⴞⲴᱟѪҶ߿ቁሩՉդ㌫㔏࠶䝽㇇⌅ޕSlabᢰᵟнն䚯ݽҶ޵ᆈ޵䜘࠶⡷˄л᮷ሶ䀓䟺˅ᑖᶕⲴнׯ˄ᕅ л⅑֯⭘ˈ䘉ᰐ⯁䚯ݽҶ仁㑱ࡋᔪо䬰⇱ሩ䊑ᡰᑖᶕⲴ仍ཆ䍏䖭DŽڊࡠ“ᆈۘ⊐”䟼ˈ⮉ н䳮ˈަṨᗳᙍᜣቡᱟ“ᆈۘ⊐[4]”Ⲵ䘀⭘DŽ޵ᆈ⡷⇥˄ሿඇ޵ᆈ˅㻛ⴻ֌ሩ䊑ˈᖃ㻛֯⭘ᆼਾˈᒦнⴤ᧕䟺᭮㘼ᱟ㻛㕃ᆈ ѪҶ┑䏣޵Ṩሩ䘉⿽ሿ޵ᆈඇⲴ䴰㾱ˈLinux㌫㔏䟷⭘Ҷа⿽㻛〠Ѫslab࠶䝽ಘⲴᢰᵟDŽSlab࠶䝽ಘⲴᇎ⧠⴨ᖃ༽ᵲˈն৏⨶ ᆈ˗㘼ф䘉Ӌሿඇ޵ᆈඇҏ઼䶒वኁаṧ仁㑱ൠ⭏ᡀ/䬰⇱DŽ ޵ᆈ䜭н䏣а亥DŽ䘉Ӌ⭘ᶕᆈ᭮᧿䘠ㅖⲴ޵ᆈ⴨∄亥䶒㘼䀰ˈቡྭ∄ᱟ䶒वኁо䶒वDŽањᮤ亥ѝਟԕ㚊䳶ཊњ䘉Ӌሿඇ޵ ⭘Ⲵ޵ᆈতᖰᖰᱟᖸሿ˄䘌䘌ሿҾа亥˅Ⲵ޵ᆈඇ——∄ྲᆈ᭮᮷Ԧ᧿䘠ㅖǃ䘋〻᧿䘠ㅖǃ㲊ᤏ޵ᆈ४ฏ᧿䘠ㅖㅹ㹼Ѫᡰ䴰Ⲵ ᡰ䉃ቪᴹᡰ䮯ˈረᴹᡰ⸝DŽԕ亥Ѫᴰሿঅս࠶䝽޵ᆈሩҾ޵Ṩ㇑⨶㌫㔏ѝⲴ⢙⨶޵ᆈᶕ䈤Ⲵ⺞∄䖳ᯩׯˈն޵Ṩ㠚䓛ᴰᑨ֯ Slab ޵Ṩ޵ᆈ֯⭘ w . d o c u - t r a c k.com w w PDF-X C hange Click to buy NOW! 亥㺘᡽ਟ䖜ᦒѪ⢙⨶ൠ൰ᡆ⢙⨶亥DŽᆳԜᴹਟ㜭ቊᵚ㻛᱐ሴˈ൘ਁ⭏㕪亥ᰦ᡽ⵏ↓࠶䝽⢙⨶亥䶒DŽ ㌫ˈᗵ享䙊䗷޵Ṩޣ䰤䳄ˈԕ䱢→䎺⭼——㿱лമ˅DŽо䘋〻㲊ᤏൠ൰Ⲵ⢩ᙗаṧˈ䘉Ӌ㲊ᤏൠ൰о⢙⨶޵ᆈ⋑ᴹㆰঅⲴս〫 њvm_struct㔃ᶴփ˄ਟ઼࡛vm_area_structᩎ␧ˈ䛓ਟᱟ䘋〻㲊ᤏ޵ᆈ४ฏⲴ㔃ᶴ˅ˈн਼Ⲵ޵Ṩ㲊ᤏൠ൰㻛4kབྷሿⲴオ䰢४ 㘼vmalloc࠶䝽Ⲵൠ൰ࡉ䲀Ҿvmalloc_startоvmalloc_endѻ䰤DŽ⇿аඇvmalloc࠶䝽Ⲵ޵Ṩ㲊ᤏ޵ᆈ䜭ሩᓄа ⇿њ⢙⨶亥䶒䜭ਟԕ᢮ࡠᆳሩᓄⲴ޵Ṩ㲊ᤏൠ൰˄൘⢙⨶޵ᆈ᱐ሴ४ѝⲴ˅DŽ ሶ޵Ṩ㲊ᤏオ䰤ѝⲴ⢙⨶᱐ሴ४ൠ൰䖜ॆѪ⢙⨶ൠ൰DŽ㾱⸕䚃ˈ⢙⨶޵ᆈ᱐ሴ४ѝⲴൠ൰о޵Ṩ亥㺘ᱟᴹᒿሩᓄⲴˈ㌫㔏ѝⲴ 䟿˄PAGE_OFFSET˅ˈ֐ਟԕᖸᯩׯⲴሶަ䖜ॆѪ⢙⨶޵ᆈൠ൰ˈ਼ᰦ޵Ṩҏᨀ׋Ҷvirt_to_phys˄˅࠭ᮠ〫ٿӵӵᱟ⴨ᐞањ ǂ ⭡get_free_pageᡆKmalloc࠭ᮠᡰ࠶䝽Ⲵ䘎㔝޵ᆈ䜭䲧Ҿ⢙⨶᱐ሴ४ฏˈᡰԕᆳԜ䘄എⲴ޵Ṩ㲊ᤏൠ൰઼ᇎ䱵⢙⨶ൠ൰ кമᱟ޵ᆈ࠶ᐳⲴ⁑㋺䖞ᔃ 㓐㕐)DŽڊ㢲ˈ䘉䟼ᡁԜн ⮉а⡷128kབྷሿⲴ४ฏ⭘Ҿу⭘亥䶒᱐ሴˈ䘈ᴹਟ㜭Պᴹ儈ㄟ޵ᆈ᱐ሴ४ˈ䘉Ӌ䜭ᱟ㓶؍䘁4G(䈤"᧕䘁"ᱟഐѪᴰਾս㖞㌫㔏Պ ˄䈤"䱴䘁"ഐѪᱟ൘⢙⨶޵ᆈ᱐ሴ४оvmalloc_startᵏ䰤䘈Պᆈ൘ањ8MབྷሿⲴgapᶕ䱢→䏳⭼˅,vmalloc_endⲴս㖞᧕ ޵ᆈᱟ64M(ਟԕ⭘freeⴻࡠ)ˈ䛓Ѹ(3G——3G+64M)䘉⡷޵ᆈቡᓄ䈕᱐ሴࡠ⢙⨶޵ᆈˈ㘼vmalloc_startս㖞ᓄ൘3G+64M䱴䘁 ǃ⢙⨶亥䶒㺘mem_mapㅹㅹ˅∄ྲᡁ֯⭘Ⲵ㌫㔏ۿӾ3Gࡠvmalloc_start䘉⇥ൠ൰ᱟ⢙⨶޵ᆈ᱐ሴ४ฏ˄䈕४ฏѝवਜ਼Ҷ޵Ṩ䮌 ࠶४㇑⨶ˈ਴ਨަ㙼DŽ䘋〻オ䰤ൠ൰࠶ᐳӾˌࡠˏG(ަᇎᱟࡠPAGE_OFFSET, ൘0x86ѝᆳㅹҾ0xC0000000)ˈ vmalloc࠶䝽Ⲵ޵Ṩ㲊ᤏ޵ᆈоkmalloc/get_free_page࠶䝽Ⲵ޵Ṩ㲊ᤏ޵ᆈսҾн਼Ⲵ४䰤ˈнՊ䟽ਐDŽഐѪ޵Ṩ㲊ᤏオ䰤㻛 w . d o c u - t r a c k.com w w PDF-X C hange Click to buy NOW! ྲлമᡰ⽪˖ c) 䙊䗷亥䶒ᗇࡠሩᓄⲴ޵Ṩ⢙⨶޵ᆈ᱐ሴ४ฏൠ൰DŽ b) 㧧ਆ亥㺘亩ሩᓄⲴ亥䶒ᤷ䪸 a) ᢮ࡠvmalloc㲊ᤏ޵ᆈሩᓄⲴ亥㺘ˈᒦራ᢮ࡠሩᓄⲴ亥㺘亩DŽ 䖜ॆᐕ֌䴰㾱䘋㹼ྲл↕僔˖ ⭘virt_to_physਈѪ⢙⨶ൠ൰DŽ ൠ൰ˈᡰԕᡁԜᗵ享ሩ䘉䜘࠶㲊ᤏ޵ᆈṬཆ“➗亮”——ݸሶަ䖜ॆᡀ޵Ṩ⢙⨶޵ᆈ᱐ሴ४ฏѝⲴൠ൰ˈ❦ਾ൘ ४ฏѝⲴൠ൰ਟԕ㻛޵Ṩ࠭ᮠvirt_to_phys䖜ᦒᡀᇎ䱵Ⲵ⢙⨶޵ᆈൠ൰ˈնሩҾvmalloc࠶䝽Ⲵ޵Ṩ㲊ᤏൠ൰ᰐ⌅ⴤ᧕䖜ॆᡀ⢙⨶ ഐѪ޵ᆈ᱐ሴݸ㾱㧧ᗇ㻛᱐ሴⲴ⢙⨶ൠ൰ˈ❦ਾ᡽㜭ሶަ᱐ሴࡠ㾱≲Ⲵ⭘ᡧ㲊ᤏൠ൰кDŽᡁԜᐢ㓿ⴻࡠ޵Ṩ⢙⨶޵ᆈ᱐ሴ ㅜаᱟྲօሶvmalloc࠶䝽Ⲵ޵Ṩ㲊ᤏ޵ᆈ↓⺞ൠ䖜ॆᡀ⢙⨶ൠ൰˛ 〻ᒿ䟼ѫ㾱ᓄ䀓ߣєњ䰞仈˖ 䗷〻DŽޘᢺvmalloc࠶䝽Ⲵ޵Ṩ㲊ᤏൠ൰᱐ሴࡠ⭘ᡧൠ൰オ䰤Ⲵ 䘎㔝Ⲵ⢙⨶޵ᆈ᱐ሴ㲊ᤏൠ൰˗ਖа⿽ᱟ䙫䗁䘎㔝ն䶎⢙⨶䘎㔝Ⲵvmalloc࠶䝽Ⲵ޵ᆈ㲊ᤏൠ൰DŽᡁԜⲴֻᆀ〻ᒿሶ╄⽪ ᡧオ䰤——ሶ޵Ṩ㲊ᤏ޵ᆈ᱐ሴࡠ⭘ᡧ㲊ᤏൠ൰DŽӾка㢲ᐢ㓿ⴻࡠLinux޵Ṩオ䰤ѝवਜ਼є⿽㲊ᤏൠ൰˖а⿽ᱟ⢙⨶઼䙫䗁䜭 䘋㹼޵Ṩオ䰤ࡠ⭘ᡧオ䰤Ⲵབྷ㿴⁑ؑ᚟Ր䗃DŽഐ↔ᡁԜሶ䈅മ߉ањ㲊ᤏᆇㅖ䇮༷傡ࣘ〻ᒿˈ䙊䗷ᆳሶ㌫㔏޵Ṩオ䰤᱐ሴࡠ⭘ ᡁԜ䘉䟼Ⲵᇎֻᐼᵋ࡙⭘޵ᆈ᱐ሴˈሶ㌫㔏޵ṨѝⲴа䜘࠶㲊ᤏ޵ᆈ᱐ሴࡠ⭘ᡧオ䰤ˈԕ׋ᓄ⭘〻ᒿ䈫ਆ——֐ਟ࡙⭘ᆳ 儈DŽа⅑䈳⭘ᡰᴹ亥㺘ׯᇊරҶˈн䘲⭘Ҿ䛓Ӌ䴰㾱⧠൪ᔪ・亥㺘Ⲵ൪ਸ——∄ྲ᱐ሴ४䴰㾱ᢙኅᡆл䶒ᡁԜֻᆀѝⲴᛵߥDŽ ⭘vma_structⲴnopageᯩ⌅൘㕪亥ᰦ⧠൪а亥а亥Ⲵᔪ・亥㺘DŽㅜа⿽ᯩ⌅⴨∄ㅜҼ⿽ᯩ⌅ㆰঅᯩׯǃ䙏ᓖᘛˈ նᱟ⚥⍫ᙗн փ᱐ሴ㓶㢲н֌ӻ㓽Ҷˈ䴰㾱ᕪ䈳Ⲵᱟ,ᔪ・亥㺘ਟԕ䟷⭘remap_page_rangeᯩ⌅а⅑ᔪ・䎧ᡰᴹ᱐ሴ४Ⲵ亥㺘ˈᡆ࡙ ᮷Ԧ䇯䰞޵ᆈ——н䗷൘䈳⭘᮷Ԧ㌫㔏mmapᯩ⌅ࡽˈ޵Ṩ䘈䴰㾱༴⨶࠶䝽޵ᆈ४ฏ˄vma_struct˅ǃᔪ・亥㺘ㅹᐕ֌DŽሩҾާ ⟏ᚹ᮷Ԧ᫽֌Ⲵᴻ৻аᇊՊ⸕䚃file_operations㔃ᶴѝᴹmmapᯩ⌅ˈ൘⭘ᡧᢗ㹼mmap㌫㔏䈳⭘ᰦˈׯՊ䈳⭘䈕ᯩ⌅ᶕ䙊䗷 仁঑޵ᆈⲴֻᆀDŽ ޵ᆈ४ฏⲴ䇯䰞ˈҏቡᱟ䈤ˈ䙊䗷᮷Ԧ᫽֌᧕ਓਟԕ䇯䰞޵ᆈDŽLinuxѝⲴXᴽ࣑ಘቡᱟањ࡙⭘޵ᆈ᱐ሴ䗮ࡠⴤ᧕儈䙏䇯䰞㿶 ᆈкˈᰐ䇪օᰦˈਚ㾱޵ᆈ൘࠶䝽Ⲵൠ൰㤳ത޵䘋㹼䈫߉ˈᇎ䱵кቡᱟሩ䇮༷޵ᆈⲴ䇯䰞DŽ਼ᰦሩ䇮༷᮷ԦⲴ䇯䰞ҏㅹ਼Ҿሩ 㚄ࡠ䇮༷޵ޣѪ⢩↺᮷Ԧ༴⨶˅䇯䰞޵ᆈˈ䱽վҶᔰਁ䳮ᓖDŽ䇨ཊ䇮༷傡ࣘ〻ᒿׯᱟ࡙⭘޵ᆈ᱐ሴ࣏㜭ሶ⭘ᡧオ䰤Ⲵа⇥ൠ൰ Ⲵᴰབྷྭ༴ᱟᨀ儈Ҷ޵ᆈ䇯䰞䙏ᓖˈᒦфਟԕ࡙⭘᮷Ԧ㌫㔏Ⲵ᧕ਓ㕆〻˄䇮༷൘Linuxѝ֌ڊ޵ᇩᶕ䗮ࡠ䇯䰞޵ᆈⲴⴞⲴDŽ䘉ṧ ޵ᆈ᱐ሴ(mmap)ᱟLinux᫽֌㌫㔏Ⲵањᖸབྷ⢩㢢ˈᆳਟԕሶ㌫㔏޵ᆈ᱐ሴࡠањ᮷Ԧ˄䇮༷˅кˈԕׯਟԕ䙊䗷䇯䰞᮷Ԧ ᇔׁ } vfree(vmallocmem); kfree(kmallocmem); free_page(pagemem); { void cleanup_module(void) } printk("<1>vmallocmem=%s",vmallocmem); vmallocmem = vmalloc(1000000); printk("<1>kmallocmem=%s",kmallocmem); kmallocmem = kmalloc(100,0); printk("<1>pagemem=%s",pagemem); pagemem = get_free_page(0); { int init_module(void) unsigned char *vmallocmem; unsigned char *kmallocmem; unsigned char *pagemem; #include #include #include 䘉䟼㔉ࠪањሿ〻ᒿᑞࣙབྷᇦ䇔␵к䶒ࠐ⿽࠶䝽࠭ᮠᡰሩᓄⲴ४ฏDŽ w . d o c u - t r a c k.com w w PDF-X C hange Click to buy NOW! 䜘〻ᒿл䖭 mmap.tar ˄ᝏ䉒Martin Freyˈ䈕〻ᒿⲴѫփࠪ㠚ԆⲴ⚥ᝏ˅ޘ ࡙⭘maptest䈫ਆmapfile᮷Ԧˈሶਆ㠚޵ṨⲴؑ᚟ᢃঠࡠቿᒅкDŽ 2 ᔪ・䇮༷᮷Ԧmknod mapfile c 254 0 ˄൘ᡁⲴ㌫㔏䟼䇮༷ਧѪ254˅ 1 ൘/proc/devicesл᢮ࡠmap_driverሩᓄⲴ䇮༷ભ઼䇮༷ਧ˖grep mapdrv /proc/devices ⭏ᡀሩᓄⲴ䇮༷᮷Ԧ ࣐䖭⁑ඇ ˖insmod map_driver.o 㕆䈁map_driver.cѪmap_driver.o⁑ඇ,ާփ৲ᮠ㿱Makefile ᢗ㹼↕僔 ᱮ⽪൘ҶቿᒅкDŽ test.c ᆳ࡙⭘к䘠傡ࣘ⁑ඇሩᓄⲴ䇮༷᮷Ԧ൘⭘ᡧオ䰤䈫ਆ䈫ਆ޵Ṩ޵ᆈDŽ㔃᷌ਟԕⴻࡠ޵Ṩ㲊ᤏൠ൰Ⲵ޵ᇩ˄ok!˅ˈ㻛 亥Ⲵᤷ䪸DŽ ൰˄kmalloc࠶䝽Ⲵൠ൰˅˗map_nopage()䍏䍓൘䘋〻䇯䰞ањᖃࡽᒦнᆈ൘ⲴVMA亥ᰦˈራ᢮䈕ൠ൰ሩᓄⲴ⢙⨶亥ˈᒦ䘄എ䈕 ᮷ԦкDŽަѝѫ㾱Ⲵ࠭ᮠᴹ——vaddress_to_kaddress˄˅䍏䍓ሩvmalloc࠶䝽Ⲵൠ൰䘋㹼亥㺘䀓᷀,ԕ᢮ࡠሩᓄⲴ޵Ṩ⢙⨶᱐ሴൠ map_driver.cˈᆳᱟԕ⁑ඇᖒᔿ࣐䖭Ⲵ㲊ᤏᆇㅖ傡ࣘ〻ᒿDŽ䈕傡ࣘ䍏䍓ሶаᇊ䮯Ⲵ޵Ṩ㲊ᤏൠ൰(vmalloc࠶䝽Ⲵ)᱐ሴࡠ䇮༷ 〻ᒿ㓴ᡀ ⭘remap_page_rangeᯩ⌅ˈਚ㜭⭘vmaⲴnopageᯩ⌅а亥а亥Ⲵᔪ・DŽ ㌫ᒦ䶎࠶䝽ᰦቡਟ⺞ᇊˈᗵ享൘㕪亥⧠൪ᔪ・亥㺘ˈഐ↔䘉䟼н㜭֯ޣൠ൰DŽ⭡Ҿvmalloc࠶䝽Ⲵ㲊ᤏൠ൰о⢙⨶ൠ൰Ⲵሩᓄ ᆈ४ฏѝⲴnopaga᫽֌ˈԕ㜭䘄എ㻛᱐ሴⲴ⢙⨶亥䶒ᤷ䪸ˈ൘ᡁԜⲴᇎֻѝቡᱟ䘄എк䶒䗷〻ѝⲴ޵Ṩ⢙⨶޵ᆈ᱐ሴ४ฏѝⲴ ㅜҼᱟᖃ䇯䰞vmalloc࠶䝽४ᰦˈྲ᷌ਁ⧠㲊ᤏ޵ᆈቊᵚ㻛᱐ሴࡠ⢙⨶亥ˈࡉ䴰㾱༴⨶“㕪亥ᔲᑨ”DŽഐ↔䴰㾱ᡁԜᇎ⧠޵ w . d o c u - t r a c k.com w w PDF-X C hange Click to buy NOW! [4] 䘉⿽ᆈۘ⊐Ⲵᙍᜣ൘䇑㇇ᵪ、ᆖ䟼ᒯ⌋ᓄ⭘ˈ∄ྲᮠᦞᓃ䘎᧕⊐ǃ޵ᆈ䇯䰞⊐ㅹㅹDŽ [3] 䘈ᴹӋᛵߥᗵ享㾱≲޵ᆈ䘎㔝ˈ∄ྲDMAՐ䗃ѝ֯⭘Ⲵ޵ᆈˈ⭡Ҿн⎹৺亥ᵪࡦᡰԕᗵ享䘎㔝࠶䝽DŽ 䚯ݽҶ൘ⴞḷ᮷Ԧѝ䘋㹼ᱮᔿൠࡍ࿻ॆˈ߿ቁオ䰤⎚䍩˄ᶕ㠚ljLinux޵ṨᔰਁNJ˅ڊሴࡠ䈕⡷޵ᆈкˈҾᱟ䘉Ӌᵚࡍ࿻ॆਈ䟿ቡ㻛䍻ҸҶ0٬DŽ䘉ṧ ਈ䟿(ᵚ䍻٬Ⲵ)ࡠ޵ᆈѝˈ❦ਾሶ䴦亥᱐ޕᡰԕ޵Ṩ㾱Ӿਟᢗ㹼ԓ⸱㻵ˈ(สᵜкᱟ0٬)ተਈ䟿㾱㻛䍻Ҹ⢩↺Ⲵ唈䇔٬ޘѪCḷ߶ᕪࡦ㿴ᇊᵚࡍ࿻ॆⲴ ᡰԕᒦн䴰㾱ᆈۘ൘ਟᢗ㹼ሩ䊑ѝDŽնᱟഐ,[2]ᵟ䈝"BSS"ᐢ㓿ᴹӋᒤཤҶˈᆳᱟblock started by symbolⲴ㕙߉DŽഐѪᵚࡍ࿻ॆⲴਈ䟿⋑ᴹሩᓄⲴ٬ 䶉ᘱ࠶䝽⭡Ҿᱟ൘〻ᒿ䘀㹼ѻࡽ,ᡰԕ䙏ᓖᘛ, ᭸⦷儈, նᱟተ䲀ᙗབྷ. ࣘᘱ࠶䝽൘〻ᒿ䘀㹼ᰦᢗ㹼, ᡰԕ䙏ᓖធ, ն⚥⍫ᙗ儈. ṩᦞⓀ〻ᒿᶕ࠶䝽޵ᆈ. ࣘᘱ࠶䝽޵ᆈቡᱟ൘〻ᒿ㕆䈁ѻਾ, 䘀㹼ᰦ䈳⭘䘀㹼ᰦ࡫ᓃ࠭ᮠᶕ࠶䝽޵ᆈⲴ.ى䶉ᘱ࠶䝽޵ᆈቡᱟ㕆䈁ಘ൘㕆䈁〻ᒿⲴᰦ [1]
还剩9页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

piici

贡献于2014-05-04

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf