- 論壇徽章:
- 3
|
回復(fù) 3# netdoger
這是單一節(jié)點且flat memory model時, 通過pfn查找相應(yīng)的page descriptor的函數(shù).
struct page *mem_map;
#define __pfn_to_page(pfn) (mem_map + ((pfn) - ARCH_PFN_OFFSET)) // ARCH_PFN_OFFSET 如果沒有特別配置,一般為0.
你指的第三個page frame的page desciptor, 是從mem_map指向的內(nèi)存移動了2*sizeof(struct page) 字節(jié) 不就等于 mem_map + 2。
為什么書上說mem_map的起始地址一定是0xC1000000,可是我得出卻是0?
mm/memory.c中
#ifndef CONFIG_NEED_MULTIPL_NODES /*UMA*/
unsigned long max_mapnr;
struct page *mem_map;
...
#endif
mm/page_alloc.c中
alloc_node_mem_map()函數(shù)負責申請mem_map的內(nèi)存.
這里提到:
#ifdef CONFIG_FLAT_NODE_MEM_MAP
...
map = alloc_remap(pgdat->node_id, size);
if (!map)
map = alloc_bootmem_node(); // 申請分配mem_map的內(nèi)存
pgdat-> node_mem_map = map + (pgdat-> node_start_pfn - start);
#ifndef CONFIG_NEED_MULITPLE_NODES
if (pgdat == NODE_DATA[0])){ //如果是第一個節(jié)點
mem_map = NODE_DATA[0]->node_mem_map;
.....
}
...
#endif
#endif
從上面兩個函數(shù)來看,都使用了條件宏. 說明mem_map不僅和內(nèi)存模型有關(guān), 而且和內(nèi)存節(jié)點有關(guān).
因此, 在某些架構(gòu)中, mem_map不一定被賦值.
我個人覺得, 最好通過隱藏了底部細節(jié)的NODE_DATA(節(jié)點描述符數(shù)組)來獲得mem_map的起始地址:
NODE_DATA[0]->node_mem_map.
另外你可以通過dmesg | grep -e 'node_mem_map'來獲得 'mem_map'的地址. |
|