操作系统课程设计-虚拟页式存储管理系统的实现.doc_第1页
操作系统课程设计-虚拟页式存储管理系统的实现.doc_第2页
操作系统课程设计-虚拟页式存储管理系统的实现.doc_第3页
操作系统课程设计-虚拟页式存储管理系统的实现.doc_第4页
操作系统课程设计-虚拟页式存储管理系统的实现.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课 程 设 计课程设计名称: 计算机操作系统 专 业 班 级 :计算机科学与技术 学 生 姓 名 : 学 号 : 指 导 教 师 : 课程设计时间: 操作系统 专业课程设计任务书课程设计题目虚拟页式存储管理系统的实现学院专业计算机科学与技术年级指导教师成 绩所需环境Linux环境Bochs虚拟实验室设计要求1掌握Linux环境下常用编译工具如gcc/g+/nasm及开源虚拟机bochs的下载、安装、使用2掌握x86架构下分页式存储管理系统的基本原理,设计一个请求分页式虚拟存储系统。3掌握Linux系统下程序的编写及运行。学生应完成的工作1. 按照实验三要求,构建Bochs虚拟实验室2.回顾虚拟页式存储系统:作业分页,内存分块,只有当进程要使用其虚拟内存时,其对应的数据才装入物理内存。3.请认真阅读readme.txt文件,弄清楚各个文件的作用审查意见指导教师签字:教研室主任签字: 年 月 日 说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页目录一、设计目的为了掌握Linux环境下常用编译工具如gcc/g+/nasm及开源虚拟机bochs的下载、安装、使用,掌握x86架构下分页式存储管理系统的基本原理,设计一个请求分页式虚拟存储系统。掌握Linux系统下程序的编写及运行等方面展开实验。二、设计要求 2.1要求熟练掌握sudo apt-get install的用法。 2.2要求能够掌握分页存储管理系统的基本原理。 2.3要求学会在Linux系统下编写程序、执行程序。 三、设计内容3.1运行环境3.1.1虚拟机系统下3.1.2使用Ubuntu下提供的apt-get软件包安装工具 安装vim、 g+ 、nasm 、bochs等3.2 2. 详细设计1)回顾虚拟页式存储系统:作业分页,内存分块,只有当进程要使请认真阅读readme.txt文件,弄清楚各个文件的作用2)用其虚拟内存时,其对应的数据才装入物理内存。3)完成frame_pool.H 、frame_pool.C 、page_table.C三个文件,其中page_table.H已经提供,我们需要添加page_table.C,自己设计并实现这些函数。4)在frame_pool.H定义所需要的数据结构,在frame_pool.C完成这些函数。添加代码如下所示:class FramePool private: unsigned long base_frame_no; unsigned long nframes;unsigned long info_frame_no; unsigned char* free_frames;public:static const unsigned char USED -1;static const unsigned char UNUSED -0; static const unsigned int FRAME_SIZE -4096; public:FramePool(unsigned long _base_frame_no,unsigned long _nframes,unsigned long _info_frame_no); 5)建立Frame_pool.C文件系统中使用位示图bitmap标识页面是否使用,start_frame表示第一个页面的起始地址(如系统内存池从2M开始),pool_size表示在用户池中页框的总数(如系统内存池的页框从2M4M,因此共有(4M-2M)/4KB=512个页框)。初始化用户池中位示图的内容Frame_pool:frame_pool()初始化bitmap记录系统中所有物理块是否可用,如果可用设置为0,否则为1。Frame_pool:get_frame()通过该方法去查询bitmap,查找可用物理块号。FramePool:mark_inaccessible( )方法将bitmap中对应位置置1。FramePool:release_frame()方法将bitmap中对应位置置0。设计一个私有函数set_frame_flag ,来设置某一个字节的某个bit为0或则为1。6)打开page_table.H页表如下图所示:其中,页面大小为4K,即可用12位表示页内地址,各个位含义如上图页表所示,其余20位表示页号,即1M。7)创建一个文件:page_table.CPageTable:init_paging()给私有变量传递参数。PageTable:PageTable()构造函数。当bochs启动时,start.asm首先被读入到软盘镜像文件中,并将kernel.C放入到内存1MB-2MB空间内,然后启动CPU运行,操作系统开始启动。#include page_table.H#include exceptions.H#include frame_pool.H#include paging_low.H FramePool* PageTable:kernel_mem_pool =NULL; FramePool* PageTable:process_mem_pool =NULL; unsigned long PageTable:shares_size; PageTable*PageTable:current_page_table; void PageTable:init_paging(FramePool* _kernel_mem_pool, FramePool* _process_mem_pool, const unsigned long _shared_size) kernel_mem_pool =_kernel_mem_pool; process_mem_pool =_process_mem_pool; shared_size =_shared_size; PageTable:PageTable() unsigned long phys_address =0; page_directory =(unsigned long*) (kernel_mem_pool-get_frame()* PAGE_SIZE); unsigned long* page_table=(unsigned long*)(kernel_mem_pool-get_frame() *PAGE_SIZE); for(unsigned int i=0;iENTRIES_PER_PAGE;i+) page_tablei=phys_address|3 phys_address+=PAGE_SIZE; page_directory0=(unsigned long) page_table |3; for(unsigned int i=1;iENTRIES_PER_PAGE;i+) page_directoryi=0|2; void PageTable:enable_paging() writE_cr3(unsigned long )(current_page_table-page_directory); write_cr0(read_cr0()|0x80000000); void PageTable:handle_fault(REGS *_r) unsigned int page_fault_addr=read_cr2() unsigned long* page_table; Console:putui(page_fault_addr); Console:puts(n); unsigned int page_dir_entry+page_fault_addr 22; unsigned long page_table_addr =current_page-directorypage_dir_entry;if (page_fault_addr 0x01)=0) unsigned long new_page_table_addr=kernel_mem_pool -get_frame() *PAGE_SIZE; page_table=(unsigned long*)(new_page_table_addr); current_page_table-page_directorypage_dir_entry=(unsigned long) new_page_table_addr|3; for(unsigned int i=0;iENTRIES_PER_PAGE;i+) page_tablei=0x00; else page_table=(unsigned long*)(page_table_addr 0xFFFF000); unsigned long free_frame_no=process_mem_pool-frame(); page_tablepage_tab_entry=(free_frame_no*PAGE_SIZE)|7; 代码如下:#include page_table.H#include exceptions.H#include frame_pool.H#include paging_low.HFranePool* PageTable:kernel_mem_pool = NULL;FramePool* PageTable:process_mem_pool = NULL;unsigned long PageTable:shared_size;PageTable* PageTable:curent_page_table;void PageTable:init_paging(FarmePool* _kernel_mem_pool, FramePool* _process_mem_pool, const unsigned long _shared_size) kernel_mem_pool = _kernel_mem_pool; process_mem_pool = _process_mem_pool; shared_size = _shared_size;PageTable:PageTable()unsigned long phys_address = 0;page_directory = (unsigned long *)(kernel_mem_pool-get_frame() * PAGE_SIZE);unsigned long * page_table = (unsigned long *)(kernel_mem_pool-get_frame() * PAGE_SIZE);for(unsigned int i = 0; iENTRIES_PER_PAGE;i+)page_tablei = phys_adress | 3;phys_adress += PAGE_SIZE;page_directory0 = (unsigned long) page_table | 3;for(unsigned int i = 1;i ENTRIES_PER_PAGE;i+) page_directoryi = 0 | 2;void PageTable:enable_paging() write_cr3 (unsigned long ) (current_page_table_page_directory); write_cr0(read_cr0() | 0x80000000);void PageTable:handle_fault(REGS * _r)( unsigned int page_fault_addr = read_cr2(); unsigned long* page_table; Console:putui(page_fault_addr); Console:puts(n); unsigned int page_dir-entry = page_fault_addr 22; unsigned int page_dir-entry = (page_fault_addr (0x03FF 12) 12; unsigned long page_table_addr = current_page_table-page_directorypage_dir_entry; if (page_fault_addr 0x01 = 0) unsigned long new_page_table_addr = kernel_men_pool - get_frame() * PAGE_SIZE; page_table = (unsigned long*) (new_page_table_addr); current_page_table-page_directorypage_dir_entry = (unsigned long new_page_table_addr | 3;for(unsiqned int i =0;iENTRIKS_PER_PAGE:i+)page_tablei=0x00;else/Page table has been present, but the entry in page table is not present/get page table address from page_table_addrpage_table=(unsigned long*) page_table_addr0xFFFFF000);/find a free framo from process memory pool and give it to page table entryunsigned long free_framo_no=process_mem_pool-get_framo();/attributo set to; user level,read/write, present(111 in binary)page_table(page_tab_entry)=(free_framo_no*PAGE_SIZE)1 7;#include frame_pool.H#define MB * (0x1 20)#define kB * (0x1 20)Framepool:Framepool(unsigned long _base_frame_no,unsigned long _nframe,unsigned long _info_frame_no)base_frame_no =_base_frame_no;nframes =_nframes;info_frame_no =_info_frame_no;if (info_frame_no = 0)info_frame_no - (2MB)/FRAME_SIZE;free_frames =(unsigned char*)(info_frame_no * FRAME_SIZE);unsigned long total_bitmap_bytes = (nframes + 7) /8;for( unsigned long i = 0;itotal_bitmap_bytes; i+)free_frames i =0x00;set_frame_flag(info_frame_no,USED);/unsigned long Framepool:get_frame()unsigned long which_byte_free;unsigned char val;unsigned long total_bitmap_bytes = (nframes + 7) /8;for(which_byte_free = 0;which_byte_freetotal_bitmap_bytes;which_byte_free+)val = *(free_frame + which_byte_free);if(val !=0xFF)break;if(val = 0xFF)return 0;char bit = 0;while(1)if (va;(USEDBIT) =0)break;bit+;unsigned long abs_free_frame_add =base_frame_no + which_byte_free *8 + bit;set_frame_flag( abs_free_frame_add ,USED);return abs_free_frame_add;void Framepool:mark_inaccessible(unsigned long _base_frame_no, unsigned long _nframe,)for(unsigned long i = 0;i _nframes; i+)set_frame_flag(_base_frame_no + i,USED);void Framepool:release_frame( unsigned long _frame_no)set_frame_flag(_frame_no,UNUSED);inline void Framepool:set_frame_flag(unsigned long _frame_no, unsigned char ifused) _frame_on -= base_frame_on;int bit_counter = _frame_on%8;unsigned char mask = 0;if(ifused =USED)mask=(0x01 bit_counter); *(free_frames + _frame_no /8) |=mask;else mask=(0x01 bit_counter); *(free_frames + _frame_no /8) =mask;#include page_table.H#include exceptions.H#include frame_pool.H#include paging_low.HFranePool* PageTable:kernel_mem_pool = NULL;FramePool* PageTable:process_mem_pool = NULL;unsigned long PageTable:shared_size;PageTable* PageTable:curent_page_table;void PageTable:init_paging(FarmePool* _kernel_mem_pool, FramePool* _process_mem_pool, const unsigned long _shared_size) kernel_mem_pool = _kernel_mem_pool; process_mem_pool = _process_mem_pool; shared_size = _shared_size;PageTable:PageTable()unsigned long phys_address = 0;page_directory = (unsigned long *)(kernel_mem_pool-get_frame() * PAGE_SIZE);unsigned long * page_table = (unsigned long *)(kernel_mem_pool-get_frame() * PAGE_SIZE);for(unsigned int i = 0; iENTRIES_PER_PAGE;i+)page_tablei = phys_adress | 3;phys_adress += PAGE_SIZE;page_directory0 = (unsigned long) page_table | 3;for(unsigned int i = 1;i ENTRIES_PER_PAGE;i+) page_directoryi = 0 | 2;void PageTable:enable_paging() write_cr3 (unsigned long ) (current_page_table_page_directory); write_cr0(read_cr0() | 0x80000000);void PageTable:handle_fault(REGS * _r)unsigned int page_fault_addr = read_cr2();unsigned long* page_table;Console:putui(page_fault_addr);Console:puts(n);unsigned int page_dir_entry = page_fault_addr 22;unsigned int page_tab_entry = (page_fault_addr (0x03FF 12) 12;unsigned long page_table_addr = current_page_table-page_directorypage_dir_entry;if(page_fault_addr 0x01) = 0) unsig

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论