体系架构番外篇 - 我们说MIPS的最佳页映射

From: ongoingcre

如果再见不能红着眼,是否还能红著脸 - CCNN

一、MIPS上地址空间的内存管理

Memory_Mips
上述空间在32位操作系统和64位操作系统下,地址空间范围分别是:

32位系统中
0x00000000 - 0x7fffffff, 无论用户态还是内核态都可以寻址!
0x80000000 - 0x9f000000 && 0xc0000000 - 0xffffffff, 只有内核态的进程才能寻址!
64位系统中
0x0000000000000000 - 0xffffffff7fffffff
0xffffffff80000000 - 0xffffffff9f000000 && 0xffffffffc0000000 - 0xffffffffffffffff 
几点总结:

a.在MIPS下用户可访问空间是我们称之为KUSEG的那部分空间!所有的高位地址都保留给操作系统.
b.对于操作系统而言,低地址就像一个安全的’Sandbox’,用户可以肆意的运行或者破坏自己的数据!其它程序并不会担心受到影响!
c.在沙盒内部,操作系统给有需求的程序提供更多的栈空间(隐式),同时提供一个系统调用,用来从一个预先声明的数据区域最改地址为起始并且不断增长的地址空间(堆),当中获取更多的数据!
d.在类Unix*的操作系统中,进程在操作系统内部由自己的标识码(这部分后续在进程管理中会详细去介绍),为了确保应用程序只能做它们允许的事情,绝不部分内核服务以特殊的子进程的形式提供!应用程序调用子程序页必须遵循特定的规则!
e.每个进程的用户空间会映射到专属于本进程的物理存储空间上去,但是操作系统的空间是共享的!
f.众所周知,进程的地址空间划分<栈位于顶部<因为可以更好的进行地址扩展>,代码和静态编译数据位于底部>!

映射的故事

把进程空间映射到真正的物理内存
MIPS系统结果或多或少都会要求程序(不管是应用程序还是内核程序)使用的地址在编译链接勾就会固定下来。这意味着应用程序在构建时不可能显式的使用不同的地址!因此在程序运行时候,它的程序地址会映射到物理地址上,这个地址在程序装载的时候就已经被操作系统给固定下来了!

尽管在进程间切换上下文的时候,打包所有的地址映射信息是可行的,但是其效率相当低,替代办法是给每一个进程分配一个编号(进程ID,or ASID).每个进程里的任何地址都被任何隐式的被进程的ASID扩展,并相应的产生唯一的有待译码地址。在一个进程被调度的时候,ASID需要被装入CPU的寄存器中,使得硬件可以使用!
映射机制还允许操作系统能干把用户空间地址的不同地方区分对待,应用程序的某些空间(一般是代码部分)被映射为只读,而其它部分则可以暂时不映射,对其访问会导致’trapped’(陷阱),这意味着一个胡乱运行的程序可以被更早的及时停止!
进程地址空间的内核部分通常被所有的进程共享,而且这部分绝大多数内容映射为常驻的操作系统代码和数据。由于这些代码链接为在这些地址运行,所有不需要灵活的映射机制。事实上,大部分运行在MIPS上的内核会把它们的绝大部分代码置于那些映射已被体系结构固定了的地址空间中!

二、谈谈什么才是最佳页映射

为了映射地址,人们尝试过很多特殊方法,通常使用基地址/范围’二元组来保证访问的正确性,然后如果内存映射时提供给程序恰好所需要的大小的内存, 尽管这很明显为应用程序提供了最优服务,却会迅速导致可用内存被分割为难易利用的内存碎片。所有实际系统都以页的形式对内存进行映射,页通常是2的幂次个字节的大小,故而4KB大小的页应用非常普遍!

未完待续…

By: Keven - 点滴积累

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值