自己写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("###################################################################\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的更多相关文章
- <linux/init.h>,<linux/module.h>头文件不存在等问题的解决方法
这个问题真心是处理了一个下午,还自己去下载了个最新的内核拿来编译,其实是完全没必要的,因为ubuntu系统是可以直接下载新内核的. 你可以在/usr/src/文件夹下找到这些内核文件夹,比如说我自己的 ...
- 手把手教你写Linux设备驱动---中断(三)--workqueue实现(基于友善之臂4412开发板) 【转】
转自:http://blog.csdn.net/morixinguan/article/details/69680909 上节,我们讲到如何来实现tasklet小任务机制 http://blog.cs ...
- 超简单易用的 “在 pcduino 开发板上写 Linux 驱动控制板载 LED 的闪烁”
版权声明:本文为博主原创文章,未经博主同意不得转载.转载联系 QQ 30952589,加好友请注明来意. https://blog.csdn.net/sleks/article/details/251 ...
- Linux Module
catalog . 概述 . 使用模块 . 插入和删除模块 . 自动化与热插拔 . 版本控制 1. 概述 模块(module)是一种向Linux内核添加设备驱动程序.文件系统及其他组件的有效方法,而无 ...
- 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 ...
- linux Module驱动开发-一切刚刚开始
linux内核是可以高度定制的,通过配置编译选项达到定制的目的. 在配置kernel编译选项时驱动程序的编译选项一般有三种,不编译.编译为内核驱动.编译为模块驱动.所以linux驱动一般分为两类,内核 ...
- My First Linux Module
My First Linux Module Today, I successfully build my first linux hello module. First of all add a di ...
- Linux Module框架【转】
转自:http://www.cnblogs.com/LittleHann/p/4558719.html catalog 1. 概述 2. 使用模块 3. 插入和删除模块 4. 自动化与热插拔 5. 版 ...
- 教你写Linux设备驱动程序:一个简短的教程
教你写Linux设备驱动程序:一个简短的教程 http://blog.chinaunix.net/uid-20799298-id-99675.html
随机推荐
- 为什么NULL能多次free
void __cdecl _free_base (void * pBlock) { int retval = 0; if (pBlock == NULL) ...
- B2C网站的系统
管理系统 管理系统:主要做业务上的管理和内容输出,常见的有CMS(内容管理系统).CRM.SCM等, 1 供应商作为第三方,有独立开发的系统(SRM)和IO系统对接.以确定订单的状态.当然IO系统里面 ...
- Eclipse Missing artifact jdk.tools:jdk.tools:jar:1.6
Missing artifact jdk.tools:jdk.tools:jar:1.6 问题出在Eclipse Maven的支持上,在Eclipse下,java.home变量设置为用于启动Eclip ...
- 使用密码登陆Amazon EC2
用的是亚马逊推荐的系统:Amazon Linux AMI 2015.09.1 (HVM) 创建instance后,会有一个pem的key使用该密钥登陆到服务器上后,默认用户名为 ec2-user 直接 ...
- WPF常规表单验证
1:ViewModel 实现验证接口 IDataErrorInfo 2:实现接口的相关验证逻辑,并把错误信息反馈给 Error public string this[string columnName ...
- POI教程
很多时候,一个软件应用程序需要生成Microsoft Excel文件格式的报告.有时,一个应用程序甚至希望将Excel文件作为输入数据.例如,一个公司开发的应用程序将财务部门需要所有输出生成自己的Ex ...
- WireMock提供Restful接口数据
1.去官网下载并启动: 2.引入Pom依赖(主要是com.github.tomakehurst:wiremock): <dependency> <groupId>com.git ...
- document.readyState和document.DOMContentLoaded判断DOM的加载完成
document.readyState:判断文档是否加载完成.firefox不支持. 这个属性是只读的,传回值有以下的可能: 0-UNINITIALIZED:XML 对象被产生,但没有任何文件被加载. ...
- python获取每日涨跌停股票统计,封闭时间和打开次数
接口:limit_list 描述:获取每日涨跌停股票统计,包括封闭时间和打开次数等数据,帮助用户快速定位近期强(弱)势股,以及研究超短线策略. 限量:单次最大1000,总量不限制 积分:用户积2000 ...
- 看过这些我明白了依赖注入及IoC
背景 最近一段时间在学习laravel框架,了解到这个框架一个比较核心的概念就是服务容器,而服务容器似乎又和依赖注入有关系.但是碍于官方关于这方面的讲解篇幅过少,所以自学了一下. 自学的途径也跟大家一 ...