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 
  • 相关阅读:
    Javajdbc
    Web Project添加Struts2框架
    CSS去除免费虚拟主机的广告心得分享
    List<T>采用delegate快速实现排序、查找等操作
    ASP.NET视频采集站核心技术分析(附送对付搜索引擎蜘蛛的贱招)
    Azure完整实例:在线日程表
    [发布]ClouderaCMS: 基于Windows Azure的开源CMS
    获取配置文件节点的值
    asp.net DataGrid排序
    checkbox 获取选中的值
  • 原文地址:https://www.cnblogs.com/long123king/p/3481878.html
Copyright © 2011-2022 走看看