文档详情

统计缺页次数

飞****9
实名认证
店铺
DOC
225KB
约4页
文档ID:131344774
统计缺页次数_第1页
1/4

统计操作系统缺页次数实验目的学习虚拟内存的基本原理和Linux虚拟内存管理技术;深入理解、掌握Linux的按需调页过程;掌握内核模块的概念和操作方法,和向/proc文件系统中增加文件的方法;综合运用内存管理、系统调用、proc文件系统、内核编译的知识实验内容1.原理Linux的虚拟内存技术采用按需调页,当CPU请求一个不在内存中的页面时,会发生缺页,缺页被定义为一种异常(缺页异常),会触发缺页中断处理流程每种CPU结构都提供一个do_page_fault处理缺页中断由于每发生一次缺页都要进入缺页中断服务函数do_page_fault一次,所以可以认为执行该函数的次数就是系统发生缺页的次数因此可以定义一个全局变量pfcount 作为计数变量,在执行do_page_fault时,该变量值加1本实验通过动态加载模块的方法,利用/proc文件系统作为中介来获取该值2.实验环境 操作系统:Ubuntu 12.04(内核版本为3.2.0-23-generic-pae)内核源码:linux-3.2.58实验指导1. 下载一份内核源代码并解压Linux受GNU通用公共许可证(GPL)保护,其内核源代码是完全开放的。

现在很多Linux的网站都提供内核代码的下载推荐使用Linux的官方网站:http://www.kernel.org图1 Linux的官方网站在terminal下可以通过wget命令下载源代码:$ cd /tmp$ wget http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.2.58.tar.xz切换到root身份,解压源代码到/usr/src目录下:# xz –d linux-3.2.58.tar.xz# tar –xvf linux-3.2.58.tar –C /usr/src2. 修改内核源代码,添加统计变量1、切换到预编译内核目录#cd /usr/src/linux-3.2.582、修改处理内存访问异常的代码//用vi编辑器打开fault.c,一般使用Intel x86体系结构,则修改arch/x86/目录下的文件#vi arch/x86/mm/fault.c//在do_page_fault函数的上一行定义统计缺页次数的全局变量pfcountunsigned long volatile pfcount;//将pfcount加入到do_page_fault中,用以统计缺页次数pfcount++;3、修改内存管理代码//用vi编辑器打开头文件mm.h#vi include/linux/mm.h//在mm.h中加入全局变量pfcount的声明,代码加在extern int page_cluster;语句之后extern unsigned long volatile pfcount;4、导出pfcount全局变量,让整个内核(包括模块)都可以访问。

方法是:#vi kernel/kallsyms.c//在文件最后加入一行代码EXPORT_SYMBOL(pfcount);3. 配置编译新内核用编译Linux内核预备实验中的方法完成新内核的配置、编译、替换,重启后验证是否完成替换uname –r //如果为3.2.58(与你采用的新内核版本一至)说明替换完成4. 编写读取pfcount值的模块代码系统重启后,执行如下操作:#mkdir source //在当前用户目录下创建source文件夹,用于存放编写的用户程序#cd source //切换到source目录#vi pf.c //新建用于构建模块的代码--------------------------------------------/*pf.c*/ /*modules program*/#include #include #include #include #include #include #include struct proc_dir_entry *proc_pf; struct proc_dir_entry *proc_pfcount;extern unsigned long 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");5. 编译、构建内核模块#vi Makefile //在source目录下建立Makefile文件在Makefile中添加如下内容:obj-m := pf.oifneq ($(KERNELRELEASE),) obj-m:=pf.oelse KDIR:= /lib/modules/$(shell uname -r)/build PWD:= $(shell pwd)default: $(MAKE) -C $(KDIR) M=$(PWD) modulesclean: $(MAKE) -C $(KDIR) M=$(PWD) cleanendif6. 加载模块到内核中执行加载模块命令:#insmod pf.ko查看统计缺页次数:#cat /proc/pf/pfcount 撰写实验报告的要求1. 按照实验报告模板格式撰写;2. 整个实验过程的解图;3. 实验成功后,你的计算机上终端显示的内容;4. 实验过程中遇到的问题及解决方法等;5. 心得体会。

下载提示
相似文档
正为您匹配相似的精品文档