内存管理分为两个层面,一个是内核级的,一个是用户级的。
内核级的内存管理主要响应进程的内存申请与扩展、注销。每个进程应当准备满足4G的空间要求,当然不可能一开始就安排4G的,那应该准备多少呢?
1、代码。当准备加载一个进程前,需要知道该进程代码长度,这个代码长度包括已定义的数据,未定义的数据暂时不安排内存。
2、堆栈。堆栈是一个可扩展的内存段,所以安排内存时要注意以后的扩展问题。堆栈是向前扩展的,所以可以把堆栈的段往后安排。
3、进程表。进程表是相对固定的,但是如果每个进程使用自己的内存页表,那就要安排好内存页表的扩展问题。
线性内存与物理内存的对应关系。
每个进程对应着自己的内存,是段在起作用,如果进程突破自己的段限制,就需要内存页来保护。
在用户进程中,除了自己的代码外,不应该能看见其他的数据,在某个用户进程激活过程中,这时的内核也看不见其他的进程代码与数据。
好象太复杂了。
一个进程所需要以下几方面的内存空间:
1、进程内存页目录表 4K,前两项指向内核内存页表,从第三项开始指向自己的内存空间。
2、代码数据页表 4K,指向代码数据的内存,由进程内存页目录表第三向指向这里。
3、堆栈页表 4K,指向堆栈的内存,由进程内存页表最后一项指向这里。堆栈从4G最后向前移动。
4、进程表 4K,本进程的相关属性信息等,含有上一进程指针与下一进程指针,进程调度用。加入页表。
5、堆栈数据 4K,初使为4K,不够再扩展。加入页表。
6、进程体长度按实际长度计算,按4K对齐,代码从偏移0开始。加入页表
7、切换至进程内存目录表。
内核设置一个映射表,保存内存被使用的情况。可以取消内核的页表,以减少内存开支。
问题是在一个进程内怎样切换到另一个进程呢? 当中断发生时,怎样保存进程表呢?
所以必须要有一个对应全部内存的页表或者在切换时取消内存页模式。
一个字节8位,一位4K,一个字节32K,1K的内存对应32M,4G内存需要128K空间。
0-FFFFF 内核代码,键盘、鼠标、内存、软盘、硬盘、中文字库。
100000-1FFFFF 系统函数,前128K为内存映射区。物理内存不到4G的,用不了128K。
在内核时:CR3 > 内核内存目录表 > 第一项页表4K 与 前显存页表4K > 4M与显存4M空间
当加载进程时:CR3 > 进程内存目录表 > 第一项与显存项指向内核中的页表 > 第一项页表4K 与 前显存页表4K > 4M与显存4M空间
如果切换到下一进程。每个进程的TSS至少104个字节。