操作系统虚拟机小论文
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for(unsigned int i=0;i<ENTRIES_PER_PAGE;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<ENTRIES_PER_PAGE;i++)
Frame_pool::frame_pool()初始化bitmap记录系统中所有物理块是否可用,如果可用设置为0,否则为1。
Frame_pool::get_frame()通过该方法去查询bitmap,查找可用物理块号。
FramePool::mark_inaccessible( )方法将bitmap中对应位置置1。
{ page_directory[i]=0|2;
}
void PageTable::enable_paging()
{
writE_cr3((unsigned long )(current_page_table->page_directory));
write_cr0(read_cr0()|0x80000000);
for(unsigned int i=0;i<ENTRIES_PER_PAGE;i++)
{
page_table[i]=0x00;
}
} else{
page_table=(unsigned long*)(page_table_addr &0xFFFF000);
}
unsigned long free_frame_no=process_mem_pool->frame();
page_table[page_tab_entry]=(free_frame_no*PAGE_SIZE)|7;
}
代码如下:
#include "page_table.H"
#include "exceptions.H"
#include "frame_pool.H"
#include "paging_low.H"
FramePool::release_frame()方法将bitmap中对应位置置0。
设计一个私有函数set_frame_flag ,来设置某一个字节的某个bit为0或则为1。
6)打开page_table.H
页表如下图所示:
其中,页面大小为4K,即可用12位表示页内地址,各个位含义如上图页表所示,其余20位表示页号,即1M。
const unsigned long _shared_size)
{
kernel_mem_pool =_kernel_mem_pool;
process_mem_pool =_process_mem_pool;
shared_size =_shared_size;
}
PageTable::PageTable(){
FranePool* PageTable::kernel_mem_pool = NULL;
FramePool* PageTable::process_mem_pool = NULL;
unsigned long PageTable::shared_size;
PageTable* PageTable::curent_page_table;
…
审查意见
指导教师签字:
教研室主任签字:年月日
说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页
一、设计目的
为了掌握Linux环境下常用编译工具如gcc/g++/nasm及开源虚拟机bochs的下载、安装、使用,掌握x86架构下分页式存储管理系统的基本原理,设计一个请求分页式虚拟存储系统。掌握Linux系统下程序的编写及运行等方面展开实验。
}
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_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 PageTable::shares_size;
PageTable*PageTable::current_page_table;
void PageTable::init_paging(FramePool* _kernel_mem_pool,
FramePool* _process_mem_pool,
void PageTable::init_paging(FarmePool* _kernel_mem_pool,
FramePool* _process_mem_pool,
const unsigned long _shared_size)
{
kernel_mem_pool = _kernel_mem_pool;
7)创建一个文件:page_table.C
PageTable::init_paging()给私有变量传递参数。PageTable::PageTable()构造函数。
当bochs启动时,start.asm首先被读入到软盘镜像文件中,并将kernel.C放入到内存1MB-2MB空间内,然后启动CPU运行,操作系统开始启动。
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,
2掌握x86架构下分页式存储管理系统的基本原理,设计一个请求分页式虚拟存储系统。
3掌握Linux系统下程序的编写及运行。
学生应完成的工作
1.按照实验三要求,构建Bochs虚拟实验室
2.回顾虚拟页式存储系统:作业分页,内存分块,只有当进程要使用其虚拟内存时,其对应的数据才装入物理内存。
3.请认真阅读readme.txt文件,弄清楚各个文件的作用
unsigned int page_dir_entry+page_fault_addr >>22;
unsigned long page_table_addr =current_page->directory[page_dir_entry];
if ((page_fault_addr & 0x01)==0)
二、设计要求
2.1要求熟练掌握sudo apt-get install的用法。
2.2要求能够掌握分页存储管理系统的基本原理。
2.3要求学会在Linux系统下编写程序、执行程序。
三、设计内容
3.1运行环境
3.1.1虚拟机系统下
3.1.2使用Ubunห้องสมุดไป่ตู้u下提供的apt-get软件包安装工具 安装vim、 g++ 、nasm 、bochs等
#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;
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;
phys_adress += PAGE_SIZE;
}
page_directory[0] = (unsigned long) page_table | 3;
for(unsigned int i = 1;i < ENTRIES_PER_PAGE;i++)
{
page_directory[i] = 0 | 2;
3.22.详细设计
1)回顾虚拟页式存储系统:作业分页,内存分块,只有当进程要使请认真阅读readme.txt文件,弄清楚各个文件的作用
2)用其虚拟内存时,其对应的数据才装入物理内存。
3)完成frame_pool.H 、frame_pool.C 、page_table.C三个文件,其中page_table.H已经提供,我们需要添加page_table.C,自己设计并实现这些函数。
{
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_directory[page_dir_entry]=(unsigned long) new_page_table_addr|3;
unsigned long * page_table = (unsigned long *)(kernel_mem_pool->get_frame() * PAGE_SIZE);
for(unsigned int i = 0; i<ENTRIES_PER_PAGE;i++)
{
page_table[i] = phys_adress | 3;
unsigned long _info_frame_no);
5)建立Frame_pool.C文件
系统中使用位示图bitmap标识页面是否使用,start_frame表示第一个页面的起始地址(如系统内存池从2M开始),pool_size表示在用户池中页框的总数(如系统内存池的页框从2M~4M,因此共有(4M-2M)/4KB=512个页框)。初始化用户池中位示图的内容
课程设计
课程设计名称:计算机操作系统
专业班级:计算机科学与技术
学生姓名:
学号:
指导教师:
课程设计时间:
操作系统专业课程设计任务书
课程设计题目
学院
专业
计算机科学与技术
年级
指导教师
成绩
所需环境
Linux环境
Bochs虚拟实验室
设计要求
1掌握Linux环境下常用编译工具如gcc/g++/nasm及开源虚拟机bochs的下载、安装、使用
}
}
void PageTable::enable_paging()
{
write_cr3 ((unsigned long ) (current_page_table_>page_directory));
write_cr0(read_cr0() | 0x80000000);
}
void PageTable::handle_fault(REGS * _r)
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 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);
page_table[i]=phys_address|3
phys_address+=PAGE_SIZE;
}
page_directory[0]=(unsigned long) page_table |3;
for(unsigned int i=1;i<ENTRIES_PER_PAGE;i++)
Frame_pool::frame_pool()初始化bitmap记录系统中所有物理块是否可用,如果可用设置为0,否则为1。
Frame_pool::get_frame()通过该方法去查询bitmap,查找可用物理块号。
FramePool::mark_inaccessible( )方法将bitmap中对应位置置1。
{ page_directory[i]=0|2;
}
void PageTable::enable_paging()
{
writE_cr3((unsigned long )(current_page_table->page_directory));
write_cr0(read_cr0()|0x80000000);
for(unsigned int i=0;i<ENTRIES_PER_PAGE;i++)
{
page_table[i]=0x00;
}
} else{
page_table=(unsigned long*)(page_table_addr &0xFFFF000);
}
unsigned long free_frame_no=process_mem_pool->frame();
page_table[page_tab_entry]=(free_frame_no*PAGE_SIZE)|7;
}
代码如下:
#include "page_table.H"
#include "exceptions.H"
#include "frame_pool.H"
#include "paging_low.H"
FramePool::release_frame()方法将bitmap中对应位置置0。
设计一个私有函数set_frame_flag ,来设置某一个字节的某个bit为0或则为1。
6)打开page_table.H
页表如下图所示:
其中,页面大小为4K,即可用12位表示页内地址,各个位含义如上图页表所示,其余20位表示页号,即1M。
const unsigned long _shared_size)
{
kernel_mem_pool =_kernel_mem_pool;
process_mem_pool =_process_mem_pool;
shared_size =_shared_size;
}
PageTable::PageTable(){
FranePool* PageTable::kernel_mem_pool = NULL;
FramePool* PageTable::process_mem_pool = NULL;
unsigned long PageTable::shared_size;
PageTable* PageTable::curent_page_table;
…
审查意见
指导教师签字:
教研室主任签字:年月日
说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页
一、设计目的
为了掌握Linux环境下常用编译工具如gcc/g++/nasm及开源虚拟机bochs的下载、安装、使用,掌握x86架构下分页式存储管理系统的基本原理,设计一个请求分页式虚拟存储系统。掌握Linux系统下程序的编写及运行等方面展开实验。
}
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_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 PageTable::shares_size;
PageTable*PageTable::current_page_table;
void PageTable::init_paging(FramePool* _kernel_mem_pool,
FramePool* _process_mem_pool,
void PageTable::init_paging(FarmePool* _kernel_mem_pool,
FramePool* _process_mem_pool,
const unsigned long _shared_size)
{
kernel_mem_pool = _kernel_mem_pool;
7)创建一个文件:page_table.C
PageTable::init_paging()给私有变量传递参数。PageTable::PageTable()构造函数。
当bochs启动时,start.asm首先被读入到软盘镜像文件中,并将kernel.C放入到内存1MB-2MB空间内,然后启动CPU运行,操作系统开始启动。
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,
2掌握x86架构下分页式存储管理系统的基本原理,设计一个请求分页式虚拟存储系统。
3掌握Linux系统下程序的编写及运行。
学生应完成的工作
1.按照实验三要求,构建Bochs虚拟实验室
2.回顾虚拟页式存储系统:作业分页,内存分块,只有当进程要使用其虚拟内存时,其对应的数据才装入物理内存。
3.请认真阅读readme.txt文件,弄清楚各个文件的作用
unsigned int page_dir_entry+page_fault_addr >>22;
unsigned long page_table_addr =current_page->directory[page_dir_entry];
if ((page_fault_addr & 0x01)==0)
二、设计要求
2.1要求熟练掌握sudo apt-get install的用法。
2.2要求能够掌握分页存储管理系统的基本原理。
2.3要求学会在Linux系统下编写程序、执行程序。
三、设计内容
3.1运行环境
3.1.1虚拟机系统下
3.1.2使用Ubunห้องสมุดไป่ตู้u下提供的apt-get软件包安装工具 安装vim、 g++ 、nasm 、bochs等
#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;
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;
phys_adress += PAGE_SIZE;
}
page_directory[0] = (unsigned long) page_table | 3;
for(unsigned int i = 1;i < ENTRIES_PER_PAGE;i++)
{
page_directory[i] = 0 | 2;
3.22.详细设计
1)回顾虚拟页式存储系统:作业分页,内存分块,只有当进程要使请认真阅读readme.txt文件,弄清楚各个文件的作用
2)用其虚拟内存时,其对应的数据才装入物理内存。
3)完成frame_pool.H 、frame_pool.C 、page_table.C三个文件,其中page_table.H已经提供,我们需要添加page_table.C,自己设计并实现这些函数。
{
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_directory[page_dir_entry]=(unsigned long) new_page_table_addr|3;
unsigned long * page_table = (unsigned long *)(kernel_mem_pool->get_frame() * PAGE_SIZE);
for(unsigned int i = 0; i<ENTRIES_PER_PAGE;i++)
{
page_table[i] = phys_adress | 3;
unsigned long _info_frame_no);
5)建立Frame_pool.C文件
系统中使用位示图bitmap标识页面是否使用,start_frame表示第一个页面的起始地址(如系统内存池从2M开始),pool_size表示在用户池中页框的总数(如系统内存池的页框从2M~4M,因此共有(4M-2M)/4KB=512个页框)。初始化用户池中位示图的内容
课程设计
课程设计名称:计算机操作系统
专业班级:计算机科学与技术
学生姓名:
学号:
指导教师:
课程设计时间:
操作系统专业课程设计任务书
课程设计题目
学院
专业
计算机科学与技术
年级
指导教师
成绩
所需环境
Linux环境
Bochs虚拟实验室
设计要求
1掌握Linux环境下常用编译工具如gcc/g++/nasm及开源虚拟机bochs的下载、安装、使用
}
}
void PageTable::enable_paging()
{
write_cr3 ((unsigned long ) (current_page_table_>page_directory));
write_cr0(read_cr0() | 0x80000000);
}
void PageTable::handle_fault(REGS * _r)
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 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);