| /********************** * linux的内存管理 **********************/ |
到目前为止,内存管理是unix内核中最复杂的活动。我们简单介绍一下内存管理,并通过实例说明如何在内核态获得内存。
(1)各种地址
对于x86处理器,需要区分以下三种地址:
*逻辑地址(logical address)
只有x86支持。每个逻辑地址都由一个段(segment)和一个偏移量(offset)组成,偏移量指明了从段的开始到实际地址之间的距离。
逻辑地址共48位,段选择符16位,偏移量32位。linux对逻辑地址的支持很有限
*线性地址(linear address)
也称为虚拟地址(virtual address)。
32位无符号整数,从0x0000,0000到0xffff,ffff,共4GB的地址范围。无论是应用程序还是驱动程序,我们在程序中使用的地址都是虚拟地址。
*物理地址(physical address)
32位无符号整数,与从CPU的地址引脚发送到存储器总线上的电信号相对应。用于存储器寻址。
找一个程序,如scanf.c,运行两个,然后执行下面指令观察:
| $>pmap $(pid) $>cat /proc/$(pid)/maps |
(2)物理内存和虚拟内存
a.物理内存
就是系统中实际存在的RAM,比如我们常说的一条256兆RAM。x86处理器和物理内存之间是通过实际的物理线路连接的。
另外,x86处理器还通过主板连接了很多的外设,这些外设也通过实际的物理线路和处理器相连。
对于处理器来说,多数的外设和RAM的访问方式是一致的,都是由程序发出物理地址访问实际的物理器件。
外设和RAM共享一个4G大小的物理内存空间。
b.虚拟内存
是在物理内存之上为每个进程构架的一种逻辑内存,处于应用程序的内存请求与硬件内存管理单元(Memory Management Unit, MMU) 之间.MMU将应用程序使用的虚拟内存根据预先定义好的页表转化为物理地址,然后通过物理地址对实际的外设或RAM进行访问。
虚拟内存有很多用途和优点:
*若干个进程可以并发地执行 *应用程序所需内存大于物理内存时也可以运行 *程序只有部分代码装入内存时进程可以执行它 *允许每个进程访问可用物理内存的一个子集 *进程可以共享库函数或程序的一个单独内存映像 *程序是可重定位的,也就是说,可以把程序放在物理内存的任何地方 *编程者可以编写与机器无关的代码,不必关心物理内存的组织结构(3)RAM的使用
linux将实际的物理RAM划分为两部分使用,其中若干兆字节专门用于存放内核映像(也就是内核代码和内核静态数据结构),RAM的其余部分通常由虚拟内存系统来处理,并用在以下3种可能的方面:
*满足内核对缓存,描述符和其他动态内核数据结构的请求 *满足进程对一般内存区的请求及对文件内存映射的请求 *借助于高速缓存从磁盘及其他缓冲设备获得较好的性能







