码迷,mamicode.com
首页 > 系统相关 > 详细

linux 基本概念

时间:2015-04-17 13:26:49      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

Linux把物理内存分为了固定统一大小的块,称为page(页框),一般为4KB。

Linux采用4KB页框大小作为标准的物理内存分配单元,内核用数据结构page描述一个页框的状态信息,其实页是进程的概念,页框里面装的是页

 

linux内核中使用struct page的页描述符表示页框的状态,每个物理页框对应一个page结构体,也就是页描述符。页描述符是按照数组的方式组织的,这个数组的首地址存在于mem_map这个结构体指针中。

如果知道了页框号pfn则可以通过pfn<<PAGE_SIZE获得其物理地址,而页框号也可以通过对应页描述符page的首地址来获得:(&page-mem_map)/sizeof(struct page)。这样就建立起了物理页框于页描述符之间的联系....

物理页框与内核的page(页描述符)一一对应

 

 

高端内存区:内核线性地址空间中的概念(内核线性地址(3G~4G范围内)高于896的线性地址空间) 前 面我们解释了高端内存的由来。 Linux将内核地址空间划分为三部分ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM,高端内存HIGH_MEM地址空间范围为 0xF8000000 ~ 0xFFFFFFFF(896MB~1024MB)

 

高端内存的由来:(简单说就是利用内线线性空间的高端内存映射剩下的物理内存,低端内存线性空间直接映射到物理内存中,这样只拥有1G线性空间的内核态,就能访问4G的物理内存)

假设按照上述简单的地址映射关系,那么内核逻辑地址空间访问为0xc0000000 ~ 0xffffffff,那么对应的物理内存范围就为0×0 ~ 0×40000000,即只能访问1G物理内存。若机器中安装8G物理内存,那么内核就只能访问前1G物理内存,后面7G物理内存将会无法访问,因为内核 的地址空间已经全部映射到物理内存地址范围0×0 ~ 0×40000000。即使安装了8G物理内存,那么物理地址为0×40000001的内存,内核该怎么去访问呢?代码中必须要有内存线性地址 ,0xc0000000 ~ 0xffffffff的地址空间已经被用完了,所以无法访问物理地址0×40000000以后的内存。

高端内存映射的方法(利用内存线性地址空间的128M来映射)

1、永久内核映射(void *kmp(struct page*page)

高端内存和低端内存均适用

内核专门为此留出一块线性空间,从 PKMAP_BASE 到 FIXADDR_START ,用于映射高端内存。在 2.6内核上,这个地址范围是 4G-8M 到 4G-4M 之间。这个空间起叫”内核永久映射空间”或者”永久内核映射空间”。这个空间和其它空间使用同样的页目录表,对于内核来说,就是 swapper_pg_dir,对普通进程来说,通过 CR3 寄存器指向。通常情况下,这个空间是 4M 大小,因此仅仅需要一个页表即可,内核通过来 pkmap_page_table 寻找这个页表。通过 kmap(),可以把一个 page 映射到这个空间来。由于这个空间是 4M 大小,最多能同时映射 1024 个 page。因此,对于不使用的的 page,及应该时从这个空间释放掉(也就是解除映射关系),通过 kunmap() ,可以把一个 page 对应的线性地址从这个空间释放出来。

2、临时内核映射

 

3、非连续区内存管理

 

linux 基本概念

标签:

原文地址:http://www.cnblogs.com/kkshaq/p/4434373.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!