• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            T9的空間

            You will never walk alone!

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              69 隨筆 :: 0 文章 :: 28 評論 :: 0 Trackbacks
            From Unix某論壇,忘記名字了...但這段文字從宏觀上講清楚了Linux Memory的構架。
            1.
            內核初始化:

                *
            內核建立好內核頁目錄頁表數據庫,假設物理內存大小為len,則建立了[3G--3G+len]::[0--len]這樣的虛地址vaddr和物理地址paddr的線性對應關系;
                *
            內核建立一個page數組,page數組和物理頁面系列完全是線性對應,page用來管理該物理頁面狀態,每個物理頁面的虛地址保存在page->virtual中;
                *
            內核建立好一個free_list,將沒有使用的物理頁面對應的page放入其中,已經使用的就不用放入了;

            2.
            內核模塊申請內存vaddr = get_free_pages(mask,order)

                *
            內存管理模塊從free_list找到一個page,將page->virtual作為返回值,該返回值就是對應物理頁面的虛地址;
                *
            pagefree_list中脫離;
                *
            模塊使用該虛擬地址操作對應的物理內存;

            3.
            內核模塊使用vaddr,例如執行指令mov(eax, vaddr)

                * CPU
            獲得vaddr這個虛地址,利用建立好的頁目錄頁表數據庫,找到其對應的物理內存地址;
                *
            eax的內容寫入vaddr對應的物理內存地址內;

            4.
            內核模塊釋放內存free_pages(vaddr,order)

                *
            依據vaddr找到對應的page
                *
            將該page加入到free_list中;

            5.
            用戶進程申請內存vaddr = malloc(size)

                *
            內存管理模塊從用戶進程內存空間(0--3G)中找到一塊還沒使用的空間vm_area_struct(start--end)
                *
            隨后將其插入到task->mm->mmap鏈表中;

            6.
            用戶進程寫入vaddr(0-3G),例如執行指令mov(eax, vaddr)

                * CPU
            獲得vaddr這個虛地址,該虛地址應該已經由glibc庫設置好了,一定在3G一下的某個區域,根據CR3寄存器指向的current->pgd查當前進程的頁目錄頁表數據庫,發現該vaddr對應的頁目錄表項為0,故產生異常;
                *
            在異常處理中,發現該vaddr對應的vm_area_struct已經存在,為vaddr對應的頁目錄表項分配一個頁表;
                *
            隨后從free_list找到一個page,將該page對應的物理頁面物理首地址賦給vaddr對應的頁表表項,很明顯,此時的vaddrpaddr不是線性對應關系了;
                *
            pagefree_list中脫離;
                *
            異常處理返回;
                * CPU
            重新執行剛剛發生異常的指令mov(eax, vaddr)
                * CPU
            獲得vaddr這個虛地址,根據CR3寄存器指向的current->pgd,利用建立好的頁目錄頁表數據庫,找到其對應的物理內存地址;
                *
            eax的內容寫入vaddr對應的物理內存地址內;  

            7.
            用戶進程釋放內存vaddrfree(vaddr)

                *
            找到該vaddr所在的vm_area_struct
                *
            找到vm_area_struct:start--end對應的所有頁目錄頁表項,清空對應的所有頁表項;
                *
            釋放這些頁表項指向物理頁面所對應的page,并將這些page加入到free_list隊列中;
                *
            有必要還會清空一些頁目錄表項,并釋放這些頁目錄表項指向的頁表;
                *
            task->mm->mmap鏈中刪除該vm_area_struct并釋放掉;

            綜合說明:

                *
            可用物理內存就是free_list中各page對應的物理內存;
                *
            頁目錄頁表數據庫的主要目的是為CPU訪問物理內存時轉換vaddr-->paddr使用,分配以及釋放內存時不會用到,但是需要內核內存管理系統在合適時機為CPU建立好該庫;
                *
            對于用戶進程在6中獲得的物理頁面,有兩個頁表項對應,一個就是內核頁目錄頁表數據庫的某個pte[i ],一個就是當前進程內核頁目錄頁表數據庫的某個 pte[j],但是只有一個page和其對應。如果此時調度到其他進程,其他進程申請并訪問某個內存,則不會涉及到該物理頁面,因為其分配時首先要從 free_list中找一個page,而該物理頁面對應的page已經從free_list中脫離出來了,因此不存在該物理頁面被其他進程改寫操作的情況。內核中通過get_free_pages等方式獲取內存時,也不會涉及到該物理頁面,原理同前所述。
            posted on 2013-12-09 17:42 Torres 閱讀(462) 評論(0)  編輯 收藏 引用 所屬分類: Useful information
            AV色综合久久天堂AV色综合在| 精品久久久久久99人妻| 久久99这里只有精品国产| 精品久久久久久国产三级| 久久伊人精品青青草原日本| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久精品国产清高在天天线| 久久综合狠狠综合久久综合88| 国内精品久久久久久99蜜桃| 国产精品内射久久久久欢欢| 精品久久亚洲中文无码| 伊人丁香狠狠色综合久久| 模特私拍国产精品久久| 99久久精品费精品国产一区二区 | 精品久久久无码人妻中文字幕豆芽 | 老司机午夜网站国内精品久久久久久久久| 久久综合五月丁香久久激情| 色88久久久久高潮综合影院| 久久精品国产清自在天天线| 亚洲精品乱码久久久久久 | 久久99精品久久久久久秒播| av色综合久久天堂av色综合在| 久久精品国产精品国产精品污| 久久精品中文字幕大胸| 99久久夜色精品国产网站| 综合人妻久久一区二区精品| 久久久久国产成人精品亚洲午夜| av午夜福利一片免费看久久| 狠狠色婷婷久久综合频道日韩 | 国产99精品久久| 中文字幕无码免费久久| 欧美激情精品久久久久久| 国产精品99久久久久久董美香| 国产精品久久免费| 区久久AAA片69亚洲| 亚洲一区精品伊人久久伊人| 精品一久久香蕉国产线看播放| 狠狠色丁香婷婷综合久久来| 无遮挡粉嫩小泬久久久久久久 | 久久久久亚洲AV无码专区体验| 久久精品国产AV一区二区三区|