zoukankan      html  css  js  c++  java
  • 自己写Linux module来收集buddy info

    1 编写代码pslist.c

       1: #include<linux/init.h>
       2: #include<linux/module.h>
       3: #include<linux/list.h>
       4: #include<linux/sched.h>
       5: #include<linux/proc_fs.h>
       6: #include<linux/mm_types.h>
       7: #include<linux/fs.h>
       8: #include<linux/path.h>
       9: #include<linux/dcache.h>
      10: #include<linux/mm.h>
      11: #include<linux/mmzone.h>
      12: #include<linux/vmalloc.h>
      13:  
      14: MODULE_LICENSE("GPL");
      15:  
      16: int analyzeUMANode()
      17: {
      18:     int i,j;
      19:     unsigned long node_present_pages;
      20:     unsigned long node_spanned_pages;
      21:     struct pglist_data* node_0;
      22:     
      23:     struct zone* pzone;
      24:     unsigned long start_pfn;
      25:     unsigned long present_pages;
      26:     unsigned long spanned_pages;
      27:     struct free_area* pfreearea;
      28:     
      29:     printk("###################################################################
    ");
      30:  
      31:     node_0 = NODE_DATA(0);
      32:     printk("node_0 at 0x%08x
    ", node_0);
      33:     if (node_0 == NULL)
      34:         return 0;
      35:         
      36:     node_present_pages = node_0->node_present_pages;
      37:     node_spanned_pages = node_0->node_spanned_pages;
      38:     printk("present pages: %d
    ", node_present_pages);
      39:     printk("spanned pages: %d
    ", node_spanned_pages);
      40:     
      41:     for (i = 0; i < MAX_NR_ZONES; ++i)
      42:     {
      43:         pzone = &node_0->node_zones[i];
      44:         if (pzone == NULL)
      45:             continue;
      46:         printk("Zone %d Name: %s
    ", i, pzone->name);
      47:         start_pfn = pzone->zone_start_pfn;
      48:         printk("start_pfn : %d
    ", start_pfn);
      49:         present_pages = pzone->present_pages;
      50:         printk("present_pages : %d
    ", present_pages);
      51:         spanned_pages = pzone->spanned_pages;
      52:         printk("spanned_pages : %d
    ", spanned_pages);
      53:         printk("%8d MB - %8d MB
    ", start_pfn * PAGE_SIZE / 1024 / 1024, (start_pfn + spanned_pages) * PAGE_SIZE / 1024 / 1024);
      54:         pfreearea = &pzone->free_area;
      55:         if (pfreearea == NULL)
      56:             continue;
      57:         for (j = 0; j < MAX_ORDER; ++j)
      58:         {
      59:             printk("%5d", (pfreearea + j)->nr_free);    
      60:         }
      61:         printk("
    ");
      62:     }    
      63:     return 0;
      64: }
      65:  
      66: static int pslist_init()
      67: {
      68:     analyzeUMANode();
      69:         
      70: }
      71:  
      72: static void pslist_exit()
      73: {
      74:     printk("###################################################################
    ");
      75: }
      76:  
      77: module_init(pslist_init);
      78: module_exit(pslist_exit);

    2 编写Makefile

       1: obj-m += pslist.o
       2: #generate the path
       3: CURRENT_PATH:=$(shell pwd)
       4: #the current kernel version number
       5: LINUX_KERNEL:=$(shell uname -r)
       6: #the absolute path
       7: LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)
       8: #complie object
       9: all:
      10:     make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
      11: #clean
      12: clean:
      13:     make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean

    3 编译

       1: sudo make clean
       2: sudo make

    4 加载模块,卸载模块

       1: sudo insmod pslist.ko
       2: sudo rmmod pslist

    5 收集打印出来的信息

       1: dmesg | tail -100

    示例如下:

       1: [ 4011.124611] ###################################################################
       2: [ 4011.124614] node_0 at 0xc17b11c0
       3: [ 4011.124615] present pages: 262015
       4: [ 4011.124616] spanned pages: 262112
       5: [ 4011.124617] Zone 0 Name: DMA
       6: [ 4011.124618] start_pfn : 16
       7: [ 4011.124619] present_pages : 3951
       8: [ 4011.124619] spanned_pages : 4080
       9: [ 4011.124620]        0 MB -       16 MB
      10: [ 4011.124621]     2    2    1    2    3    2    2    1    2    2    2
      11: [ 4011.124624] Zone 1 Name: Normal
      12: [ 4011.124625] start_pfn : 4096
      13: [ 4011.124626] present_pages : 221486
      14: [ 4011.124626] spanned_pages : 223230
      15: [ 4011.124627]       16 MB -      887 MB
      16: [ 4011.124628]   161   65  150  197   48   54   34   12    7    2   55
      17: [ 4011.124631] Zone 2 Name: HighMem
      18: [ 4011.124632] start_pfn : 227326
      19: [ 4011.124632] present_pages : 34530
      20: [ 4011.124633] spanned_pages : 34802
      21: [ 4011.124634]      887 MB -     1023 MB
      22: [ 4011.124635]    76   98   31    6    1    0    0    0    0    0    0
      23: [ 4011.124637] Zone 3 Name: Movable
      24: [ 4011.124638] start_pfn : 0
      25: [ 4011.124638] present_pages : 0
      26: [ 4011.124639] spanned_pages : 0
      27: [ 4011.124640]        0 MB -        0 MB
      28: [ 4011.124641]     0    0    0    0    0    0    0    0    0    0    0
      29: [ 4095.143430] ###################################################################

    6 与proc文件系统打印出来的信息做对比

       1: $ cat /proc/buddyinfo
       2: Node 0, zone      DMA      2      2      1      2      3      2      2      1      2      2      2 
       3: Node 0, zone   Normal    371    196    176    229     81     57     39     12      3      3     53 
       4: Node 0, zone  HighMem     76     98     31      6      1      0      0      0      0      0      0 
  • 相关阅读:
    前沿技术解密——VirtualDOM
    Ques核心思想——CSS Namespace
    Unix Pipes to Javascript Pipes
    Road to the future——伪MVVM库Q.js
    聊聊CSS postproccessors
    【译】十款性能最佳的压缩算法
    Kafka Streams开发入门(9)
    Kafka Streams开发入门(8)
    【译】Kafka Producer Sticky Partitioner
    【译】99th Percentile Latency at Scale with Apache Kafka
  • 原文地址:https://www.cnblogs.com/long123king/p/3481878.html
Copyright © 2011-2022 走看看