• <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++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              69 隨筆 :: 0 文章 :: 28 評(píng)論 :: 0 Trackbacks
            From Unix某論壇,忘記名字了...但這段文字從宏觀上講清楚了Linux Memory的構(gòu)架。
            1.
            內(nèi)核初始化:

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

            2.
            內(nèi)核模塊申請(qǐng)內(nèi)存vaddr = get_free_pages(mask,order)

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

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

                * CPU
            獲得vaddr這個(gè)虛地址,利用建立好的頁目錄頁表數(shù)據(jù)庫,找到其對(duì)應(yīng)的物理內(nèi)存地址;
                *
            eax的內(nèi)容寫入vaddr對(duì)應(yīng)的物理內(nèi)存地址內(nèi);

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

                *
            依據(jù)vaddr找到對(duì)應(yīng)的page;
                *
            將該page加入到free_list中;

            5.
            用戶進(jìn)程申請(qǐng)內(nèi)存vaddr = malloc(size)

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

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

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

            7.
            用戶進(jìn)程釋放內(nèi)存vaddrfree(vaddr)

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

            綜合說明:

                *
            可用物理內(nèi)存就是free_list中各page對(duì)應(yīng)的物理內(nèi)存;
                *
            頁目錄頁表數(shù)據(jù)庫的主要目的是為CPU訪問物理內(nèi)存時(shí)轉(zhuǎn)換vaddr-->paddr使用,分配以及釋放內(nèi)存時(shí)不會(huì)用到,但是需要內(nèi)核內(nèi)存管理系統(tǒng)在合適時(shí)機(jī)為CPU建立好該庫;
                *
            對(duì)于用戶進(jìn)程在6中獲得的物理頁面,有兩個(gè)頁表項(xiàng)對(duì)應(yīng),一個(gè)就是內(nèi)核頁目錄頁表數(shù)據(jù)庫的某個(gè)pte[i ],一個(gè)就是當(dāng)前進(jìn)程內(nèi)核頁目錄頁表數(shù)據(jù)庫的某個(gè) pte[j],但是只有一個(gè)page和其對(duì)應(yīng)。如果此時(shí)調(diào)度到其他進(jìn)程,其他進(jìn)程申請(qǐng)并訪問某個(gè)內(nèi)存,則不會(huì)涉及到該物理頁面,因?yàn)槠浞峙鋾r(shí)首先要從 free_list中找一個(gè)page,而該物理頁面對(duì)應(yīng)的page已經(jīng)從free_list中脫離出來了,因此不存在該物理頁面被其他進(jìn)程改寫操作的情況。內(nèi)核中通過get_free_pages等方式獲取內(nèi)存時(shí),也不會(huì)涉及到該物理頁面,原理同前所述。
            posted on 2013-12-09 17:42 Torres 閱讀(463) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Useful information
            91久久香蕉国产熟女线看| 精品国产VA久久久久久久冰| 99久久精品国产毛片| 超级碰久久免费公开视频| 中文字幕精品久久| 国产情侣久久久久aⅴ免费| 精品久久综合1区2区3区激情 | 亚洲国产成人久久精品99 | 国产精品99久久精品爆乳| 久久精品人人做人人爽电影| 99久久国语露脸精品国产| 一本色综合久久| 国产精品熟女福利久久AV| 久久精品中文无码资源站| 天天影视色香欲综合久久| 亚洲国产精品久久久久网站| 亚洲午夜久久久久久噜噜噜| 久久国产成人精品国产成人亚洲| 一本一道久久综合狠狠老| 久久精品国产欧美日韩| 久久被窝电影亚洲爽爽爽| 亚洲中文字幕无码久久精品1| 精品水蜜桃久久久久久久| 欧美精品一本久久男人的天堂 | …久久精品99久久香蕉国产| 久久久噜噜噜久久中文字幕色伊伊 | 久久99免费视频| 国产精品美女久久久m| 777午夜精品久久av蜜臀| 2021国内精品久久久久久影院| 久久久WWW成人免费毛片| 国产午夜精品久久久久九九电影| 久久ZYZ资源站无码中文动漫 | 97超级碰碰碰久久久久| 久久亚洲AV成人出白浆无码国产| 久久精品国产精品亚洲精品| 人妻无码精品久久亚瑟影视 | 中文字幕热久久久久久久| 伊人色综合九久久天天蜜桃| 日本加勒比久久精品| 久久亚洲精品无码aⅴ大香|