LINUX
首先,Linux内核主要由五个部分组成,他们分别是:进程调度模块、内存管理模块、文件系统模块、进程间通信模块和网络接口模块。
本部分所讲的内存是内存管理模块,其主要的作用是有以下几点:
1:内存管理模块还支持虚拟内存的管理方式,使得Linux支持的进程使用比实际的内存空间有更多的内存容量。
2:保证所有的进程都能够安全的共享机器的主内存区;
3:利用文件系统把暂时不用的内存数据转移到外部存储设备上去,需要的时候交换回来。
我们在下面的叙述中逐条的剖析Linux是如何完成上面的工作的。
首先,我们能够使用的地址空间要比实际的空间地址大小要大的多。我们首先认识几个概念:
虚拟地址:直接又程序产生的地址空间,由段选择符(说白了就是说在哪一个段上)和段内偏移量组成;
逻辑地址:由程序产生的,与段相关的偏移地址。应用程序员可以与逻辑地址打交道,但是分段和分页对他们来说是完全透明的;
线性地址:是由虚拟地址到物理地址的中间层,是处理器可寻址的内存空间,程序代码产生的段选择符(可以知道其段的基址)然后加上段内偏移量就是其线性地址。如果启用了分页机制,那么线性地址要在经过变换变成物理地址,如果没有启用分页机制,那么他的线性地址就是物理地址(Intel 80386 线性地址为4G)。
物理地址:是指出现在CPU外部总线上的寻找物理内存的地址信号,是最终的地址。
虚拟内存:是指计算机所呈现出来的内存量远大于他的实际拥有的内存空间大小。
内存—分段实现机制:
在内存分段机制中,一个程序的逻辑地址通过分段机制自动映射到中间层的4G的线性地址中。程序每次的引用都是对内存段的中内存的引用。当程序进行引用时,其地址就是计算好的物理地址。
但是,我们经过计算得到的物理地址,可能是一块根本就不存在的内存区域(内存的页表中标识出相应的页面不在内存中),当一个进程引用这样的一个地址的时候,就是发生缺页中断,并将引起中断的线性地址放入到CR2寄存器中。因此在处理中断的时候,就能够从寄存器中得到该页面的确定地址,这样就可以将页面从二级存储空间中(比如硬盘上)加载到物理内存中。如果此时物理内存已经被全部占用,那么可以借助二级存储空间的一部分作为交换区(这就是在安装Linux的时候预留的swap区域的作用),将一部分不使用的页面放入到交换区中,然后将要求的页面放入内存。
在Linux 0.11系统中,内核设置设置全局描述符表GDT中的段描述符项数最大为256,其中两项空闲,两项系统使用,每个进程使用两项。因此系统最多容纳(256-2)/2 个任务,并且虚拟地址的范围126*64MB约等于8G,但是0.11内核中人工定义的任务数量为64个,每个任务逻辑地址范围为64MB,各个任务地址的起始地址为任务号码*64MB,因此全部任务使用的地址空间约为4GB。图中显示的是有四个任务的情况,内核的代码段和数据段被映射到内存开始16MB的部分,并且代码和数据在一个区域,完全相互重叠。第一个任务(任务0)比较特别,它是由内核启动,他的代码和数据包含在内核的代码和数据中,他的代码和数据段是从0-640KB的区域,其代码段与数据段也是完全重叠,并且与内核的代码数据段有重叠的部分。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。