統計Linux系統缺頁次數【轉】

轉自: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章