内存管理随想

内存管理分为两个层面,一个是内核级的,一个是用户级的。

内核级的内存管理主要响应进程的内存申请与扩展、注销。每个进程应当准备满足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个字节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值