u4linux 发表于 2016-03-16 17:34

请问如何查看NUMA节点中内存域的起止地址

我现在有一台已经装好了的linux机器,NUMA节点及内存域的划分如下:
Node 0, zone      DMA
Node 0, zone    DMA32
Node 0, zone   Normal
Node 1, zone   Normal
我现在要画一个内存分布图,请问我怎么才能查看到每个内存域的起止物理地址?谢谢!!

Buddy_Zhang1 发表于 2016-03-16 17:37

我先写一个测试代码,测试通过了就给您

u4linux 发表于 2016-03-16 17:40

多谢!!回复 2# Buddy_Zhang1


   

Buddy_Zhang1 发表于 2016-03-16 17:58

本帖最后由 Buddy_Zhang1 于 2016-03-16 20:59 编辑

void TestCase_PHYS_NUM(void)
{
#define NUM_NUMA 2
        struct pglist_data *pgdat;
        struct zonelist *zonelist;
        struct zoneref *zrf;
        struct zone *zone;
        struct page *page;
        int i;
        int high_idx = { 2,0 };


        for(i = 0 ; i < NUM_NUMA ; i++) {
                pgdat = NODE_DATA(i);
                zonelist = pgdat->node_zonelists;

                for_each_zone_zonelist(zone,zrf,zonelist,high_idx)
                        printk("Zone %s start_pfn %p start_phys %pend_pfn %p end_phys %p\n",
                                        zone->name,zone->zone_start_pfn,
                                        pfn_to_phys(zone->zone_start_pfn),
                                  zone->zone_start_pfn + zone->spanned_pages,
                      pfn_to_phys(zone->zone_start_pfn + zone->spanned_pages));

        }
#undef NUM_NUMA
}原理就是内核启动过程中,会初始化每个 zone ,将该区域的起始的页帧号写到 zone->zone_start_pfn,
还会把这个区域的页帧数都写到 zone->spanned_pages 里面,我只要遍历所有节点的所有 zone 就可以获得这些信息。

nswcfd 发表于 2016-03-17 09:18

没有现成的proc或者sys接口么?
页: [1]
查看完整版本: 请问如何查看NUMA节点中内存域的起止地址