如何写论文?写好论文?免费论文网提供各类免费论文写作素材!
当前位置:免费论文网 > 美文好词 > 优质好文 > linux内存管理机制

linux内存管理机制

来源:免费论文网 | 时间:2017-05-05 06:28 | 移动端:linux内存管理机制

篇一:段页机制、linux-0.11内存管理机制

Intel 80x86段页内存寻址机制、Linux-0.11内存管理机制--2012年11月19日8:54:18

一、Intel 80x86段页内存管理机制

1.段选择符

段选择符(段寄存器的低16位)指示着段的描述符,在段描述符中包含有定义段所用的全部信息。段选择符具体包括:

(1)索引字段:是由13位组成。利用索引字段可以从拥有8192个段描述符的段描述 符表中选出任何一个段描述符来。处理机用8(8是段描述符的字段数)乘以索引值再加上描述符的基地址(来自全局描述符寄存器,或者局部描述符寄存器)就是索引字段值。

(2)段描述符指示段字段Ti:这个字段用来说明使用的是全局描述表GDT,还是局部 描述用符表LDT。若这一位被清成0,说明选择的是全局描述符GDT,若这一位被置成1,说明当前选中了局部描述符表。

(3)请求特权级字段RPL:这个字段由两位(位1和位0)组成,所以可以表示0-3共4 个特权级。若这个字段所含的表示特权级的值比程序的特权级值小(即该字段所表示的特权级比程序的高),它就会在使用这个选择符去访问这个程序时覆盖掉这个程序的特权级。

2.80x86的段页内存寻址机制

在保护方式下,80386不仅采用扩充的存储器分段管理机制,而且提供可选的存储器分页 管理机制。这些存储管理机制由80386存储管理部件MMU实现。

(1)目标

80386有32根地址线,在保护方式下,它们都能发挥作用,所以可寻址的物理地址空间高达4G字节。在以80386及其以上处理器为CPU的PC兼容机系统中,把地址在1M以下的内存称为常规内存,把地址在1M 以上的内存称为扩展内存。

80386 还要对实现虚拟存储器提供支持。虽然与8086可寻址的1M字节物理地址空间相比,80386可寻址的物理地址空间可谓很大,但实际的微机系统不可能安装如此达的物理内存。所以,为了运行大型程序和真正实现多任务,必须采用虚拟存储器。虚拟存储器是一种软硬件结合的技术,用于提供比在计算机系统中实际可以使用的物理主存储器大得多的存储空间。这样,程序员在编写程序时不用考虑计算机中物理存储器的实际容量。80386还要对存放在存储器中的代码及数据的共享和保护提供支持。任务甲和任务乙并存,任务甲和任务乙必须隔离,以免相互影响。但它们又可能要共享部分代码和数据。所以,80386既要支持任务隔离,又要支持可共享代码和数据的共享,还要支持特权保护。

(2)地址空间和地址转换

保护方式下的虚拟存储器由大小可变的存储块构成,这样的存储块称为段。80386采用称为描述符表(即段表,包括GDT和IDT)来描述段的位置、大小和使用情况。虚拟存储器的地址由指示描述符的选择子和段内偏移两部分构成,这样的地址集合称为虚拟地址空间。80386支持的虚拟地址空间可达64T字节(虚拟地址空间由GDT 映射的全局地址空间和由LDT映射的局部地址空间组成。选择符的索引部分由13 个比特位表示,加上区分GDT和LDT的1 个比特位,因此Intel 80X86 CPU 共可以索引16384 个选择符。若每个段的长度都取最大值4G,则最大虚拟地址空间范围是16384 * 4G = 64T)。程序员编写程序时使

用的存储地址空间是虚拟地址空间,所以,他们可认为有足够大的存储空间可供使用。

显然,只有在物理存储器中的程序才能运行,只有在物理存储器中的数据才能访问。因 此,虚拟地址空间必须映射到物理地址空间,二维的虚拟地址必须转化成一维的物理地址。由于物理地址空间远小于虚拟地址空间,所以只有虚拟地址空间中的部分可以映射到物理地址空间。由于物理存储器的大小要远小于物理地址空间,所以只有上述部分中的部分才能真正映射到物理存储器。

线性地址空间由一维的线性地址构成,线性地址空间和物理地址空间对等。线性地址32位长,线性地址空间容量为4GB。

每一个任务有一个虚拟地址(逻辑地址)空间。80386分两步实现虚拟地址(逻辑地址)空间到物理地址空间到物理地址空间的映射,也就是分两步实现虚拟地址(逻辑地址)到物理地址的转换,但第二步是可选的(即分页机制可选)。

通过描述符表(即段表,包括GDT和IDT)和描述符,分段管理机制实现虚拟地址空间到线性地址空间的映射,实现把二维的虚拟地址转换为一维的线性地址。这一步总是存在的。

分页管理机制把线性地址空间和物理地址空间分别划分为大小相同的块,这样的块称为页。通过在线性地址空间的页与物理地址空间的页建立之间建立的映射表(即页表,每个进程都可以拥有自己的页表),分页管理机制实现线性地址空间到物理地址空间的映射,实现线性地址到物理地址的转换。分页管理机制是可选的,在不采用分页管理机制时,线性地址空间就等同于物理地址空间,线性地址就等于物理地址。

分段管理机制所使用的可变大小的块,时分段管理机制比较适宜处理复杂系统的逻辑分段。存储块的大小可以根据适当的逻辑含义进行定义,而不用考虑固定大小的页所强加的人为限制。每个段可作为独立的单位处理,以简化段的保护及共享。分页机制使用的固定大小的块最适合于管理物理存储器,无论是管理内存还是外存都同样有效。分页管理机制能够有效地支持实现虚拟存储器。

段及分页这两种机制是两种不同的转换机制,是整个地址转换函数的不同的转换级。虽然两种机制都利用存储在主存储器中的转换表,但这些表具有独立的结构。事实上,段表存储在线性地址空间,而页表存储在物理地址空间。因此,段转换表可由分页机制重新进行定位而不需段机制的参与。段转换机制把虚拟地址转换为线性地址,并在线性地址中访问段转换机制的表格,而不会觉察分页机制已把线性地址转换为物理地址。类似地,分页机制对于程序产生的地址所使用的虚拟地址空间一无所知。分页机制只是直接地把线性地址转换为物理地址,并且在物理地址中访问转换表格,并不知道虚拟地址空间的存在,甚至不知道段转换机制的存在。

(3)虚拟存储器概念

80386支持的虚拟地址空间可达64TB。虚拟地址空间由GDT 映射的全局地址空间和由LDT映射的局部地址空间组成。选择符的索引部分由13 个比特位表示,加上区分GDT和LDT的1 个比特位,因此Intel 80X86 CPU 共可以索引16384 个选择符。若每个段的长度都取最大值4GB,则最大虚拟地址空间范围是16384 * 4GB = 64TB。

虚拟存储器是一种设计技术,用于提供比在计算机系统中实际可以使用的物理主存储器大得多的存储空间。使用者会产生一种错觉,好象在程序中可以使用非常大的物理存储空间。使用虚拟存储器的好处是:一个程序可以很容易地在物理存储器容量大不一样的、配置范围很广的计算机上运行;编程人员使用虚拟存储器可以写出比任何实际配置的物理存储器都大得多的程序。虚拟存储器由存储管理机制及一个大容量的快速硬盘存储器支持。在程序运行的任何时刻,只把虚拟地址空间的一小部分映射到主存储器,其余部分则存储

在磁盘上。因为只有存储在主存储器中的部分虚拟存储器可由处理器使用,这种虚拟存储技术将依赖程序内部访问存储器的局部化特性,在程序执行中只需整个虚拟存储器中的少量存储内容在主存储器中驻留。而当访问存储器的范围发生变化时,有必要把虚拟存储器的某些部分从磁盘调入主存储器,虚拟存储器的另外的部分,也能从主存储器传送回磁盘上。

3.对页表的进一步说明

在32位逻辑地址空间的分页系统中,每个页表项占用4个字节,共32位,由于每页大小为4KB,并且位于4KB边界上,故其低12位总是0,因此页表项的低12位可做他用。页表项的高20位 + 页内偏移地址(12位) = 32位,可寻址4GB地址空间。每个进程都可以拥有自己的页表,页表占用的内存空间最大为(2^20)*4B = 4MB = 1K个页面(当然实际进程的页表只是这其中的一部分,并不总是4MB,页表项数要看进程需要的内存空间的大小而定,页表只包括进程所拥有的那些页)。

二、80x86段页机制下的Linux-0.11的内存管理机制

实际上,分段和分页在某种程度上有点沉余,因为它们都可以划分进程的物理地址空间:分段可以给每个进程分配不同的线性地址空间,而分页可以把同一线性地址空间映射到不同的物理空间。采用分页机制后,就没必要再将进程分配到不同的线性地址空间。但Linux-0.11内核通过共享页目录和线性地址分段,利用了80x86的分段机制,即采用段页机制。Linux-0.99及以后的版本中不再共享页目录,不再对线性地址分段,使每个进程都拥有4GB线性空间,逻辑地址=线性地址,巧妙的“绕过了”Intel 80x86提供的分段机制,即采用分页机制。

Linux-0.11内核采用段页机制对内存进行管理,具体如下:

Linux-0.11内存物理地址0处开始放着一页页目录表和四页页表。这一个页目录表是所有64个进程共享的。其后的四页页表正好映射16M物理内存,是进程0的页表。以后创建进程时页表需要从主内存区申请,而页目录项直接从页目录表中取。这样进程和页目录表页存在一一对应关系,任务号为的进程,对应页目录的第*16 ~ (+1)*16一共16个目录项。这样1个页目录表占据1个物理页面,即4KB,每个页目录项为4字节,因此共又1K个页目录项;每个页目录项对应一页的页表,即1K个页表项,每个页表项可以映射4K的物理内存,因此共有1K*1K*4K=4G的线性空间。这4G的线性空间由64个进程共享,通过对线性地址进行分段,每个进程都有64MB的线性空间,这样每个进程都会有16个连续的页目录项。

若有问题,欢迎联系:[email protected]

篇二:linux内存管理

linux内存管理

1.

1.1 内存结点:

计算机系统按物理内存的管理方式可分为2类:

UMA计算机(一致内存访问):将所有内存组织在1个连续空间中,smp系统中的每个cpu访问各内存区都是同样地快。

NUMA计算机(非一致内存访问):每个处理器都有本地内存,可快速访问。各处理器通过总线连接起来,以支持对其它处理器的访问,访问速度比访问本地内存慢些。

这2种系统模型可混用,比如在UMA系统中,若内存不连续则使用NUMA模型管理会更有帮助。这2种模型在算法上没有什么差别,在UMA系统上,只使用1个NUMA节点来管理内存,内存管理的其它部分认为它在处理1个伪NUMA系统。

是否可以认为,UMA系统是NUMA系统的1个特例,UMA系统是只有1个节点的NUMA系统????

内存结点管理结构如下:

注意,2.6.34版本的与以下不同。

/* include/linux/mmzone.h */

typedef struct pglist_data{ 内存管理相关结构:

struct zone node_zones[ MAX_NR_ZONES ]; /* 结点中包含的所有内存域 */ struct zonelist node_zonelists[ MAX_ZONELISTS ]; /*

* 备用结点内存域列表,在当前结点没有内存分配时可到备用节点中分配

*/

int _zones; /* 节点中内存域的数目 */

#ifdef CONFIG_FLAT_NODE_MEM_MAP /* means !SPARSEMEM */

struct page *node_mem_map; /*

* 指向页结构的数组,该数组包含了节点中所有域的页

*/

#ifdef CONFIG_CGROUP_MEM_RES_CTLR

struct page_cgroup *node_page_cgroup;

#endif

#endif

#ifndef CONFIG_NO_BOOTMEM

struct bootmem_data *bdata; /*

* 系统启动时会启用一套临时内存管理机制

* struct bootmem_data就是该机制的管理结构体

*/

#endif

#ifdef CONFIG_MEMORY_HOTPLUG

/*

* Must be held any time you expect node_start_pfn, node_present_pages

* or node_spanned_pages stay constant. Holding this will also

* guarantee that any pfn_valid() stays that way.

* Nests above zone->lock and zone->size_seqlock.

*/

spinlock_t node_size_lock;

#endif

unsigned long node_start_pfn; /*

* node_start_pfn表示节点中的第1个页帧编号。页帧的编号是全局统一的

* 在UMA系统中只有1个节点所以node_start_pfn为0

*/

unsigned long node_present_pages; /* 结点中页帧的总数 */

unsigned long node_spanned_pages; /* 结点中包括空洞在内的页帧总数 */

int node_id; /* 结点的编号 */

wait_queue_head_t kswapd_wait; /* 交换进程的等待队列 */

struct task_struct *kswapd; /*

* 指向负责该结点的交换进程的task_struct 结构

*/

int kswapd_max_order; /* 由页交换子系统使用,定义要释放的区域大小 */ enum zone_type classzone_idx;

}pg_data_t;

1.2 内存域:

系统所支持的所有内存域类型定义在zone_type结构体变量中。

/* include/linux/mmzone.h */

enum zone_type{

#ifdef CONFIG_ZONE_DMA

ZONE_DMA, /* 支持DMA操作的内存域 */

#endif

#ifdef CONFIG_ZONE_DMA32

ZONE_DMA32, /*

* 支持DMA操作的,按32位寻址的内存域

* 只有在64位系统中ZONE_DMA才与ZONE_DMA有差别

*/

#endif

ZONE_NORMAL,

#ifdef CONFIG_HIGHMEM

ZONE_HIGHMEM,

#endif

ZONE_MOVABLE, /* 伪内存域,防止物理内存碎片机制中要使用该内存域 */ /* 高端内存域 */ /* 普通内存域 */ __MAX_NR_ZONES /* 钳位,表示所有的内存域总数 */

};

struct zone结构体变量用来管理内存域。

注意,zone结构体在2.6.34版本内核中有变。

/* include/linux/mmzone.h */

struct zone{

unsigned long watermark[ NR_WMARK ]; /*

* 数组watermark管理该内存域的3个水线值:

* WMARK_HIGH:空闲页多余该值表示内存域的状态是理想的

* WMARK_LOW:空闲页低于该值,内核开始将页换出到磁盘

* WMARK_MIN:空闲页低于该值,急需空闲页,内存紧张

*/

篇三:Linux 内存管理

计算机操作系统课程小论文

Linux内存管理机制

姓名:汪青松

班级:10网络工程1班

学号:1004031010

Linux内存管理机制

班级:10级网络工程1班姓名:汪青松学号:1004031010

一、 概述

现代操作系统允许多个程序同时运行,因此,内存中需要同时存放这些程序,操作系统采用的存储管理方案有分区存储管理、分页式存储管理、分段式存储管理和段页式存储管理。

在Linux平台上,多任务运行是不可或缺的,在合理的进程调度算法控制下还得合理的管理内存机制,除了在物理内存的支持下,Linux还得借助虚拟内存等来容纳更多的程序运行,没有足够的内存空间来供程序运行,机器则会出现假死机、服务异常等问题,如果Linux虽然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。因此,合理规划和设计Linux内存的使用,是非常重要的。

二、 Linux下内存管理框架

在Linux中对于内存的管理涉及到:页面管理、连续内存区管理和非连续存储区管理,而对于内存管理的方式通常为直接使用、使用slab分配器和使用非连续的存储区。其

Linux采用页作为内存管理的基本单位,其采用的标准的页面大小为4KB,采用三次映射机制实现从线性地址到物理地址的映射。Linux内核使用页描述符来跟踪和管理物理内存,每个物理页面都用一个页描述符表示,页描述符用struct page 的结构描述,所有物理页面的描述符组织在men_map数组中,page则是对物理页面描述的一个数据结构Linux采用buddy算法来解决内存的碎片问题。

三、 Linux对虚拟内存的管理

在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。这是Linux内存管理的一个优秀特性,在这方

面,区别于Windows的内存管理。主要特点是,无论物理内存有多大,Linux 都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能。而Windows 是只在需要内存时,才为应用程序分配内存,并不能充分利用大容量的内存空间。换句话说,每增加一些物理内存,Linux 都将能充分利用起来,发挥了硬件投资带来的好处,而Windows只将其做为摆设,即使增加8GB甚至更大。Linux 的这一特性,主要是利用空闲的物理内存,划分出一部份空间,做为cache 和 buffers ,以此提高数据访问性能。从而引出物理内存的特性。

对于从物理内存中虚拟出来的内存可以解决内存容量的问题,还拥有许多的附加功能:诸如大地址空间;进程保护;内存映射;灵活分配物理内存;共享虚拟内存等。

Linux对于虚拟内存的管理以进程为基础,如32位的线性进程映射到4Gb的虚拟空间中去,从0XC0000000到0XFFFFFFFF的1Gb空间为所用进程所共享的内核空间,每个进程都有自己的3Gb用户空间。

四、 Linux对物理内存的管理

在Linux中对于物理内存的管理主要是通过页面的方式

(一)、物理内存的页面管理

在内存基本框架中已经提起,Linux对于物理内存的空间主要是通过分页的方式来进行管理的,其具体做法就是将物理内存划分成大小相同的物理页面。在X86平台下每个页面的大小为4KB,4KB是大多数磁盘块大小的倍数,传输效率高,管理方便。Linux设置了一个mem_map数组管理内存页面,它开始时由free_area_init()来初始化创建,并且放在物理内存的底部。

(图一)mem_map数组结构

(图二)Buddy算法

(二)、空闲页面的管理(Buddy算法)

Buddy的基本思想是:首先把内存中的所有页面按照2n划分其中n=0~5,对一个内存空间按1个页面、2个页面、4个页面、8 个页面、16个页面、32 个页面进行六次划分,划分后形成了大小不等的存储块称为页面块,简称页块。包含1个页面的页块称为1页块,包含2个页面的称为2页块,依此类推。Linux 把物理内存划分成了1、2、4、8、16、32六种页块。对于每种页面块按前后顺序两两结合成一对 Buddy"伙伴"按照1页面划分后,0和1页、2和3页……是1页块Buddy。按照2页面划分,0-1和2-3、4-5和6-7……是2页块。

BuddyLinux 把空闲的页面按照页块大小分组进行管理,用数组free_area[]来管理各个空闲页块组。

在linux/mm/page_alloc.c中定义如下:

#define NR_MEN_LIST 6

Static struct free_area_struct free_men[NR_MEN_LIST];

Struct free_area_struct{

Struct page *next;

Struct page *prev;

Unsigned int *map;

}

五、 内存空间的分配和释放

(一)、物理内存分配

Linux中在申请和释放较小的内存时,使用kmalloc()和kfree()在物理内存中进行分配。这些内存是实际存在的,并且是连续的,并且是根据slab块来分配。kmalloc()和kfree()分配和释放内存是以块(block)为单位进行的。可以分配的空闲块的大小记录在blocksize表中,它是一个静态数组,定义在/mm/kmalloc.c中:在使用kmalloc()分配空闲块时仍以Buddy算法为基础,

即以free_area[]管理的空闲页面块做为分配对象。重新制定了分配的单位, blocksize[]数组中的块长度。它可以分配比1个页面更小的内存空间。blocksize[]中的前7个是在1个空闲页面内进行分配,其后的6种分别对应free_area[]的1至32空闲页面块,当申请分配的空间小于或等于1个页面时,从free_area[]管理的1页面块中查找空闲页面进行分配。若申请的空间大于一个页面时,按照blocksize[]后六个块单位进行申请,从free_area[]中与该块长度对应的空闲页块组中查找空闲页面块。

Free_area数组定义如下:

Typedef struct free_area_struct{

Struct list_head free_list;

Unsigned int *map;

}free_area_t;

(二)、虚拟内存分配

在分配在物理申请较大的内存空间时,使用vmalloc()。由vmalloc()申请的内存空间在虚拟内存中是连续的,它们映射到在物理内存时,可以使用不连续的物理页面,而且仅把当前访问的部分放在物理页面中。

Vmalloc申请内存如下:

#define A_MEGABYTE 1024*1024

int main(){

char *some_memery;

int megabyte=A_MEGABYTE;

int exit_code=EXIT_FAILURE;

some_memery=(char*)valloc(megabyte); /* 申请内存 */

if(some_memery!=NULL){

sprintf(some_memery,"Hello world!\n"); /* 将字符串写入 some_memery 所 指向内存 */

printf("%s",some_memery);


linux内存管理机制》由:免费论文网互联网用户整理提供;
链接地址:http://www.csmayi.cn/meiwen/31634.html
转载请保留,谢谢!
相关文章