linux存储管理linux memory management

上传人:第*** 文档编号:54328081 上传时间:2018-09-11 格式:PPT 页数:24 大小:426KB
返回 下载 相关 举报
linux存储管理linux memory management_第1页
第1页 / 共24页
linux存储管理linux memory management_第2页
第2页 / 共24页
linux存储管理linux memory management_第3页
第3页 / 共24页
linux存储管理linux memory management_第4页
第4页 / 共24页
linux存储管理linux memory management_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《linux存储管理linux memory management》由会员分享,可在线阅读,更多相关《linux存储管理linux memory management(24页珍藏版)》请在金锄头文库上搜索。

1、Linux memory management,i386保护模式的分段与分页 Linux分页 线性地址空间分布 用户地址空间 内核地址空间 空闲物理内存管理 内核物理内存分配接口 共享存储,Intel x86保护模式的地址映射,段选择子16bits,段内偏移32bits,页内偏移12bits,物理地址32bits,页目录索引10bits,页表索引10bits,逻辑地址,线性地址,物理地址,GDT、LDT,pgd、pte,Intel x86的分段,描述符索引13bits,GDT/LDT 1bit,段选择子,访问特权级 2bits,段内偏移32bits,段基地址32bits,段描述符8bytes,

2、+,线性地址32bits,段界限20bits,GDT,Linux在i386上的分页,线性地址,物理地址32bits,pmd_t * dir,+,页帧首地址 20bits PMD_SHIFT) & (PTRS_PER_PMD-1),pgd,pte,存在位,读写位,用户态/核心态访问位,表示是否采用写透方式,表示是否启用高速缓存,访问位,已写标志位,页大小,4K(0)或4M(1),只适用于页目录表项,页目录表项和页表项,Linux的线性地址空间分配,4G线性地址空间分为用户空间和内核空间,内核空间又分为物理内存区、虚拟内存分配区、高端页面映射区、专用页面映射区和系统保留映射区 线性地址从0x000

3、00000到0xBFFFFFFF的3G为用户和内核共同访问,0xC0000000以上的1G由内核独享,用户态无法访问 因此所有进程的页目录的后四分之一均指向内核页目录的相应目录项。为减小同步的开销,内核只在处理page_fault时同步用户进程的页目录项,因此页目录项不一致的情况是有的,Linux的线性地址空间分配,Linux的线性地址空间分布,Memory mapped region:File-mappingShared libraries,Linux的用户地址空间分布,例: #include int z = 0; /*进程的数据段中*/ int main() int *a = 0; /*进

4、程的用户栈中*/int pid = getpid();if (pid = fork() /*父进程执行这里的代码*/a = (int *) malloc(100*sizeof(int);/*父进程的堆空间,runtime data*/z = pid; printf(“z1 = %dn”, z); else /*子进程执行的代码*/a = ,利用/proc查看进程的用户地址空间,文件映射举例,#include #include #include #include #include /* mmap.c - a program that uses mmap to copy itself to std

5、out */ int main() struct stat stat;int i, fd, size;char *bufp;/* open the file ,用户地址空间管理虚存段VMA,Linux的用户地址空间分布,进程描述符中的struct mm_struct *mm用来管理已分配给该进程的线性地址空间 每一个连续的线性地址区间由一个vm_area_struct管理,简称vma mm中的vma按地址排序由线性链表连接起来,当vma的数量相当大的时候启用avl树,与线性链表同时管理vma以提高访问效率 随着vma的动态改变,vma之间存在归并和拆分等操作 分配vma并不立即分配页帧,物理映

6、射区最大为896M,如果实际物理内存不足896M,则该区与实际物理内存大小相等 两个隔离区的作用是防止越界造成的致命损害,Linux的内核地址空间分布,物理区,虚存区,816M 隔离区,8K隔 离区,高端映射区,固定映射区,保留区,线性地址0xC0000000,Linux的物理内存映射,一般情况下,对物理内存的访问可通过预映射机制方便的实现,Linux保留了128M的虚拟内存映射区,因此最多可以有1G-128M=896M的物理内存直接映射到0xC0000000开始的一段内核空间中 当物理内存大于896M时,超过物理区的那部分内存称为高端内存,内核在存取高端内存时必须将它们映射到高端页面映射区,

7、长度为4M的高端内存映射区正好占用1帧页表所表示的物理内存总量,它可以缓冲1024个高端页面的映射,0X001000(4K) swapper_pg_dir 核心态访问空间的页目录0X002000(8K) pg00X003000(12K) bad_pages0X004000(16K) bad_pg_table0X005000(20K) floppy_track_buffer0X006000(24K) kernel_code+textFREE0X0A0000(640K RESERVED0X100000(1M) pg_tables(4K)swap_cache_memmem_mapbitmapFREE

8、,0X000000(0K) Empty_Zero_Page 由mem_init初始化,初始化后的物理内存分布,物理页管理(mem_map表),typedef struct page /* 物理页描述字 */struct page *next, *prev; /* 由于搜索算法的约定,这两项必须首先定义 */struct inode *inode; /* 若该页帧的内容是文件,则inode和offsetunsigned long offset; /* 指出文件的inode和偏移位置 */struct page *next_hash;atomic_t count; /* 访问此页帧的进程记数,大于

9、1表示由多个进程共享 */unsigned flags; /* atomic flags, some possibly updated asynchronously */unsigned dirty:16, /* 页帧修改标志 */age:8; /* 页帧的年龄,越小越先换出 */struct wait_queue *wait;struct page *prev_hash;struct buffer_head * buffers; /* 若该页帧作为缓冲区,则指示地址 */unsigned long swap_unlock_entry;unsigned long map_nr; /* 页帧在m

10、em_map表中的下标,page-map_nr = page - mem_map */ mem_map_t;mem_map_t * mem_map = NULL; /* 页帧描述表的首地址 */ mem_map_t大小:64字节,故1M的内存需要1M/64=16K=4pages的空间存放描述字,空闲物理页管理,bitmap表 在物理内存低端,紧跟mem_map表的bitmap表以位示图方式记录了所有物理内存的空闲状况。与mem_map一样,bitmap在系统初始化时由free_area_init()函数创建(mm/page_alloc.c)。与一般性位图不同,bitmap表分割成NR_MEM_

11、LISTS组。 buddy算法将空闲内存管理为一对对的伙伴;(2k)页面大小,伙伴算法与空闲物理页位图,bitmaps:位图,标识2k大小的内存块对(一对伙伴)的状态: 0:都空闲或都忙;如果都空闲,在它们作为一块更大的空闲块出现在下一个free_area的bitmaps中。 1:其中一块忙,一块空闲。,内存分配的三种内核接口,_get_free_pages:从buddy system中申请大小为2k个page的连续的物理页帧,分配内核空间的物理映射区中的一段连续的线性地址 kmalloc(kfree):从slab cache中申请连续的物理内存,通常用于专用对象 vmalloc(vfree)

12、:申请线性地址连续的内存空间,分配内核空间的虚拟内存映射区中的一段连续的线性地址,而实际对应的物理地址可以是不连续的,为检测越界,vmalloc的区域之间是有空洞的,且为保证效率,页面不会被swap out,共享存储,linux的共享存储沿用了SYSV IPC机制。进程利用共享存储进行通讯时,先向内核申请一个共享存储段。成功后把它添加(attach)到自己的地址空间,然后象使用普通存储器一样使用它。 共享存储限制:一个共享存储段的大小限制:SHMMAX:4M, SHMMIN:1byte(实际是一个page大),系统中允许的共享存储段的个数限制:SHMMNI:4096。系统中允许的共享存储段占总

13、页面数:SHMALL:2M个页面这些参数可以由超级用户修改,如: echo 2048 /proc/sys/kernel/shmmni共享存储管理系统调用:shmget,shmat,shmdt,shmctl,shm_server.c #include #include #include #include #define SHMSZ 27 main()char c; int shmid; key_t key; char *shm, *s; key = 5678; if (shmid = shmget(key,SHMSZ,IPC_CREAT|0666) 0) perror(“shmget“); ex

14、it(1); if (shm = shmat(shmid,NULL,0)=(char *)-1) perror(“shmat“); exit(1); s = shm; for (c = a; c = z; c+)*s+ = c; *s = NULL; while (*shm != *)sleep(1);exit(0);,Example: IPC using shared memory,shm_client.c /* shm-client - client program to demonstrate shared memory. */ #include #include #include #include #define SHMSZ 27 main() int shmid;key_t key;char *shm, *s;key = 5678; if (shmid = shmget(key, SHMSZ, 0666) 0) perror(“shmget“); exit(1); if (shm = shmat(shmid, NULL, 0) = (char *) -1) perror(“shmat“); exit(1); for (s = shm; *s != NULL; s+)putchar(*s); putchar(n); *shm = *;exit(0); ,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 职业教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号