博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自己写Linux module来收集buddy info
阅读量:6601 次
发布时间:2019-06-24

本文共 4650 字,大约阅读时间需要 15 分钟。

1 编写代码pslist.c

1: #include
2: #include
3: #include
4: #include
5: #include
6: #include
7: #include
8: #include
9: #include
10: #include
11: #include
12: #include
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

转载于:https://www.cnblogs.com/long123king/p/3481878.html

你可能感兴趣的文章
Flume Log4J Appender Flume收集Log4j日志
查看>>
我的友情链接
查看>>
Redhat7 替换Centos7 yum源
查看>>
Linux下使用parted分区工具为大于2T硬盘分区
查看>>
在fedora28龙芯版中,让播放器和浏览器硬解1080和4k视频
查看>>
PHP+Mongodb+Nginx+Gridfs安装配置
查看>>
andriod中设置EditText的圆角弧度
查看>>
数据分析达人博客大全
查看>>
WinAPI: CallNextHookEx - 调用下一个钩子
查看>>
学习java虚拟机--类文件结构
查看>>
捕捉全屏图像
查看>>
SQLServer学习笔记(1)
查看>>
MIT Introduction to Algorithms 学习笔记(六)
查看>>
编译Android出错:Unable to execute dex: Java heap space
查看>>
.net实现高效的Http处理
查看>>
Hibernate(二)
查看>>
java基础jkd环境变量配置以及软件安装
查看>>
SVProgressHUD–比MBProgressHUD更好用的 iOS进度提示组件
查看>>
libusb的嵌入式移植
查看>>
Web应用程序安全与风险
查看>>