Linux内核设备驱动之内存管理笔记整理

2019-01-16 20:42:48王冬梅
/********************** * 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种可能的方面:

*满足内核对缓存,描述符和其他动态内核数据结构的请求 *满足进程对一般内存区的请求及对文件内存映射的请求 *借助于高速缓存从磁盘及其他缓冲设备获得较好的性能