<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM linux 建立頁(yè)表過(guò)程

ARM linux 建立頁(yè)表過(guò)程

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

本文引用地址:http://dyxdggzs.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這個(gè)函數根據CPU類(lèi)型,設置mem_types全局數組,mem_types數組保存了頁(yè)目錄和頁(yè)表的屬性,將來(lái)創(chuàng )建頁(yè)目錄和頁(yè)表時(shí),會(huì )用到mem_types。


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

VMALLOC_MIN定義了vmalloc區的起始位置(通過(guò)VMALLOC_END和vmalloc_reserve計算得出),VMALLOC_END定義了vmalloc區的結束位置,vmalloc_reserve是系統預留給vmalloc區的大小。

prepare_page_table這個(gè)函數會(huì )請空頁(yè)目錄,有兩塊地址空間區域是不需要清除的,一個(gè)是kernel image,另外一個(gè)是kernel線(xiàn)性地址映射區

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

bootmem_init :

1. 調用check_initrd獲取initrd所在的memory bank對應的node

2. 對每一個(gè)節點(diǎn):

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

3. 對每一個(gè)node 調用bootmem_free_node

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

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

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

1. 把machine vectors映射到0xffff0000處

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

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

empty zero page

按照源碼注釋?zhuān)且粋€(gè)特定的初始化為0的頁(yè),用于COW

我的理解是,系統有時(shí)需要一個(gè)頁(yè)面全零,這種情況下,并不需要分配一個(gè)全零的頁(yè)面,而是讓PTE指向empty_zero_page,當試圖寫(xiě)這個(gè)page時(shí),由于這個(gè)empty_zero_page是共享的,所以導致了COW。



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

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>