- 论坛徽章:
- 3
|
回复 3# netdoger
这是单一节点且flat memory model时, 通过pfn查找相应的page descriptor的函数.
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指向的内存移动了2*sizeof(struct page) 字节 不就等于 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()函数负责申请mem_map的内存.
这里提到:
#ifdef CONFIG_FLAT_NODE_MEM_MAP
...
map = alloc_remap(pgdat->node_id, size);
if (!map)
map = alloc_bootmem_node(); // 申请分配mem_map的内存
pgdat-> node_mem_map = map + (pgdat-> node_start_pfn - start);
#ifndef CONFIG_NEED_MULITPLE_NODES
if (pgdat == NODE_DATA[0])){ //如果是第一个节点
mem_map = NODE_DATA[0]->node_mem_map;
.....
}
...
#endif
#endif
从上面两个函数来看,都使用了条件宏. 说明mem_map不仅和内存模型有关, 而且和内存节点有关.
因此, 在某些架构中, mem_map不一定被赋值.
我个人觉得, 最好通过隐藏了底部细节的NODE_DATA(节点描述符数组)来获得mem_map的起始地址:
NODE_DATA[0]->node_mem_map.
另外你可以通过dmesg | grep -e 'node_mem_map'来获得 'mem_map'的地址. |
|