资源描述
实验6 系统缺页次数统计实验
1.实验目的
u 理解内存管理中缺页的概念
u 综合运用实验1, 实验4, 实验5中/proc文件系统、内存管理、系统调用、内核编译的知识
u 掌握向/proc文件系统中增加文件的方法
u 掌握Linux内核模块的概念和操作方法
2.实验内容(上交的实验2统一取名为:test2)
通过在内核中自建变量并利用/proc文件系统作为中介的方法来统计系统缺页次数
3. 设计思想及算法流程
缺页次数 :
虚拟内存技术的应用使得进程线性地址空间里的页面不必常驻内存。当CPU请求一个不在内存中的页面时,会发生缺页,比如我们从内存读取/写入数据,而数据未在内存,此时都会发生缺页。缺页被定义为一种异常(缺页异常),会触发缺页中断处理流程。
每种CPU结构提供一个do_page_fault处理缺页中断。由于每发生一次缺页都要进入缺页中断服务函数do_page_fault一次,所以统计该函数被调用的次数就可以得到系统从开机到现在的缺页次数。
/proc文件系统 :
/proc文件系统的文件记录了当前所有的系统信息,包括进程、文件系统、硬件等等。因此,可以通过在/proc中添加一个文件的方式,查看内存进程中的一些自定义运行参数,从而达到使用/proc实现内核与用户空间通信的目的。
在do_page_fault函数上一行定义统计缺页次数全局变量pfcount
unsigned long volatile pfcount;
将pfcount加入到do_page_fault中,用以统计缺页次数.
pfcount++;
声明全局变量pfcount到头文件mm.h中
extern unsigned long volatile pfcount;
导出pfcount全局变量,让整个内核都可以访问
EXPORT_SYMBOL(pfcount);
4. 源程序
/*内核模块代码*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/proc_fs.h>
#include <linux/string.h>
#include <asm/uaccess.h>
struct proc_dir_entry *proc_pf;
struct proc_dir_entry *proc_pfcount;
extern unsigned long volatile pfcount;
static inline struct proc_dir_entry *proc_pf_create(const char* name,
mode_t mode, read_proc_t *get_info)
{
return create_proc_read_entry(name, mode, proc_pf, get_info, NULL);
}
int get_pfcount(char *buffer, char **start, off_t offset, int length, int *peof,
void *data)
{
int len = 0;
len = sprintf(buffer, "%ld \n", pfcount);
return len;
}
static int pf_init(void)
{
proc_pf = proc_mkdir("pf", 0);
proc_pf_create("pfcount", 0, get_pfcount);
return 0;
}
static void pf_exit(void)
{
remove_proc_entry("pfcount", proc_pf);
remove_proc_entry("pf", 0);
}
module_init(pf_init);
module_exit(pf_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Aron.t.wang");
5.运行结果
N
展开阅读全文