虚拟内存管理——操作系统课程大作业虚拟内存管理报告.pdf
《虚拟内存管理——操作系统课程大作业虚拟内存管理报告.pdf》由会员分享,可在线阅读,更多相关《虚拟内存管理——操作系统课程大作业虚拟内存管理报告.pdf(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、20112011 年操作系统大作业年操作系统大作业1.虚拟内存管理实验。在 Linux 环境下编写一个内核模块,分别实现如下几个函数:static void mtest_dump_vma_list(void):依次列出当前进程所占用的虚拟内存空间各段的读、写或执行权限。static void mtest_find_vma(unsigned long addr):查找出虚拟地址 addr 所在的 vma,并通过 printk 打印该段的起始地址、终止地址和段标志等信息。static void mtest_find_page(unsigned long addr):找到虚拟地址 addr 对应的物
2、理地址并打印。为了测试和使用以上函数, 需要在内核模块的初始化函数中创建一个名为mtest 的/proc文件。mtest 文件绑定的写函数 mtest_write 允许用户程序写入一串字符串:如果写入的字符串是 listvma 则调用函数 mtest_dump_vma_list(void);如果写入的字符串是 findvma0 xffffffff则调用函数 mtest_find_vma(0 xffffffff) ,字符串的后几个字符是传递给函数的参数;如果写入的字符串是 findpage0 xffffffff则调用函数 mtest_find_page(0 xffffffff),同样字符串的后几
3、个字符是参数。实验要求:为了测试以上模块的正确性,需要编写一个小型的test 应用程序,它打开/proc/mtest 文件,并向其中写入字符串调用模块中的相关函数并给出相应的反馈信息。知识储备:虚拟存储空间管理的相关数据结构vm_area_struct和 mm_struct/proc 文件系统的相关知识内核模块的相关知识实验思路及过程:实验思路及过程:相关知识储备:1.可以使用/proc 文件系统和 pmap 工具查看给定进程的内存空间和其中所包含的内存区域mmap 描述的该地址空间中的全部内存区域。内核使用内存描述符结构表示进程的地址空间,由结构体 mm_struct 结构体表示,定义在li
4、nux/sched.h 中,同时linux 操作系统采用虚拟内存技术,所有进程之间以虚拟方式共享内存。 进程地址空间由每个进程中的线性地址区组成, 而且更为重要的特点是内核允许进程使用该空间中的地址。通常情况况下,每个进程都有唯一的地址空间, 而且进程地址空间之间彼此互不相干。但是进程之间也可以选择共享地址空间,这样的进程就叫做线程。Linux 提供了内存映射函数 mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上),通过对这段内存的读取和修改, 实现对文件的读取和修改,2.unlikely()的作用就是告诉编译器,ab) 和 if(ab)在功能上等价, 同样 if(unlikely
5、(ab) 和 if(amm 赋给 mm. 然后申明一个 vm_area_struct变量 vma,遍历链表,依次对每一段内存进行读、写或执行的权限的判断即可。同时,信号量的操作要合理控制。具体代码:static void mtest_dump_vma_list(void) struct task_struct *pi=current;/建立 task_struct 型的指针 pi,并赋初值为当前进程 struct mm_struct *mm=pi-mm;/将当前进程的虚拟地址空间赋值给mm struct vm_area_struct *vma; printk(The current proce
6、ss name is :%sn,pi-comm); printk(mtest_dump_vma_listn); down_read(&mm-mmap_sem);/对信号量进行 P 操作 for(vma=mm-mmap;vma;vma=vma-vm_next)/给 vma 赋初值为指向线性区对象的链表头,并对 VMA 链表进行遍历 printk(VMA from %p to %p :,vma-vm_start,vma-vm_end);/ 输出每段的开始与结束地址用于表示每段if(vma-vm_flags&VM_WRITE)printk(WRITE);if(vma-vm_flags&VM_READ
7、)/将每段的权限 flags 与写 、 读 、 执行进行 and 操作,当其满足条件时,输出相应的单词printk(READ);if(vma-vm_flags&VM_EXEC)printk(EXEC);if(vma-vm_flags&VM_GROWSDOWN)printk(n 该段 GROWSDOWN!n);printk(n); up_read(&mm-mmap_sem);/对信号量进行 V 操作第二个函数:static void mtest_find_vma(unsigned long addr)Linux 内核虚拟空间既有分段机制也有分页机制,分段可以根据可读,可写,可执行等权限区分。段与
8、段之间并不一定连续, 因此寻找一个虚拟地址的段可能会寻空, 否则该地址一定介于这个段的起始地址和结束地址之间。 因而在实现此函数的功能时要做相关判断。 本函数的关键是 vma=find_vma(mm,addr);函数,它可以在 mm 中找到,第一个尾地址大于 addr 的段。找到后再将其与该段的起始地址相比较,如果大于起始地址即可确定addr 的确落在该段内。具体代码:static void mtest_find_vma(unsigned long addr)struct task_struct *pi;/建立 task_struct 型的指针 pi,并赋初值为当前进程pi=find_task
9、_by_pid(1);struct mm_struct *mm=pi-mm;/将当前进程的虚拟地址空间赋值给mmstruct vm_area_struct *vma;printk(mtest_find_vman);down_read(&mm-mmap_sem);/对信号量进行 P 操作vma=find_vma(mm,addr);/通过 find_vma 函数在 mm 中找到,第一个尾地址大于addr的段if(vma&addr=vma-vm_start)/若该段的首地址小于 addr,这该段为所找的段printk(vma has been found!n);printk(the vma is:%
10、pn,vma-vm_flags);printk(Start address of vma:%pn,vma-vm_start);printk(Final address of vma:%pn,vma-vm_end);else/若不是,不存在符合条件的段printk(there is no VMA found for %pn, addr);up_read(&mm-mmap_sem);/对信号量进行 V 操作第三个函数:static void mtest_find_page(unsigned long addr)这个函数意在寻找该虚拟地址对应的物理地址,linux 采用四级页表:页全局目录、页上级目
11、录、页中间目录、页表目录。图示如下:所以在函数实现时要根据所给的虚拟地址一级一级的寻找, 知道找到最后一级页表。 同时要注意每找一级目录都要判断该目录是否已经映射,否则该虚拟地址所指向的物理地址不存在。找到页表之后, 还要判断其是否已映射到内存,否则也不满足条件。之后就可以在页表目录中找到页表项对应的物理叶框号,再加上地址偏移量。即找到满足要求的物理地址。具体代码:static void mtest_find_page(unsigned long addr)struct task_struct *pi;/建立 task_struct 型的指针 pi,pi=find_task_by_pid(1)
12、;/将进程号为 1 的进程结构赋值给 pistruct mm_struct *mm=pi-mm;/将当前进程的虚拟地址空间赋值给mmunsigned long physical_address;/用physical_address表示所找的物理地址physical addressstruct page *page=NULL;/给页框赋初值 NULLpgd_t *pgd;/页全局目录项pud_t *pud;/页上级目录项pmd_t *pmd;/页中间目录项pte_t *pte;/页表项printk(mtest_find_pagen);down_read(&mm-mmap_sem);/对信号量进行
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 虚拟内存 管理 操作系统 课程 作业 报告
限制150内