Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2038683
  • 博文数量: 414
  • 博客积分: 10312
  • 博客等级: 上将
  • 技术积分: 4921
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-31 01:49
文章分类

全部博文(414)

文章存档

2011年(1)

2010年(29)

2009年(82)

2008年(301)

2007年(1)

分类: C/C++

2008-05-16 16:00:17

1.进程虚存空间的管理
Linux操作系统采用了请求式分页存储管理方法。 系统为每个进程提供了4GB的虚拟内存空间。各个进程的虚拟内存彼此独立。
进程运行时能访问的存储空间只是它的虚拟内存空间。对当前该进程而言只有属于它的虚拟内存是可见的。在进程的虚拟内存包含着进程本身的程序代码和数据。进程在运行中还必须得到操作系统的支持。进程的虚拟内存中还包含着操作系统内核。Linux把进程的虚拟内存分成两部分,内核区和用户区。操作系统内核的代码和数据等被映射到内核区。进程的可执行映像(代码和数据)映射到虚拟内存的用户区。进程虚拟内存的内核区的访问权限设置为0级,用户区为3级。内核访问虚存的权限为0级,而进程的访问权限为3级。
Linux的存储管理主要是管理进程虚拟内存的用户区。进程虚拟内存的用户区分成代码段,数据段,堆栈以及进程运行的环境变量,参数传递区域等。每一个进程,用一个mm-struct结构体来定义它的虚存用户区。mm_struct结构体首地址在任务结构体task-struct成员项mm中:struct mm-struct *mm。
一个虚存区域是虚存空间中一个连续的区域,在这个区域中的信息具有相同的操作和访问特性。每个虚拟区域用一个vm-area-struct结构体进行描述.它定义在/include/linux/mm.h中。


2.Linux的分页式存储管理
①.Linux的三级分页结构
页表是从线性地址向物理地址转换中不可缺少的数据结构,而且它使用的频率较高。页表必须存放在物理存储器中。虚存空间有4GB,按4KB页面划分页表可以有1M页。若采用一级页表机制,页表有1M个表项,每个表项4字节,这个页面就要占用4MB的内存空间。由于系统中每个进程都有自己的页表,如果每个页表占用4MB,对于多个进程而言就要占去大量的物理内存,这是不现实的。在目前用户的进程不可能需要使用4GB这么庞大的虚存空间,若使用1M个表项的一级页表,势必造成物理内存极大的浪费。为此,Linux采用了三级页表结构,以利于节省物理内存。三级分页管理把虚拟地址分成四个位段: 页目录、页中间目录、页表、页内编址。
系统设置三级页表系列:
页目录PGD(PaGe Directory)、
页中间目录PMD(Page Middle Directory)
页表PTE(Page TablE)。
三级分页结构是Linux提供的与硬件无关的分页管理方式。当Linux运行在某种机器上时,需要利用该种机器硬件的存储管理机制来实现分页存储。Linux内核中对不同的机器配备了不同的分页结构的转换方法。对x86,提供了把三级分页管理转换成两级分页机制的方法。其中一个重要的方面就是把PGD与PMD合二为一,使所有关于PMD的操作变为对PGD的操作
在/include/asm-i386/pgtable.h中有如下定义:
#define PTRS_PER_PTE 1024
#define PTRS_PER_PMD 1
#define PTRS_PER_PGD 1024
②、地址映射
地址映射就是在几个存储空间(逻辑地址空间、线形地址空间、物理地址空间)或存储设备之间进行的地址转换。

3.物理内存空间的管理
一.物理内存的页面管理
Linux对物理内存空间按照分页方式进行管理,把物理内存划分成大小相同的物理页面。在x86机器中一个页面的大小为4KB, 定义在include/asm-i386/page.h文件中:
#define PAGE_SHIFT 12
#define PAGE_SIZE (1UL << PAGE_SHIFT)
在Alpha、Sparc中一个页面大小8KB:
#define PAGE_SHIFT 13
#define PAGE_SIZE (1UL << PAGE_SHIFT)
Linux设置了一个mem_map[]数组管理内存页面。 mem_map[]在系统初始化时由free_area_init()函数创建,它存放在物理内存的底部(低地址部分)。mem_map[]数组的元素是一个个的page结构体,每一个page结构体它对应一个物理页面。
page结构进一步被定义为mem_map_t类型,其定义在/include/linux/mm.h中。
① count:是共享该页面的进程计数。
② age:标志页面的“年龄”。
③ dirty:表示该页面是否被修改过。
④ prev和next:
把page结构体链接成一个双向循环链表。
⑤ prev_hash和next_hash:
把有关page结构体连成一个哈希表
⑥ inode和offset:
有关文件的inode和它们在文件中的偏移量。
⑦ wait:是等待该页资源的进程等待队列的指针。
⑧ flag:页面标志:
符号常量 意 义
PG_locked 页面处于闭锁状态,正在装入该页面
PG_error 页面装入时发生错误
PG_referenced 页面已装入,可以访问
PG_uptodate 页面内容更新过
PG_free_after 关于页面的I/O过程结束,页面被释放
PG_decr_after 关于页面的I/O过程结束,页面计数减少
PG_swap_unlock_after 读出交换页面后,页面解除闭锁
PG_DMA 页面可以用于DMA传送
PG_reserved 页面被保留以后使用,当前禁止使用
⑨ map_nr:该页面page结构体在mem_map[]数组中的下标值,
也就是物理页面的页号。
阅读(1387) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~