




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
北航计算机学院 Linux操作系统实验二虚拟存储管理 32060624 Linux实验小组Linux操作系统实验二: 虚拟存储实验文档 32060624 linux实验小组2005年5月15日星期五 32060624 王 克(组长) 32060518 杜可斌 32060532 徐 瑞 32060621 张 劲 目录一,实验目的2二,实验实现过程21.内核函数pedagogictime的实现21.1实验理论准备21.2具体实现及其源码21.3实验改进和实验心得72. pedagogictime测试函数的实现72.1实验理论准备72.3测试用例及测试结果82.4实验改进和实验心得83. 缺页用户函数pgfault的实现83.1实验理论准备83.2具体实现及其源码(附详细注释)93.3实验测试143.4实验心得15三实验的总结15四实验小组成员感受15l32060624 王克15l32060518 杜可斌15l32060532 徐瑞16l32060621 张劲16五参考资料16一, 实验目的学习Linux如何实现虚拟存储。与体系结构无关的通用存储模型是所有Linux虚拟存储实现的基础,但是任何特定的实现都依赖于特定的硬件平台。本实验集中于i386的实现。我们进行该次试验主要为了达到以下目的: 学习存储管理程序的设计及其代码编写细节 修改虚拟存储代码以检测系统缺页错误的发生频率 学习Linux系统调用的相关知识,包括学习如何产生一个系统调用以及怎样通过往内核中增加一个新函数从而在内核空间中实现对用户空间的读/写。二, 实验实现过程1. 内核函数pedagogictime的实现1.1实验理论准备1) 参考kernel/time.c 的sys_gettimeofday 2) 学习编制自己的系统调用的方法3) 学习_syscallN()的定义及其使用1.2具体实现及其源码1) 编写内核函数pedagogictimea) 编辑sys.c文件#cd /usr/src/linux-2.11.2/kernel# vi sys.c b) 在文件最后添加内核函数pedagogictime: asmlinkage int sys_pedagogictime(struct timeval *tv) If (tv) Struct timeval ktv; Do_gettimeofday(&ktv); If(copy_to_user(tv,&ktv,sizeof(ktv) Return EFAULT; Return 0; 附例图:2)修改与系统调用号相关的文件#cd /usr/src/linux-2.6.11.2/arch/i386/kernel #vi entry.s在最后的两行增加了: .long sys_pedagogictime .long sys_mycall 由于我们使用的2.6.11.2最新的linux内核,所以它的入口表的形式与书上的有所不同。 附图:修改相应的头文件:#cd/usr/include/asm-i386#vi unistd.h在最后一行增加:#define _ _NR_mycall 290 #define _ _NR_ _pedagogictime附图:3)编译Linux新内核 #cd /usr/src/linux-2.6.11.2 #make mrproper /删除源代码中残留的.o文件和其他从属文件 # cd /usr/src/linux-2.6.11.2 # make menuconfig/配置内核,我们选择了高级电源管理 ICPI /还将CPU选择了P4 赛扬 # cd /usr/src/linux-2.6.11.2 # make dep/建立编译时所需的从属文件 #make bzImage/编译内核,生成压缩内核映像 #make modules #make modules_install /编译可加载模块编译附图: 4)启动新内核 # cp /usr/src/linux-2.6.11.2/arch/i386/boot/bzImage /boot/bzImage-2.6.11#cp /usr/src/linux-2.6.11.2/System.map /boot/System.map-2.6.11 #ln sf /boot/System.map-2.6.11 /boot/System.map5)配置启动文件: 我的linux虚拟机使用的grub引导,所以我们编辑了/boot/grub.conf文件,在该文件的最后一行加入了Title Red Hat Linux (2.6.11) Root (hd0,4) Kernel /bzImage-2.6.11 root=/dev/hda10 好了,我们可以看到我的虚拟机的启动画面: 1.3实验改进和实验心得1.3.1 实验改进: 由于我们使用的是最新的Linux内核 kernel 2.6.11.2,所以在很多方面与书上的配置都不同。例如,它的入口表就不相同。.long sys_pedagogictime .long sys_mycall但是,我们通过查看一些资料和通过一些实验,我们顺利完成了实验,编译出了新内核。1.3.2实验体会: 1.我们首先制定了合理的分工计划,每人查找一部分参考资料,并互相交流体会。 2.通过该实验,我们对系统函数的编写有了不少认识,知道了如何编译内核,如何修改相关文件,并启动新系统。 3.对于一些系统调用在linux中的实现方式,我们也有了一些了解。2. pedagogictime测试函数的实现2.1实验理论准备 我们学习了系统调用的使用方法,编写了一个用户程序来调用系统程序,2.2具体实现及其源码#include /*#include #include #include _syscall1(long,pedagogictime,struct timeval*,tv)int main()struct timeval t;int ret;ret = pedagogictime(&t);printf(%s,ctime(&(t.tv_sec);return 0;2.3测试用例及测试结果输入:cc test.c o test./test预计输出:512145465()实际输出:2.4实验改进和实验心得通过这实验,我们学习了如何调用我们自己编写的系统调用。3. 缺页用户函数pgfault的实现3.1实验理论准备1)分析stat文件 我们可以看出在intr之后的第16项,就是缺页中断。一旦,进程存取一些不再无力内存中的虚拟内存页,这时处理器就会通知linux发生缺页中断。2)分析缺页处理程序do_page_fault 该处理程序负责检测虚拟地址空间引用是否在虚拟地址空间中,如果是,就通过交换获得所缺的页面。3)分析setitimer函数的使用 我们知道了系统为每一个进程提供3个interval timer ,每一个在不同的时间域中,当任一个时间消耗完了,系统就产生一个信号,而ITIMER_REAL 指的是实时计时。3.2具体实现及其源码(附详细注释)#include #include #include #include #include #include #include #include #include #include #define PROCFILE /proc/stat /*定义程序位置*/#define LINENUMBER 100 /*定义最大行数*/int fd; /*定义文件操作符*/int delay = 1; /*定义默认延迟为1秒*/int count = 1; /*定义默认次数为1次*/int realcount = 0; /*定义默认的实际次数为0次*/int oldpgfault,pgfault;/*函数usage*/*打印pgfault的使用方法*/void usage() printf(Usage: pgfault delay countn);/*pgfault 可以带0,1,2个参数*/ exit(1);/*函数getline*/*读取一行,放入buf中,在最后加上/0并返回一行的数目*/int getline(char *buf,int buflen) int i = 0; int ret; char c; while (ret = read(fd,&c,1) 0 & c != n) bufi = c; i+; if (c = n) bufi = 0; return i;/*函数readfile()*/*读取/proc/stat 中的的缺页中断次数,并打印它*/int readfile() int len,ret; int i = 0; char bufLINENUMBER; char *p,*offset; if (ret = lseek(fd,0,SEEK_SET) 0) for (offset = buf; *offset != & *offset != t; offset+); /*读取第一个单词*/ *offset = 0; /*在单词后加一个0*/ if (!strcmp(buf,intr) /*比较是否为intr*/ /*buf为intr则返回0*/ *offset = ; while (*offset = )offset+;/*跳过无效的空格*/ for (i = 0; i 16; i+) p = offset;while (*offset != ) offset+;/*跳过第i个数*/while (*offset = ) offset+;/*跳过其后的空格*/ /*此时的p指向的就是缺页中断的值*/ *(offset-1) = 0;/*在其后加入一个/0*/ ret = atoi(p);/*将字符串转为int*/ return ret;/*返回缺页中断次数值*/ return -1;/*信号处理函数sig_handler*/void sig_handler(int signum) double rate; if (signum = SIGALRM) if (pgfault = readfile() = count) /*如果打印的次数足够,则计算缺页率*/ rate = (double)(pgfault-oldpgfault)/(double)(delay*count);/*缺页率计算方法为最后一次缺页数减去第一次的缺页数,除以这段时间*/printf(%dt%d/t%dn,pgfault,oldpgfault,delay*count);/*打印最后一次缺页数,第一次的缺页数,测量时间*/printf(pagefault rate %en,rate);/*打印缺页率*/exit(0); /*主函数*/int main(int argc,char *argv) struct itimerval timer; /*定义时间间隔*/ struct timeval interval,value; int val; switch (argc) /*根据参数类型进行分析*/ case 1:/*无参数*/ break; case 2:/*一个参数*/ if (val = atoi(*(+argv) 0) delay = val;/*将第一个参数赋给delay*/ else usage(); break; case 3: if (val = atoi(*(+argv) 0) delay = val;/*将第一个参数赋给delay*/ else usage(); if (val = atoi(*(+argv) 0) count = val;/*将第二个参数赋给count*/ else usage(); break; default: usage(); if (fd = open(PROCFILE,O_RDONLY) 0) /*只读方式打开/proc/stat*/ printf(open file %s error,PROCFILE); exit(1); oldpgfault = readfile(); /*将第一次读到的缺页数赋给oldpgfault*/ signal(SIGALRM,sig_handler); /*定义sigalrm的信号处理函数*/ interval.tv_sec = delay; interval.tv_usec = 0; value.tv_sec = delay; value.tv_usec = 0; timer.it_interval = interval; timer.it_value = value; setitimer(ITIMER_REAL,&timer,NULL); /*系统为每一个进程提供3个interval timer ,每一个在不同的时间域中*/ /*当任一个时间消耗完了,系统就产生一个信号*/ while (1); /*一个死循环,不断执行,直到跳出*/ close(fd);/*关闭文件*/ return 0;注:我们详细地阅读了示例程序,对它进行了详细的注释,并修改了一些细微的地方 。一开始,我们对于signal函数,setitimer 函数的使用,还有对/proc/stat文件的格式等方面,都不清楚,因此我们通过man 命令查看了帮助,对这些地方有了一定的了解,从而使我们对示例程序有了更加深刻的认识。3.3实验测试 1)编译运行 输入:cc pgfault.c o pgfault ./ pgfault 5 6输出: 测试二:输入:pgfault 输出: 测试三:输入:pgfault 5输出:测试四:输入:pgfault 3 5输出:3.4实验心得 通过编写该linux下的系统缺页统计程序pgfault.c,我们深刻理解了内存管理的作用。系统的虚拟内存通过在各个进程之间共享内存而使系统运行的程序总量远远超出了实际内存的容量。虚拟内存提供了大地址空间,进程的保护,内存映射,共享内存等功能。我们学习了linux发生缺页中断时,内核的处理过程。三实验的总结 这次实验,我们基本上达到实验前提出的实验目的。我们学习存储管理程序的设计及其代码编写细节,修改虚拟存储代码以检测系统缺页错误的发生频率,学习Linux系统调用的相关知识,包括学习如何产生一个系统调用以及怎样通过往内核中增加一个新函数从而在内核空间中实现对用户空间的读/写。我们对于向内核加入新的系统调用,并重编内核的过程有了一定的了解。四实验小组成员感受l 32060624 王克通过本实验使我又掌握了许多新的东东,如编译配置Linux内核,添加使用Linux系统调用,对LINUX内核的结构有了更深入的认识。也让我对虚拟存储管理的有了更明白的理解,正所谓有付出才会有收获。也使我们实验小组的成员之间更加团结友爱。l 32060518 杜可斌 为了进行这个实验,我安装了一个虚拟机,我在这个虚拟机上安装了red hat linux,之后,我下载
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 买卖合同房屋买卖协议
- 小区绿化环保工程施工协议
- 2025短期用工合同范本
- 2025项目经理劳动合同劳动合同范本
- 现代管理学重要题型试题及答案
- 2025计算机设备采购合同范本 计算机设备采购合同(年度)
- 2025竹林经营合同
- 行政预算与控制分析试题及答案
- 2025建筑工程监理合同范本
- 公文处理中的文化适宜性分析试题及答案
- 思政课社会实践报告1500字6篇
- 常暗之厢(7规则-简体修正)
- GB∕T 25119-2021 轨道交通 机车车辆电子装置
- 电池PCBA规格书
- 机械零件加工验收检验记录(共2页)
- 机械加工切削全参数推荐表
- 终端塔基础预偏值(抬高值)计算表格
- 海外医疗服务委托合同协议书范本模板
- (完整版)研究者手册模板
- 菲林检验及管理办法
- 磁芯参数对照表
评论
0/150
提交评论