网址 http://bbs.cfan.com.cn/viewthread.php?tid=386246
内存分页管理的实验报告
内存分页管理的实验报告
作者:huang_2008
报告时间:2006-8-22
实验时间:3 天
实验代码:
HelloOS 所有代码 [url]http://flash.xxsyzx.com/learnos/[/url]
内存分页管理设想:
以 HelloOS(实验系统名称)为基础进行内存分页管理实验,386PC 在保护模式下寻址最大是
4GB,而内存分页一共页可以映射 4GB 的内存地址,这些映射的地址叫做线性地址,而实
际内存上的地址叫做物理地址。管理办法是每个进程都拥有一个页目录,可以映射 4GB 的
内存地址的内容。但是通常进程不会用到这么大的内容,所以可以开始先分配几页内存给程
序运行(一页内存=4KB),当进程需要时候,才给它申请内存空间。如果内存不足,可以
通过页交换技术,把少用到的内存交换到磁盘上,就得到内存空间,并通过页目录和页表进
行映射。这样即使在内存只有 64MB 的 PC 上,进程也可以在 4GB 的空间里进行工作。
每个进程都是独立的内存空间,互不影响,例如进程 A 往内存 0xF0000000 处写入了字
符’a’,进程 B 往内存 0xF0000000 处入了字符’z’,则在进程 A 中看到内存 0xF0000000 的字
符是’a’,而不会是’b’。这就需要给每个进程都创建一个页目录。在进程切换的时候,页目录
也随着变换。
HelloOS 的内存管理:
下面是 4GB 的内存线性空间
0-1GB 1GB-2GB 2GB-3GB 3GB-4GB
用户空间 用户空间 用户空间 内核空间
每个进程把 4GB 的空间或分为用户空间 0-3GB 和内核空间 3GB-4GB。其中每个进程的内核
空间都是共享的,而用户空间独立,存放进程的代码、数据和堆栈。
实现代码:
/*
* memory.c 内存分页管理
* 060818-060821
* Email: [email]huang_2008@msn.com[/email]
* QQ: 357339036
* Huang Guan
*
* 首先将物理内存从 8MB 开始分成以页为单位存放
* 并用数组表示每个页面的状态,是否被使用
* 而前 8MB 为内核, 并被所有进程映射
* get_free_page()是获取一个空闲的物理页,页大小固定为 4KB
* free_page()是释放一个物理页
*