《操作系统》基本课程实验指导书-2014

发布时间 : 星期六 文章《操作系统》基本课程实验指导书-2014更新完毕开始阅读

5. 存储管理实验

5.1 实验4.1 观察实验

1、实验目的

利用Linux相关程序和命令,观察程序结构和进程执行情况。

2、实验内容

1. 在Linux下,使用gdb程序观察一个程序文件的内容和结构。启动该程序执行,再用GDB观察其内存映象的内容和结构。

2. 在Linux下,用free 和vmstat命令观察内存使用情况。

3. 在Linux下,查看/proc与内存管理相关的文件,并解释显示结果。

5.2 实验4.2 存储管理代码分析

1、实验目的

了解Linux内核中存储管理部分的代码结构和主要功能。

2、实验内容

阅读 Linux/Minix中以下模块的调用主线,并写出分析报告

? exec系统调用的内部实现模块调用主线 ? malloc函数的内部实现模块调用主线 ? 缺页中断处理程序

3、示例—缺页中断处理程序分析

当程序在运行中,访问到的无效的虚拟地址的时候,系统将激发出缺页中断。激发缺页中断的情况通常有四种:

1. C-O-W型中断,当某个进程进行写操作时,如果写的页是多进程在使用时,为了不影响其它进程的正常运行,通常需要将该页复制一份,供执行写操作的进程单独使用。

2. 被访问的物理页由于太长时间没有访问而被kswapd置换到swap file中。 3. 被访问的物理页由于是第一次访问,所以还在磁盘上或由于访问后被置换时

因为没有发生写操作,而未写到swap file中。

4. 当进程动态的访问一片存储区域时,如在程序中动态开辟的数组等,则该页

不在swap file中,也不在磁盘上。

缺页中断服务入口程序是函数do_page_fault。do_page_fault首先进行各种错误情况判断,并作相应处理。然后根据error_code 来判断缺页中断类型: (1) 第一种情况采用do_wp_page函数来处理

(2) 第二、三、四种情况由do_no_page函数来处理。

下面将分别介绍这些函数的流程图。

void do_wp_page(struct task_struct * tsk, struct vm_area_struct * vma, unsigned long address, int write_access)

为复制可写页申请一页空间异常根据address计算pgd ,pmd,pte退出=1使用该物理页的进程>1 ?>1将物理页复制到复制页上将该物理页置\将复制页链入虚存中释放原先分配的复制页将指向原先物理页的pte释放掉退出

图1 do_wp_page示意图

void do_no_page(struct task_struct * tsk, struct vm_area_struct * vma, unsigned long address, int write_access) {

根据address计算三级页表中pgd/pmd/pte的值,如无对应的项,分配空间将

其填上

if ( pte_present(entry) )

该页已在内存中,return;

//可能是共享该页的其他进程已将该页读入

else if (!pte_none(entry)) //情况2 pte中该项非空,说明该页被kswapd置换到swap file中,

调用 do_swap_page读入该页;

else if ( !vma->vm_ops || !vma->vm_ops->nopage) //情况4 该页对应的VMA块没有相应的nopage操作,说明该VMA块对应的是数据段内容

}

调用__get_free_page操作为该页分配内存,并将该页赋值为0,同时链入

该进程的页表中

else //情况3 调用虚拟块操作将磁盘中对应文件读入page中,

将pte表中对应的项指向该页。

将该页dirty位置位,如果该页有多进程使用,且非共享,置写保护位。

根据address计算三级页表中pgd/pmd/pte的值,如无对应的项,分配空间将其填上在空(2)该页在内存中?不在该页非空?不在(4)退出调用vma->vm->ops->swapin在(3)该页有无no_page操作调用__get_free_page重新分配内存,将该page赋值为0,同时链入tsk的页表中调用虚拟块操作将磁盘中对应的文件读入page中将page置”dirty”,如果该页有多进程使用,且非共享,置写保护位退出将page的entry链入tsk的页表图 2 do_no_page示意图( 2、3、4分别代表2、3、4种情况)

参考文献:《莱昂氏源代码分析》

5.3 实验4.3虚拟存储器管理

1、实验目的

学习Linux虚拟存储实现机制;编写代码,测试虚拟存储系统的缺页错误(缺页中断)发生频率。

2、实验内容

修改存储管理软件以便可以判断特定进程或者整个系统产生的缺页情况,达到一下目标 ? 预置缺页频率参数 ? 报告当前缺页频率

3、实验原理

由于每发生一次缺页都要进入缺页中断服务函数do_page_fault一次,所以可以认为执行函数的次数就是系统发生缺页的次数。因此可以定义一个全局的变量pfcount作为计数变量,在执行do_page_fault时,该变量加1。系统经历的时间可以利用原有系统的变量jiffies,这是一个系统计时器。在内核加载以后开始计时,以10ms为计时单位

实现施可采用2种方案

(1) 通过提供一个系统调用来访问内核变量pfcount和jiffies。但是增加系统变量存在居

多的不便,如重新编译内核等,而且容易出错以致系统崩溃。 (2) 通过/proc文件系统以模块的方式提供内核变量的访问接口。在/proc文件系统下建立

目录pf以及在该目录下的文件pfcount和jiffies。

4、试验步骤

(1)提供系统变量pfcount并编译内核

声明变量pfcount

文件linux/include/linux/mm.h

增加声明

extern unsigned long volatile pfcount;

定义变量

文件linux/arch/i386/mm/fault.c 定义变量

unsigned long volatile pfcount;

变量操作

文件linux/arch/i386/mm/fault.c

增加自增操作

在do_page_fault系统调用的全局范围内增加操作 pfcount++;

同时在/kernel/ksyms.c中export变量 增加

EXPORT_SYMBOL(pfcount); EXPORT_SYMBOL(jiffies);

之后编译内核

(2)提供一个读取模块文件pf.c,在proc中添加访问接口

至于如何添加和编译模块就不再仔细说明,在第四个试验中我们就通过考擦proc伪文件系统学习linux独特的模块机制。用命令

gcc –D__KERNEL__ -c pf.c –o pf.o –I/user/src/linux/include生成文件pf.o,院后执行

insmod pf.o加载模块。这样通过/proc文件系统接口我们就可以轻松的读取我们所需要的两个变量数据了。使用命令

cat /proc/pf/pfcount /proc/pf/jiffies就可以在终端中打印出系统至今为止的缺页次数和进

联系合同范文客服:xxxxx#qq.com(#替换为@)