Linux内存管理

32位操作系统管理4G内存空间。操作系统将这4G的内存空间划分为两部分,分别是低地址的3G空间(用户空间)和高地址的1G空间(内核空间),用户空间供用户进程使用,内核空间供内核使用。这样做的好处是将用户进程和内核进程分开,使内核进程不受用户进程的影响,使操作系统正常平稳运行。如果不将用户进程和内核进程分开,创建足够多的用户进程,会慢慢占满内存,使操作系统无法正常运行导致死机。而将用户空间和内核空间分开,即使用户进程占满了用户空间,操作系统还能正常进行工作,这样就能正常管理用户空间内存,杀死无用进程,释放内存空间。对于用户空间内存,操作系统又做了细分,从低地址到高地址分为代码段,数据段,BSS段,堆段,栈段。而堆段是从低地址到高低是扩充内存,栈段是从高地址到低地址扩充内存。代码段一般存储编译好了的二进制代码;数据段存储程序中已初始化了的全局变量,静态变量,常量;BSS段存储未初始化的全局变量和静态变量,虽说未初始化,但编译器会将其赋值0或NULL。堆是程序员手动申请的内存空间和释放内存空间,用来存储数据。栈是编译器自动扩充内存,释放内存空间,栈用来存储程序的局部变量,参数等数据。程序在没运行之前,存储在磁盘中,当运行时,将程序调入到内存中,使其成为进程,由于内存空间太小,不能满足所有进程的需求,所以提出了虚拟内存,每个进程都能分配到3G用户空间的虚拟内存。进程在没有访问物理地址之前,访问的都是虚拟内存,知道真正访问物理内存时,MMU将虚拟地址转化为物理地址,通过请页机制,将某页加载如内存中并执行。
逻辑地址:由程序产生的与段相关的偏移地址部分。逻辑地址由两部分组成:16位的段选择器和32位的段内偏移量。将段选择器和32位段内偏移量相加,即得到32位的线性地址。
虚拟内存地址(线型地址):每个进程可以直接寻址的内存空间,不受其他进程干扰。线性地址由三部分组成,高10位,中间10位,低12位,高10位存放的是页目录表索引,通过它,可以找到页表的物理地址,中间10位为页表的偏移量,根据它,能得到物理页号,物理页号与12位的页内偏移量组合能得到物理地址。
物理地址:内存真实地址编号。
硬件电路单元MMU(内存控制单元)通过段机制把逻辑地址转化为线型地址,再通过页机制把线性地址转化为物理地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章