操作系统虚拟机小论文

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计

课程设计名称:计算机操作系统

专业班级:计算机科学与技术

学生姓名:

学号:

指导教师:

课程设计时间:

操作系统专业课程设计任务书

说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页

目录

一、设计目的

为了掌握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表示在用户池中页框的总数(如系统存池的页框从2M~4M,因此共有(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.C

PageTable::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;i

page_table[i]=phys_address|3

phys_address+=PAGE_SIZE;

}

page_directory[0]=(unsigned long) page_table |3;

for(unsigned int i=1;i

{ page_directory[i]=0|2;

}

void PageTable::enable_paging()

相关文档
最新文档