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("###################################################################\n");

  30:  

  31:     node_0 = NODE_DATA(0);

  32:     printk("node_0 at 0x%08x\n", 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\n", node_present_pages);

  39:     printk("spanned pages: %d\n", 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\n", i, pzone->name);

  47:         start_pfn = pzone->zone_start_pfn;

  48:         printk("start_pfn : %d\n", start_pfn);

  49:         present_pages = pzone->present_pages;

  50:         printk("present_pages : %d\n", present_pages);

  51:         spanned_pages = pzone->spanned_pages;

  52:         printk("spanned_pages : %d\n", spanned_pages);

  53:         printk("%8d MB - %8d MB\n", 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("\n");

  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("###################################################################\n");

  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 

自己写Linux module来收集buddy info的更多相关文章

  1. <linux/init.h>,<linux/module.h>头文件不存在等问题的解决方法

    这个问题真心是处理了一个下午,还自己去下载了个最新的内核拿来编译,其实是完全没必要的,因为ubuntu系统是可以直接下载新内核的. 你可以在/usr/src/文件夹下找到这些内核文件夹,比如说我自己的 ...

  2. 手把手教你写Linux设备驱动---中断(三)--workqueue实现(基于友善之臂4412开发板) 【转】

    转自:http://blog.csdn.net/morixinguan/article/details/69680909 上节,我们讲到如何来实现tasklet小任务机制 http://blog.cs ...

  3. 超简单易用的 “在 pcduino 开发板上写 Linux 驱动控制板载 LED 的闪烁”

    版权声明:本文为博主原创文章,未经博主同意不得转载.转载联系 QQ 30952589,加好友请注明来意. https://blog.csdn.net/sleks/article/details/251 ...

  4. Linux Module

    catalog . 概述 . 使用模块 . 插入和删除模块 . 自动化与热插拔 . 版本控制 1. 概述 模块(module)是一种向Linux内核添加设备驱动程序.文件系统及其他组件的有效方法,而无 ...

  5. linux/module.h: No such file or directory 内核模块编译过程

    1.缺少Linux kernel头文件 To install just the headers in Ubuntu: sudo apt-get install linux-headers-$(unam ...

  6. linux Module驱动开发-一切刚刚开始

    linux内核是可以高度定制的,通过配置编译选项达到定制的目的. 在配置kernel编译选项时驱动程序的编译选项一般有三种,不编译.编译为内核驱动.编译为模块驱动.所以linux驱动一般分为两类,内核 ...

  7. My First Linux Module

    My First Linux Module Today, I successfully build my first linux hello module. First of all add a di ...

  8. Linux Module框架【转】

    转自:http://www.cnblogs.com/LittleHann/p/4558719.html catalog 1. 概述 2. 使用模块 3. 插入和删除模块 4. 自动化与热插拔 5. 版 ...

  9. 教你写Linux设备驱动程序:一个简短的教程

    教你写Linux设备驱动程序:一个简短的教程 http://blog.chinaunix.net/uid-20799298-id-99675.html

随机推荐

  1. C# Winform版批量压缩图片程序

    需求 上周,领导给我分配了一个需求:服务器上的图片文件非常大,每天要用掉两个G的大小的空间,要做一个自动压缩图片的工具处理这些大图片.领导的思路是这样的: 1)打开一个图片,看它的属性里面象素是多少, ...

  2. Nacos Config客户端与Spring Boot、Spring Cloud深度集成

    目录 Nacos与Spring Boot集成 @NacosPropertySource和@NacosValue com.alibaba.nacos.spring.core.env.NacosPrope ...

  3. Rust <5>:测试

    测试运行顺序:单元测试(同处于源文件中,以 #[cfg(tests)] 标记 mod,以 #[test] 标记 function).集成测试(位于项目根路径下的 tests 目录下,不需要 #[cfg ...

  4. layer通过父页面调用子页面的方法及属性

    引言 在使用layer.js的过程中,需要通过layer.open()以iframe的形式打开特定的页面,同时需要用layer的按钮对打开的页面进行提交及重置操作,但是苦于不知如何在父页面调用子页面的 ...

  5. UltraEdit常用快捷键

    UltraEdit是一套功能强大的文本编辑器,可以编辑文本.十六进制.ASCII码,可以取代记事本,内建英文单字检查.C++及VB指令突显,可同时编辑多个文件,而且即使开启很大的文件速度也不会慢. 说 ...

  6. Javascript高级程序设计--读书笔记之面向对象(一)

    哈哈哈万物皆对象,终于到了js的面向对象篇. 一.属性类型 (1)数据属性 数据属性包含一个数据值的位置,在这个位置可以写入和读取数值,数据属性有四个描述器行为的特性 [[Configurable]] ...

  7. HTML + CSS (下)【更新中】

    弹性盒子: 定义:弹性盒子模型是css3中新提出的一种布局方案.是一种为了应对针对不同屏幕宽度不同设备的一整套新的布局方案. 主要是对一个容器中的子元素进行排列.对齐和分配空白空间的方案的调整. 新旧 ...

  8. ORACLE PL、SQL编程

    PL(Procedural Language)过程化的编程语言,是在SQL的基础上增加的部分,如:变量的使用.流程控制等, 重点学习Oracle和MySQL创建存储过程及流程控制的异同. 一.存储过程 ...

  9. svnlook - Subversion 仓库检索工具

    SYNOPSIS 总览 svnlook command /path/to/repos [options] [args] OVERVIEW 概述 Subversion 是一个版本控制系统,允许保存旧版本 ...

  10. qfile读取txt文件

    QFile f("D:\\测试数据\\单波束数据\\灯浮.TGT"); if (!f.open(QIODevice::ReadOnly|QIODevice::Text))//打开指 ...