2.1linux内存管理的基本框架-创新互联

i386CPU中页式存管的基本思路:通过页面目录和页面表分两个层次实现从线性地址到物理地址的映射。这种映射模式在大多数情况下可以节省页面表所占用的空间。因为大多数进程不会用到这个虚存空间,在虚存空间中通常都留有很大的空洞。采用两层的方式,只要一个目录项所对应的那部分空间时空洞,就可以把该目录项设置成空,从而省下了与之对应的页面表(1024个页面表)。2.1linux内存管理的基本框
架

linux内核的映射机制设计成三层:PGD,PMD,PT。相应的在逻辑上把线性地址从高位到地位划分为4个位段,各占若干位,分别用作在目录PGD中的下标、PMD下标和PT下标以及物理页面PTE中的偏移。

创新互联专注于栖霞企业网站建设,响应式网站建设,购物商城网站建设。栖霞网站建设公司,为栖霞等地区提供建站服务。全流程定制网站建设,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务

理论上每个进程可以使用的用户空间都是3G字节(实际的空间大小受到物理存储器包括内存以及磁盘交换区或交换文件大小的限制)。虽然各个进程拥有其自己的3G字节用户空间,系统空间却由所有的进程共享。每当一个进程通过系统调用进入了内核,该进程就在共享的系统空间中运行,不再有其自己的独立空间。从具体的进程的角度看,每个进程都拥有4G的虚存空间,较低的3G为自己的用户空间,高的1G则为与所有进程以及内核共享的系统空间。

系统空间占据了每个虚存空间中高的1G,在物理的内存中却是从最低的地址0开始。所以,对于内核来说,其地址的映射是很简单的线性映射,0xC0000000就是二者的偏移。

#define __PAGE_OFFSET (0xC0000000)

#define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET)

#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)

#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))

#define TASK_SIZE (PAGE_OFFSET)

每个进程的局部描述符表LDT都作为一个独立的段而存在,在全局描述符表GDT中要有一个表项指向这个段的起始地址,并说明该段的长度和其他一些参数。除此之外,每个进程还有一个TSS结构(任务状态段)。所以每个进程都要在全局段描述符表GDT中占据两个表项。段寄存器中用作GDT表下标的位段宽度是13位,所以GDT中可以有8192个描述项。除一些系统的开销以外,上有8180个表项可用,所以理论上系统中大的进程数量是4090.


分享名称:2.1linux内存管理的基本框架-创新互联
网页路径:http://pwwzsj.com/article/dhejcg.html