亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Linux內(nèi)核內(nèi)存管理機(jī)制和改進(jìn)

        2008-12-31 00:00:00趙麗坤于德海陽(yáng)
        電腦知識(shí)與技術(shù) 2008年30期

        摘要:理解和掌握Linux內(nèi)核內(nèi)存基本知識(shí)對(duì)學(xué)習(xí)Linux是至關(guān)重要的,Linux內(nèi)核內(nèi)存是學(xué)習(xí)Linux內(nèi)核的基礎(chǔ),對(duì)于學(xué)習(xí)Linux其他方面的內(nèi)容很有幫助,本文將主要介紹有關(guān)Linux內(nèi)核內(nèi)存兩方面的內(nèi)容,即內(nèi)存管理機(jī)制及其改進(jìn)。在內(nèi)存管理機(jī)制中,主要介紹了分段機(jī)制和分頁(yè)機(jī)制,它們是所有內(nèi)存管理的基礎(chǔ),之后所有對(duì)內(nèi)存管理的改進(jìn)都是以分段機(jī)制和分頁(yè)機(jī)制為基礎(chǔ)的。在內(nèi)存管理的改進(jìn)中,介紹了三個(gè)主要的內(nèi)容,即:反向映射,大內(nèi)存頁(yè)和在高端內(nèi)存中存儲(chǔ)頁(yè)表?xiàng)l目。

        關(guān)鍵詞:分段機(jī)制;分頁(yè)機(jī)制;反向映射;大內(nèi)存頁(yè);頁(yè)表?xiàng)l目

        中圖分類號(hào):TP316文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(208)30-0752-02

        Linux kernel Memory Management Mechanism and Improvement

        ZHAO Li-kun,YU De-hai,WANG Yang

        (Changchun university of technology, Changchun 130041, China)

        Abstract: Understanding and grasping Linux kernel memory basic knowledge is very important for learning Linux.Linux kernel memory is foundation of learning Linux kernel and helpful for learning other contents.This thesis primarily introduces two contents about Linux kernel memory.That is memory management and improvement.This paper primarily introduces segment and page mechanism in memory management mechanism.They are foundation for all the memory management and later improvement.This paper introduces three important contents—reverse mapping,big memory page and storing page table directory in high memory.

        Key words: segment mechanism; page mechanism;reverse mapping; big memory page; storing page table directory in high memory

        1 基本內(nèi)存管理機(jī)制

        1.1 分段機(jī)制

        分段提供了一種機(jī)制,用于把處理器可尋址的線性地址空間劃分成一些較小的稱為段的受保護(hù)地址空間區(qū)域。段可以用來存放程序的代碼,數(shù)據(jù)和堆棧,或者用來存放系統(tǒng)數(shù)據(jù)結(jié)構(gòu)(例如TSS或LDT)。如果處理器中有多個(gè)程序或任務(wù)在運(yùn)行,那么每個(gè)程序可分配各自的一套段。此時(shí)處理器就可以加強(qiáng)這些段之間的界限,并且確保一個(gè)程序不會(huì)通過訪問另一個(gè)程序的段而干擾程序的執(zhí)行。通常,每個(gè)程序都使用自己的段描述符表以及自己的段,對(duì)程序來說段能夠完全是私有的,或者是程序之間共享的。對(duì)所有段以及系統(tǒng)上運(yùn)行程序各自執(zhí)行環(huán)境的訪問都由硬件控制。

        在內(nèi)存分段系統(tǒng)中,一個(gè)程序的邏輯地址通過分段機(jī)制自動(dòng)地映射到中間層的4GB線性地址空間中。程序每次對(duì)內(nèi)存的引用都是對(duì)內(nèi)存段中內(nèi)存的引用。當(dāng)程序引用一個(gè)內(nèi)存地址時(shí),通過把相應(yīng)的段基址加到程序員看得見的邏輯地址上就形成了一個(gè)對(duì)應(yīng)的線性地址。在保護(hù)模式運(yùn)行方式下,段寄存器中存放的是一個(gè)段描述符表中某一描述符項(xiàng)在表中的索引值。索引值指定的段描述符項(xiàng)中含有需要尋址的內(nèi)存段的基地址,表的長(zhǎng)度值和段的訪問特權(quán)級(jí)別等信息。尋址的內(nèi)存位置由該段描述符項(xiàng)中指定的段基址值與一個(gè)段內(nèi)偏移值組合而成。段的長(zhǎng)度可變,由描述符中的內(nèi)容指定。一個(gè)段可以定義的最大長(zhǎng)度是4GB。尋址方式如圖1所示。

        1.2 分頁(yè)機(jī)制

        內(nèi)存分頁(yè)管理機(jī)制的基本原理是將CPU整個(gè)線性內(nèi)存區(qū)域劃分成4096字節(jié)為一頁(yè)的內(nèi)存頁(yè)面.程序申請(qǐng)使用內(nèi)存時(shí),系統(tǒng)就以內(nèi)存頁(yè)為單位進(jìn)行分配。在使用這種內(nèi)存分頁(yè)管理方法時(shí),每個(gè)進(jìn)程可以使用比實(shí)際內(nèi)存容量大得多的連續(xù)地址空間。為了在使用分頁(yè)機(jī)制的條件下把線性地址映射到容量相對(duì)很小的物理內(nèi)存空間上,使用了頁(yè)目錄表和頁(yè)表。頁(yè)目錄表與頁(yè)表格式基本相同,都占用4個(gè)字節(jié),并且每個(gè)頁(yè)目錄表或頁(yè)表必須只能包含1024個(gè)頁(yè)表項(xiàng)。因此一個(gè)頁(yè)目錄表或一個(gè)頁(yè)表分別共占用1頁(yè)內(nèi)存。頁(yè)目錄和頁(yè)表項(xiàng)的小區(qū)別在于頁(yè)表項(xiàng)有個(gè)已寫位D(Dirty),而頁(yè)目錄項(xiàng)則沒有。

        線性地址到物理地址的變換過程如圖2所示。圖中控制寄存器CR3保存著是當(dāng)前頁(yè)目錄表在物理內(nèi)存中的基地址。32位的線性地址被分成三個(gè)部分,分別用來在頁(yè)目錄表和頁(yè)表中定位對(duì)應(yīng)的頁(yè)目錄項(xiàng)和頁(yè)表項(xiàng)以及在對(duì)應(yīng)的物理內(nèi)存頁(yè)面中指定頁(yè)面內(nèi)的偏移位置。

        2 對(duì)內(nèi)存管理的改進(jìn)

        2.1 反向映射

        在 Linux 內(nèi)存管理器中,頁(yè)表保持對(duì)進(jìn)程使用的內(nèi)存物理頁(yè)的追蹤,它們將虛擬頁(yè)映射到物理頁(yè)。在這些頁(yè)中有一些可能不是長(zhǎng)時(shí)間使用的,所以它們應(yīng)該被交換出去。不過,在它們被交換出去之前,必須找到映射那個(gè)頁(yè)的每一個(gè)進(jìn)程,這樣那些進(jìn)程中相應(yīng)頁(yè)的頁(yè)表?xiàng)l目才可以被更新。這是一項(xiàng)令人生畏的任務(wù),因?yàn)闉榱舜_定某個(gè)頁(yè)是否被某個(gè)進(jìn)程映射,必須遍歷每個(gè)進(jìn)程的頁(yè)表。隨著在系統(tǒng)中運(yùn)行的進(jìn)程數(shù)量的增加,將這些頁(yè)交換出去的工作量也會(huì)增加。

        反向映射提供了一個(gè)發(fā)現(xiàn)哪些進(jìn)程正在使用給定的內(nèi)存物理頁(yè)的機(jī)制。不再是遍歷每個(gè)進(jìn)程的頁(yè)表,內(nèi)存管理器現(xiàn)在為每一個(gè)物理頁(yè)建立了一個(gè)鏈表,包含了指向當(dāng)前映射那個(gè)頁(yè)的每一個(gè)進(jìn)程的頁(yè)表?xiàng)l目(page-table entries, PTE)的指針。這個(gè)鏈表叫做 PTE 鏈。

        PTE 鏈極大地提高了找到那些映射某個(gè)頁(yè)的進(jìn)程的速度,如圖3所示。

        可以證明反向映射是對(duì) Linux 內(nèi)存管理器的一個(gè)頗有價(jià)值的修改。通過這一途徑,查找定位映射某個(gè)頁(yè)的進(jìn)程這一嚴(yán)重瓶頸被最小化為只需要一個(gè)簡(jiǎn)單的操作。當(dāng)大型應(yīng)用程序向內(nèi)核請(qǐng)求大量?jī)?nèi)存和多個(gè)進(jìn)程共享內(nèi)存時(shí),反向映射幫助系統(tǒng)繼續(xù)有效地運(yùn)行和擴(kuò)展。當(dāng)前還有更多對(duì)反向映射的改進(jìn)正在研究中,可能會(huì)出現(xiàn)在未來的 Linux 內(nèi)核版本中。

        2.2 大內(nèi)存頁(yè)

        典型地,內(nèi)存管理器在 x86 系統(tǒng)上處理的內(nèi)存頁(yè)為 4 KB。實(shí)際的頁(yè)大小是與體系結(jié)構(gòu)相關(guān)的。對(duì)大部分用途來說,內(nèi)存管理器以這樣大小的頁(yè)來管理內(nèi)存是最有效的。不過,有一些應(yīng)用程序要使用特別多的內(nèi)存。大型數(shù)據(jù)庫(kù)就是其中一個(gè)常見的例子。由于每個(gè)頁(yè)都要由每個(gè)進(jìn)程映射,必須創(chuàng)建頁(yè)表?xiàng)l目來將虛擬地址映射到物理地址。如果您的一個(gè)進(jìn)程要使用 4KB 的頁(yè)來映射 1 GB 內(nèi)存,這將用到 262,144 個(gè)頁(yè)表?xiàng)l目來保持對(duì)那些頁(yè)的追蹤。如果每個(gè)頁(yè)表?xiàng)l目消耗 8 個(gè)字節(jié),那些每映射 1 GB 內(nèi)存需要 2 MB 的開銷。這本身就已經(jīng)是非??捎^的開銷了,不過,如果有多個(gè)進(jìn)程共享那些內(nèi)存時(shí),問題會(huì)變得更嚴(yán)重。在這種情況下,每個(gè)映射到同一塊 1 GB 內(nèi)存的進(jìn)程將為頁(yè)表?xiàng)l目付出自己 2 MB 的代價(jià)。如果有足夠多的進(jìn)程,內(nèi)存在開銷上的浪費(fèi)可能會(huì)超過應(yīng)用程序請(qǐng)求使用的內(nèi)存數(shù)量。

        解決這一問題的一個(gè)方法是使用更大的頁(yè)。大部分新的處理器都支持至少一個(gè)小的和一個(gè)大的內(nèi)存頁(yè)大小。在 x86 上,大內(nèi)存頁(yè)的大小是 4 MB,或者,在物理地址擴(kuò)展(PAE)打開的系統(tǒng)上是 2 MB。假定在前面的中使用頁(yè)大小為 4 MB 的大內(nèi)存頁(yè),同樣 1 GB 內(nèi)存只用 256 個(gè)頁(yè)表?xiàng)l目就可以映射,而不需要 262,144 個(gè)。這樣開銷從 2 MB 變?yōu)?2,048 個(gè)字節(jié)。

        大內(nèi)存頁(yè)的使用還可以通過減少 變換索引緩沖(translation lookaside buffer, TLB) 的失敗次數(shù)來提高性能。TLB 是一種頁(yè)表的高速緩存,讓那些在表中列出的頁(yè)可以更快地進(jìn)行虛擬地址到物理地址的轉(zhuǎn)換。大內(nèi)存頁(yè)可以用更少的實(shí)際頁(yè)來提供更多的內(nèi)存,相當(dāng)于較小的頁(yè)大小,使用的大內(nèi)存頁(yè)越多,就有越多的內(nèi)存可以通過 TLB 引用。

        2.3 在高端內(nèi)存中存儲(chǔ)頁(yè)表?xiàng)l目

        在 32 位機(jī)器上頁(yè)表通常只可以存儲(chǔ)在低端內(nèi)存中。低端內(nèi)存只限于物理內(nèi)存的前 896 MB,同時(shí)還要滿足內(nèi)核其余的大部分要求。在應(yīng)用程序使用了大量進(jìn)程并映射了大量?jī)?nèi)存的情況下,低端內(nèi)存可能很快就不夠用了。

        現(xiàn)在,在 2.6 內(nèi)核中有一個(gè)配置選項(xiàng)叫做 Highmem PTE,讓頁(yè)表?xiàng)l目可以存放在高端內(nèi)存中,釋放出更多的低端內(nèi)存區(qū)域給那些必須放在這里的其他內(nèi)核數(shù)據(jù)結(jié)構(gòu)。作為代價(jià),使用這些頁(yè)表?xiàng)l目的進(jìn)程會(huì)稍微慢一些。不過,對(duì)于那些在大量進(jìn)程在運(yùn)行的系統(tǒng)來說,將頁(yè)表存儲(chǔ)到高端內(nèi)存中可以在低端內(nèi)存區(qū)域擠出更多的內(nèi)存。內(nèi)存區(qū)域如圖4所示。

        3 總結(jié)

        Linux內(nèi)核內(nèi)存管理機(jī)制是學(xué)習(xí)Linux內(nèi)核的關(guān)鍵,本文所述的內(nèi)存管理機(jī)制是最基本的,不過只有在深入理解了基本內(nèi)存管理機(jī)制后,才會(huì)對(duì)更為復(fù)雜的內(nèi)存管理機(jī)制的更好,更容易的掌握。另外,內(nèi)存管理的改進(jìn)遠(yuǎn)遠(yuǎn)不只本文中提到的這些特性,本文所列出的有關(guān)內(nèi)存管理的改進(jìn)只是目前比較典型的,之所以選擇這些特別的例子,是因?yàn)樗鼈兣e例說明了 Linux 2.6 內(nèi)核得到了怎樣的調(diào)整和增強(qiáng),以便更好地處理企業(yè)級(jí)的硬件和應(yīng)用程序。

        參考文獻(xiàn):

        [1] Linux Kernel Source Code[EB/OL].http://www.kernel.org/.

        [2] 吳學(xué)毅.Linux基礎(chǔ)教程[M],北京:清華大學(xué)出版社/北京交通大學(xué)出版社,2005.

        [3] 韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊(cè)[M],北京:人民郵電出版社,2008.

        [4] 趙炯.Linux內(nèi)核完全剖析[M],北京:機(jī)械工業(yè)出版社,2006.

        注:本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文

        免费人成在线观看播放视频| 少妇人妻综合久久中文字幕| 精品国产一区二区三区2021| 国产精品制服| 亚洲天堂资源网| 色欲AV成人无码精品无码| 丰满熟妇人妻av无码区| 免费福利视频二区三区| 青青草成人原视频在线播放视频| 综合色免费在线精品视频| 影音先锋久久久久av综合网成人| 内射口爆少妇麻豆| 中文字幕日本特黄aa毛片| 精品欧美久久99久久久另类专区| 亚洲av一二三四又爽又色又色| 中文字幕乱码一区在线观看 | 国产免费艾彩sm调教视频| 日韩人妻无码精品-专区| 成人动漫久久| 亚洲av男人免费久久| 草逼视频污的网站免费| 美女脱了内裤露出奶头的视频| 无码人妻h动漫中文字幕| 亚洲精品人成无码中文毛片| 久久久国产不卡一区二区| 国产一区二区精品久久呦| 午夜少妇高潮在线观看视频| 久久伊人这里都是精品| 国产98在线 | 日韩| 亚洲国产精品国语在线| 国产日韩亚洲中文字幕| 在线小黄片视频免费播放 | 国产黄色一级到三级视频| 日本人妻精品有码字幕| 欧美性受xxxx黑人猛交| 性xxxx18免费观看视频| 嫖妓丰满肥熟妇在线精品| 亚洲中文无码久久精品1| 免费女同毛片在线不卡| av天堂精品久久综合网| 国产成人综合色在线观看网站|