西南交通大学【操作系统实验7】

2024-06-11 21:28

本文主要是介绍西南交通大学【操作系统实验7】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实验目的

  1. (1)理解内存管理中缺页的概念。
  2. (2)综合运用实验1,实验5,实验6中/proc文件系统、内存管理、系统调用、  内核编译的知识。
  3. (3)掌握向/proc文件系统中增加文件的方法。
  4. (4)掌握Linux内核模块的概念和操作方法。

实验内容

通过在内核中自建变量并利用/proc文件系统作为中介的方法来统计系统缺页次数:

  1. (1)在内核中实现缺页次数统计。
  2. (2)编译并安装新内核。
  3. (3)新建内核模块,并加载到新内核,通过/proc实现用户态下查看缺页次数。

实验环境

系统版本:Ubuntu 14.04 LTS

内核版本: Linux 3.2.0.29-generic

欲编译内核:Linux-2.6.32.60

实验步骤

第一部分:在内核中实现缺页次数统计

ubuntu@oslinux-virtual-machine:~$

cd /usr/src/linux-2.6.32.60

//切换到预编译内核目录

ubuntu@oslinux-virtual-machine:~$ /usr/src/linux-2.6.32.60$

sudo gedit arch/x86/mm/fault.c

//在do_page_fault函数上一行定义统计缺页次数全局变量pfcount

unsigned long volatile pfcount;

//将pfcount加入到do_page_fault中,用以统计缺页次数.

pfcount++;

ubuntu@oslinux-virtual-machine:~$ /usr/src/linux-2.6.32.60$

sudo gedit include/linux/mm.h

//声明全局变量pfcount到头文件mm.h中,在extern int page_cluster下面

添加代码:

extern unsigned long volatile pfcount;

ubuntu@oslinux-virtual-machine:~$ /usr/src/linux-2.6.32.60$

sudo gedit kernel/kallsyms.c

//导出pfcount全局变量,让整个内核都可以访问

//最后一行添加代码如下:

EXPORT_SYMBOL(pfcount);

第二部分:编译安装新内核

ubuntu@oslinux-virtual-machine:~$ /usr/src/linux-2.6.32.60$

sudo make mrproper

//删除原来编译产生的垃圾

ubuntu@oslinux-virtual-machine:~$ /usr/src/linux-2.6.32.60$

sudo cp /boot/config-3.2.0-29-generic-pae .config

//导入原系统的内核配置ubuntu@oslinux-virtual-machine:~$ /usr/src/linux-2.6.32.60$

sudo make oldconfig

//更改配置,一直回车

//导入配置到欲编译内核中 )

ubuntu@oslinux-virtual-machine:~$ /usr/src/linux-2.6.32.60$

sudo make cleanubuntu@oslinux-virtual-machine:~$ /usr/src/linux-2.6.32.60$

sudo make bzImage

//编译内核

ubuntu@oslinux-virtual-machine:~$ /usr/src/linux-2.6.32.60$

sudo make modules

//编译模块

ubuntu@oslinux-virtual-machine:~$ /usr/src/linux-2.6.32.60$

sudo make modules_install

//添加模块到内核

ubuntu@oslinux-virtual-machine:~$ /usr/src/linux-2.6.32.60$

sudo make install

//链接、组建内核

ubuntu@oslinux-virtual-machine:~$ /usr/src/linux-2.6.32.60$

sudo reboot

//重新启动Linux系统重新启动Linux系统,开机时长按shift键直到进入启动加载界面,选择新编译的内核版本,按回车进入系统。进入系统后,使用命令uname –a 验证内核版本

是否安装成功

第三部分:新建内核模块,通过/proc实现用户态下查看缺页次数

ubuntu@oslinux-virtual-machine:~$ mkdir source

//系统重启后,创建source文件夹,用于存放编写的模块程序

ubuntu@oslinux-virtual-machine:~$ cd source/

//切换到source目录

ubuntu@oslinux-virtual-machine:~/source$ gedit pf.c

//新建用于构建模块的代码

ubuntu@oslinux-virtual-machine:~/source$

gedit Makefile

//构建Makefile,在Makefile中添加如下内容:

obj-m := pf.o

ubuntu@oslinux-virtual-machine:~/source$

sudo make -C /usr/src/linux-2.6.32.60 SUBDIRS=$PWD modules

//编译、构建内核模块

ubuntu@oslinux-virtual-machine:~/source$

sudo insmod pf.ko

//加载内核模块到内核中ubuntu@oslinux-virtual-machine:~/source$ sudo lsmod | grep pf

//验证pf内核模块是否加载到内核进程中,运行命令出现pf信息说明加载成功

ubuntu@oslinux-virtual-machine:~/source$ cat /proc/pf/pfcount

//打印/proc/pf/pfcount,查看缺页统计次数

实验结果

验证内核版本是否安装成功

验证pf内核模块是否加载到内核进程中,运行命令出现pf信息说明加载成功

打印/proc/pf/pfcount,查看缺页统计次数

核心代码

/*pf.c*//*内核模块代码*/#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(constchar* 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, intlength, 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");

这篇关于西南交通大学【操作系统实验7】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052321

相关文章

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

1、简述linux操作系统启动流程

1、简述linux操作系统启动流程 启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。开机时将ROM中的指令映射到RAM的低地址空间,CPU读取到这些指令,硬件的健康状况进行检查,按照BIOS中设置的启

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信