两种地址空间都可以进行分页,而且互相独立。它们分别有自己的页表,分别完成虚拟页面到物理页框的映射。
几个不同的用户同时运行同一个程序很常见,由于避免了在内存中有一个页面的两份副本,共享页面效率更高。只读的页面(诸如程序文本)可以共享,但是数据页面则不能共享。
如果一个程序被启动两次,大多数操作系统会自动共享所有的代码页面,而在内存中只保留一份代码页面的副本。由于库是共享的,因此在装载时再进行重定位就不可行,在编译时用一个特殊的编译选项告知编译器只产生使用相对地址的指令。
A compiler has many tables that are built up as compilation proceeds, possibly including:
代码段由各个函数产生,函数的每一个语句将最终经过编绎和汇编生成二进制机器代码。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
传入的参数、局部变量、都是在栈顶分布,随着子函数的增多而向下增长.
函数的调用地址(函数运行代码)、全局变量、静态变量都是在分配内存的低部存在
而malloc分配的堆则存在于这些内存之上,并向上生长.
分段内存允许每个表独立于其他表而增长或缩小。
把程序按内容或过程(函数)关系分成段,每个段有自己的名字(编号)。段式管理以段为单位分配内存,然后通过地址变换将段式虚拟地址转换成实际的内存物理地址。
分页系统能有效地提高内存的利用率,而分段系统能反映程序的逻辑结构,便于段的共享与保护,将分页与分段两种存储方式结合起来,就形成了段页式存储管理方式。
在段页式存储管理系统中,作业的地址空间首先被分成若干个逻辑分段,每段都有自己的段号,然后再将每段分成若干个大小相等的页。对于主存空间也分成大小相等的页,主存的分配以页为单位。
When a memory reference occurs, the following algorithm is carried out:
为实现段页式存储管理,系统应为每个进程设置一个段表,包括每段的段号,该段的页表始址和页表长度。每个段有自己的页表,记录段中的每一页的页号和存放在主存中的物理块号。
Fixed Partition | Variable Partition | Paging | Segmentation | Segmentation with Paging | |
Fragmen-tation | Internal | External | Internal | External | Internal |
Continuity | Whole process | Whole process | Page | Segment | Page |
Swapping | Whole process | Whole process | Page | Segment | Segment |
Relocation | Base register | Base register | Page table | Segment table | Segment table with page tables |
从80386开始地址线变为了32位,可以支持虚拟存储器,支持实模式、保护模式,支持多任务,其内存寻址就开始采用虚拟寻址了。
段寄存器CS、SS、DS、ES工作在实模式时与16位CPU的段寄存器作用相同,而工作在保护模式则不在存放段值,而是作为选择子,在虚拟地址转换时使用。FS和GS是附加数据段,通过把段地址存入这两个寄存器可以实现自定义寻址。
逻辑地址是对应的硬件平台段式管理转换前地址,那么线性地址则对应了硬件页式内存的转换前地址。
在Linux中称为存储器映射,同时提供了一个mmap的系统调用来实现该功能。
分级保护域经常被叫作保护环(Protection Rings),简称Rings。这是一种用来在发生故障时保护数据和功能,提升容错度,避免恶意操作 ,提升计算机安全的设计方式。
Table of Contents | t |
---|---|
Exposé | ESC |
Full screen slides | e |
Presenter View | p |
Source Files | s |
Slide Numbers | n |
Toggle screen blanking | b |
Show/hide slide context | c |
Notes | 2 |
Help | h |