操作系统的内存管理机制

内存管理(Memory management)旨在为系统中所有的task提供稳定可靠的内存分配、释放与保护的机制

不论是android 中的音频系统、GUI系统、或者是Binder实现的机理等都与内存的管理是息息相关的。


虚拟内存

计算机出现的早期物理的内存普遍很小,不过因为当时的程序体积也不大,所以不会有什么问题。然而随着软件的发展,动辄以GB为单位的程序也是出现了很多。在这种的情况下,如何保证这些软件能在大多数的机器上运行。
一种方法加大物理内存,使得机器能一次性读入任何程序。这样的理想是很丰满的,但是现实却是不容易实现,因为硬件的升级意味着成本的增加,即使内存增加到16G或者是64G问题也是没有得到根本的解决。
另外的一种方法是使用虚拟内存;
基本思想:    (1)将外存储器的部分空间作为内存的扩展,如从硬盘划出4GB的大小。
(2)当内存的资源不足的时候,系统将会按照一定的算法自动的挑选优先级低的数据块,并把他们存储到硬盘中。
(3)后续如果是需要使用硬盘中的这些数据快,系统将会产生“缺页”的指令,然后把他们交换回内存中。
(4)这些操作都是由操作系统内核自动完成的,对上层应用完全透明。

地址空间的转换的过程:


逻辑地址(LocalAdress)

也成为相对地址,是程序编译后所产生的地址,逻辑地址由两部分组成:

Segment Selector(段选择子)

用于描述逻辑地址所处的段 16bit


TI;table Indicator

RPL:Request Priviledge Level

GDT(Global Descriptor table)、LDT(Local Descriptor Table).他们用来记录各种段描述符,(Segment Descriptors),而表本身的存储地址则由GDTR和LDTR两个CPU寄存器来保存。GDT的有效的范围是全局的,同时系统也允许各自进程创建自己的本地表(LDT)以增加额外的段;

段选择子中的INDEX就是GDTR/LDTR 中的“序号”------具体是那个表。则由Table Indicator来区分。0标识GDT,1表示LDT


Offset(用于描述段内的偏移值)32 bit

CPU提供了专用的寄存器来承载段选择子



线性地址

线性地址是逻辑地址经过分段机制转换后形成的。基本思想

根据段选择子的TI字段得到描述符存储在GDT或者是LDT中

通过GDTR/LDTR 获得GDT/LDT的存储地址

根据段选择子中的INDEX字段到GDT/LDT中查到对应的段描述符

根据段描述符获得此段的基地址

根据基地址+段内偏移地址得到线性地址


物理地址

物理地址的空间很好理解,它是指机器真实的物理内存所能表示的地址空间的范围。比如对于只有64K内存的系统来说,其物理地址的范围是0x0000·0xFFFF。任何的操作系统,最终都需要通过真实的额物理地址来访问内存。

页:与分段的额机制不同的是。分页的机制操作的对象的大小是固定的内存块,称为“页”。一般情况下,页的大小为4KB。

叶框:叶框是对物理内存的最小的操作的单位也是4KB


线性地址中的1、3、6、7、8分别对应着物理内存中的1、2、3、4、5的叶框

内存的分配与回收

保证硬件无关性
动态分配内存和回收
内存碎片

内存保护

分段与分页的管理就是内存保护的方式
因为每个进程的逻辑地址和物理地址都不是直接对应的,任何程序都没有办法访问到他管辖的范围外的内存空间-----即便刻意产生的内存越界与非法访问,操作系统也会马上阻止并强行的关闭程序,从而有力的保障应用程序和操作系统的稳定性


你可能感兴趣的:(android随笔)