ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

统计Linux系统缺页次数【转】

2022-06-10 14:05:02  阅读:213  来源: 互联网

标签:pfcount 次数 my 编译 file Linux 缺页 include proc


转自:https://blog.csdn.net/qq_39740279/article/details/103710112

Centos7实现缺页中断具体步骤
一些可能用到的命令
安装vim编译器

yum -y install vim*
1
Centos修改文件权限,将只读文件改为可写

chmod a+w -R /home/PycharmProjects/
1
实验题目

 

 


具体步骤
一.下载解压内核包
1)下载对应版本的rpm包

2)在Centos7中提取rpm包中的文件可以先提取到文档里,只需要里面的linux-3.10.0-1062.el7.tar.xz文件

3)找到.tar.xz结尾的文件,(这里以linux-3.10.0-1062.el7.tar.xz为例)

在终端打开解压

用xz命令来解压tar.xz格式文件,

[root@Think Arrix]# xz -d linux-3.10.0-1062.el7.tar.xz

[root@Think Arrix]# tar -xvf linux-3.10.0-1062.el7.tar -C/usr/src //将文件解压至/usr/src

解压之后为

4)然后将解压后的文件夹移至/usr/src/目录下

mv linux-3.10.0-1062.el7 /usr/src/

二.修改源码
1)切换到源码主目录
(下面的操作就在此目录中)

cd /usr/src/linux-3.10.0-1062.el7/

2)定义pfcount变量
这里需要修改arch/x86/mm/fault.c文件,由于文件内容较长,我们首先要确定添加大致位置;

cat -n arch/x86/mm/fault.c | grep __do_page_fault

 

 

这里可以看到我的 __do_page_fault 函数在文件的1142行中
跳转到所在行

 

 


打出:1142 后输入所在行回车

按 i 进入插入文本模式插入代码

unsigned long volatile pfcount;
1
插入后如下图

 

 


:wq 保存后退出

3)pfcount变量自增
由于建议将该语句添加在good_area:内,所以还是先定位good_area:的位置;

cat -n arch/x86/mm/fault.c | grep good_area:

 

 

我的是1304行,和前面一样,用vim打开,并跳转至所在行;

vim arch/x86/mm/fault.c
1
然后加上 pfcount++; 即可

 

 


:wq 保存退出

4)修改内存管理代码
接着,vim打开include/linux/mm.h头文件;

vim include/linux/mm.h
1
在mm.h中加入全局变量pfcount的声明

extern unsigned long volatile pfcount;
1
代码加在extern int page_cluster;语句之后;

 

 


:wq保存退出

5)导出pfcount全局变量
我们需要导出pfcount全局变量,以便于让系统所有模块访问;

需要在kernel/kallsyms.c文件的最后一行加入

EXPORT_SYMBOL(pfcount);
1
可以直接使用命令

echo 'EXPORT_SYMBOL(pfcount);'>>kernel/kallsyms.c
1
检查是否成功

cat kernel/kallsyms.c | grep pfcount

 

 


出现 EXPORT_SYMBOL(pfcount);表示成功


三、生成配置文件
首先安装ncurses-devel elfutils-libelf-devel openssl-devel这三个工具;

yum install ncurses-devel elfutils-libelf-devel openssl-devel -y
1
然后如果不是第一次编译,请先执行命令清理(包括后面编译出错,重新编译也要先执行下面的这条命令)

make mrproper
1
执行命令生成.config配置文件

make menuconfig
1
会进入如下界面

 

 

 

进入可视化界面,直左右移动Save即可,使用默认配置;

 

 

OK生成.config配置文件,然后Exit退出;

配置文件已经成功生成;

四、编译与安装
1)内核编译
在编译之前,需要安装bc工具(过程中需要);

执行命令

yum install bc -y
1
编译直接在主目录下使用make命令

make
1
编译时间较长,请耐心等待;(这个内核编译大概两个半小时,还不算编译模块的时间);

编译完成后,可以在arch/x86_64/boot/下查看到产生的内核文件bzImage(32位系统在arch/x86/boot下);

 

 

 

2)模块编译
执行命令编译模块

make modules
1
3)安装模块
由于自身编译源码,会有很多debug模块的存在,占用大量存储空间,我们需要在安装的时候排除它,添加参数INSTALL_MOD_STRIP=1;

执行命令

make INSTALL_MOD_STRIP=1 modules_install
1
4)安装内核
执行命令

make INSTALL_MOD_STRIP=1 install
1
安装成功后,可以查看/lib/modules目录下的文件(这里我们安装的内核并没有带次版本号,不影响使用,在后面使用make命令编译的时候就可以看到)

 

 


在虚拟机上执行reboot命令(重启命令),并在重启时候键盘上下建选择我们自己安装的内核,回车进入;

 

 


执行命令查看当前使用的内核版本

uname -r

 

 


五、使用pfcount
在home目录新建一个source目录,并cd进去;

mkdir source && cd source
1
1)编写readpfcount.c
在source文件中创建一个readpfcount.c文件

vi readpfcount.c
1
参考代码

(代码中学号可以改为自己的)

/*************************************************
使用seq_file接口实现可读写proc文件
参考:https://elixir.bootlin.com/linux/v5.0/source/include/linux/proc_fs.h
*************************************************/
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/uaccess.h>
#include <linux/proc_fs.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/seq_file.h>
#include <linux/slab.h>

extern unsigned long volatile pfcount;

/*5,实现show函数
作用是将内核数据输出到用户空间
将在proc file输出时被调用
*/
static int my_proc_show(struct seq_file *m, void *v)
{
/*这里不能使用printfk之类的函数
要使用seq_file输出的一组特殊函数
*/
seq_printf(m, "The pfcount is %ld !\n", pfcount);
return 0;
}

static int my_proc_open(struct inode *inode, struct file *file)
{
/*4,在open函数中调用single_open绑定seq_show函数指针*/
return single_open(file, my_proc_show, NULL);
}

/*2,填充proc_create函数中调用的flie_operations结构体
其中my开头的函数为自己实现的函数,
seq和single开头为内核实现好的函数,直接填充上就行
open为必须填充函数
*/
static struct file_operations my_fops = {
.owner = THIS_MODULE,
.open = my_proc_open,
.release = single_release,
.read = seq_read,
.llseek = seq_lseek,
};

static int __init my_init(void)
{
struct proc_dir_entry *file;
//创建父级目录,第二个参数NULL表示在/proc下
//这里用我的学号当做文件名
struct proc_dir_entry *parent = proc_mkdir("3170301084",NULL);

/*1,
首先要调用创建proc文件的函数,需要绑定flie_operations
参数1:要创建的文件
参数2:权限设置
参数3:父级目录,如果传NULL,则在/proc下
参数4:绑定flie_operations
*/
file = proc_create("readpfcount", 0644, parent, &my_fops);
if(!file)
return -ENOMEM;
return 0;
}

/*6,删除proc文件*/
static void __exit my_exit(void)
{
//移除目录及文件
remove_proc_entry("3170301084", NULL);
}

module_init(my_init);
module_exit(my_exit); //把文件删除掉


2)编写Makefile
vi Makefile
1
Makefile参考内容

ifneq ($(KERNELRELEASE),)
obj-m:=readpfcount.o
else
KDIR:= /lib/modules/$(shell uname -r)/build
PWD:= $(shell pwd)

default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
endif

目录内容

 

 


输入make编译,可以看到我们的确是使用的新安装的内核


3)安装模块
输入命令

insmod readpfcount.ko
1


4)查看pfcount的值
输入命令

cat /proc/${你的学号}/readpfcount

 

 


5) ok缺页次数已经显示出来了
————————————————
版权声明:本文为CSDN博主「南方-D」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39740279/article/details/103710112

标签:pfcount,次数,my,编译,file,Linux,缺页,include,proc
来源: https://www.cnblogs.com/sky-heaven/p/16362978.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有