在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ARM linux 建立頁表過程

            ARM linux 建立頁表過程

            作者: 時間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
            paging_init 用來建立頁表,初始化zone的memory map

            本文引用地址:http://www.biyoush.com/article/201611/317934.htm
            void *zero_page;sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL);build_mem_type_table();sanity_check_meminfo();prepare_page_table();map_lowmem();bootmem_init();devicemaps_init(mdesc);kmap_init();top_pmd = pmd_off_k(0xffff0000);/** allocate the zero page.  Note that this always succeeds and* returns a zeroed result.*/zero_page = alloc_bootmem_low_pages(PAGE_SIZE);empty_zero_page = virt_to_page(zero_page);__flush_dcache_page(NULL, empty_zero_page);

            build_mem_type_table這個函數(shù)根據(jù)CPU類型,設(shè)置mem_types全局?jǐn)?shù)組,mem_types數(shù)組保存了頁目錄和頁表的屬性,將來創(chuàng)建頁目錄和頁表時,會用到mem_types。


            sanity_check_meminfo檢測判斷是否需要創(chuàng)建highmem區(qū),并且重建描述內(nèi)存bank的數(shù)組

            VMALLOC_MIN定義了vmalloc區(qū)的起始位置(通過VMALLOC_END和vmalloc_reserve計算得出),VMALLOC_END定義了vmalloc區(qū)的結(jié)束位置,vmalloc_reserve是系統(tǒng)預(yù)留給vmalloc區(qū)的大小。

            prepare_page_table這個函數(shù)會請空頁目錄,有兩塊地址空間區(qū)域是不需要清除的,一個是kernel image,另外一個是kernel線性地址映射區(qū)

            map_lowmem建立低端內(nèi)存的所有頁目錄和頁表:遍歷memory bank,映射那些沒有highmem標(biāo)記的內(nèi)存bank

            bootmem_init :

            1. 調(diào)用check_initrd獲取initrd所在的memory bank對應(yīng)的node

            2. 對每一個節(jié)點(diǎn):

            • 獲取該node的 min(最小pfn), node_low(最大low memory pfn), node_hight(最大high memory pfn)
            • 調(diào)用bootmem_init_node初始化node,bootmem_init_node會初始化bootmem bitmap
            • 如果是node 0,那么調(diào)用reserve_node_zero為node 0 reserve的內(nèi)存:內(nèi)核text和data區(qū),初始化頁表區(qū)(16KB),以及swapper_pg_dir之前的一塊內(nèi)存(在我的機(jī)器上是4個page)
            • 如果initrd存放在當(dāng)前的node上,那么調(diào)用bootmem_reserve_initrd保留initrd占用的內(nèi)存。initrd_start是initrd在起始虛擬內(nèi)存地址,initrd_end是initrd結(jié)束的虛擬內(nèi)存地址。

            3. 對每一個node 調(diào)用bootmem_free_node

            • 設(shè)置這個node內(nèi)各個zone的大小
            • 調(diào)用free_area_init_node:計算node的總pages數(shù)目,為這個node分配mem map,注意node內(nèi)所有zone的memmap都分配在一起
            • 調(diào)用free_area_init_core:對于node內(nèi)的每一個zone,進(jìn)行初始化。注意這個函數(shù)present_pages是total size減去了該分區(qū)對應(yīng)的memmap占用的pages,但是實(shí)際上memmap是放在node的開始位置,這里似乎不應(yīng)該減去這個值

            4. high_memory 是一個很奇怪的變量,high_memory應(yīng)該是物理內(nèi)存的概念,但是high_memory變量保存的確實(shí)一個內(nèi)核地址。

            devicemaps_init這個函數(shù)創(chuàng)建device的映射,

            1. 把machine vectors映射到0xffff0000處

            2. 調(diào)用平臺特定的map_io,對于mx51,這個函數(shù)主要是映射mx51功能寄存器區(qū), AIPS1 AIPS2 和SPBA0,這三個寄存器區(qū)大小為1MB,映射后的虛擬地址分別為0xF7E00000,0xF7D00000,0xFB100000

            kmap_init 創(chuàng)建pkmap的pgd和pte。并且讓pkmap_page_table指向這個PTE page的linux p/t。一般來說kmap都是使用一個page的pte來映射高端內(nèi)存到內(nèi)核地址空間,對于arm來說,每個page可以存放512個pte_t,所以pkmap的地址空間為2M。

            empty zero page

            按照源碼注釋,它是一個特定的初始化為0的頁,用于COW

            我的理解是,系統(tǒng)有時需要一個頁面全零,這種情況下,并不需要分配一個全零的頁面,而是讓PTE指向empty_zero_page,當(dāng)試圖寫這個page時,由于這個empty_zero_page是共享的,所以導(dǎo)致了COW。



            關(guān)鍵詞: ARMlinux建立頁

            評論


            技術(shù)專區(qū)

            關(guān)閉