《linux内存管理.ppt》由会员分享,可在线阅读,更多相关《linux内存管理.ppt(30页珍藏版)》请在人人文库网上搜索。
1、Linux Memory Management,Linux Memory Management,i386 MMU 进程的虚拟空间 内存的加锁和保护 物理空间管理 空闲物理内存管理 内核态实存的申请与释放 内核态虚存的申请与释放 页交换进程和页面换出 缺页中断和页面换入 Cache,Linux Memory Management,i386 MMU,Linux Memory Management,段选择子(selector),INDEX,TI,RPL,15,3,2,1,0,TI=0时,段选择器所标识的段描述符在全局描述符表(GDT)中 TI=1时,段描述符在局部描述符表(LDT)中 RPL:请求者。
2、拥有的特权级,分0 3级,特权级0为最高级; INDEX:段选择子所标识的段描述符在GDT或LDT中的索引地址,Linux Memory Management,段描述符格式,Linux Memory Management,G为段的粒度属性,G=0时,段的大小以字节为单位, G=1时,段的大小以4K字节为单位。,Linux Memory Management,GDT入口分配,Linux Memory Management,LDT入口分配,Linux Memory Management,控制寄存器,CR3指示页目录表的起始地址 CR0寄存器的PE位(位0)用于控制段机制。PE=1则处理器工作于保护。
3、模式下;PE=0则处理器工作于实模式下,等同于8086 CR0的PG位(位31)用于控制分页机制。PG=1则启用分页机制,32位线性地址通过页表转换为物理地址;PG=0则禁止分页机制,32位线性地址直接寻址物理地址 当PE=1且PG=0时,处理器工作于保护模式下,但禁止分页机制。此时没有内存和磁盘之间的页面交换,也就不存在虚拟内存 当PE=1且PG=1时,处理器工作于保护模式下,但启用分页机制。此时有内存和磁盘之间的页面交换,磁盘起到虚拟内存的作用 CR2指示引起缺页中断的地址,Linux Memory Management,32位线性地址,Page Directory,Page,offset。
4、,31,22,21,11,0,12,Linux Memory Management,Linux分页管理,Linux Memory Management,页目录项和页表项,页表或页帧的物理地址第31位至第12位,D,31,6,5,12,A,U/S,R/W,P,2,1,0,P=1 则地址转换有效;P=0则地址转换无效,R/W=1则该页可写,可读,且可执行;R/W=0则该页可读,可执行,但不可写,U/S=1则该页可在任何特权级下访问; U/S=0则该页只能在特权级0、1和2下访问,A:访问位,D:已写标志位,Linux Memory Management,PCB对存储空间的管理,struct mm_。
5、struct int count; pgd_t * pgd; /* 进程页目录的起始地址 */ unsigned long context; unsigned long start_code, end_code, start_data, end_data; unsigned long start_brk, brk, start_stack, start_mmap; unsigned long arg_start, arg_end, env_start, env_end; unsigned long rss, total_vm, locked_vm; unsigned long def_flag。
6、s; struct vm_area_struct * mmap; /* 指向vma双向链表的指针 */ struct vm_area_struct * mmap_avl; /* 指向vma AVL树的指针 */ struct semaphore mmap_sem; ,Linux Memory Management,虚存段vma,Linux Memory Management,一个进程的虚拟空间,Linux Memory Management,进程的虚拟空间分布,Linux Memory Management,进程的虚拟空间分布,例: #include int z = 0; /*进程的数据段中*。
7、/ int main() int *a = 0; /*进程的用户栈中*/ int pid = getpid(); if (pid = fork() /*父进程执行这里的代码*/ a = (int *) malloc(100*sizeof(int);/*父进程的堆空间,runtime data*/ z = pid; printf(“z1 = %dn”, z); else /*子进程执行的代码*/ a = ,Linux Memory Management,AVL树(Adelson-Velskii and Landis),(1000,2000),vm_avl_left,vm_avl_right,(8。
8、00,900),vm_avl_left,vm_avl_right,(350,450),vm_avl_left,vm_avl_right,(500,670),vm_avl_left,vm_avl_right,(2500,3000),vm_avl_left,vm_avl_right,Linux Memory Management,内存的加锁和保护,mm/mprotect.c,mm/mlock.c 对整个虚存段加锁或保护 对虚存段前部加锁或保护 对虚存段后部加锁或保护 对虚存段中部加锁或保护,Linux Memory Management,初始化后物理存储分布,0X001000(4K) swappe。
9、r_pg_dir 核心态访问空间的页目录 0X002000(8K) pg0 0X003000(12K) bad_pages 0X004000(16K) bad_pg_table 0X005000(20K) floppy_track_buffer 0X006000(24K) kernel_code+text FREE 0X0A0000(640K RESERVED 0X100000(1M) pg_tables(4K) swap_cache_mem mem_map bitmap FREE,0X000000(0K) Empty_Zero_Page 由mem_init初始化,Linux Memory M。
10、anagement,物理页面,typedef struct page struct page *next, *prev; /* 由于搜索算法的约定,这两项必须首先定义 */ struct inode *inode; /* 若该页帧的内容是文件,则inode和offset unsigned long offset; /* 指出文件的inode和偏移位置 */ struct page *next_hash; atomic_t count; /* 访问此页帧的进程记数,大于1表示由多个进程共享 */ unsigned flags;/* atomic flags, some possibly upda。
11、ted 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;/* 页帧在mem_map表中的下标, page-map_nr = page - mem_map */ mem_map_t; me。
12、m_map_t * mem_map = NULL; /* 页帧描述表的首地址 */,Linux Memory Management,空闲物理内存管理,bitmap表 在物理内存低端,紧跟mem_map表的bitmap表以位示图方式记录了所有物理内存的空闲状况。与mem_map一样,bitmap在系统初始化时由free_area_init()函数创建(mm/page_alloc.c)。 与一般性位图不同,bitmap表分割成NR_MEM_LISTS组(缺省值6)。 buddy算法 buddy算法分配空闲块,由_get_free_pages()和free_pages()函数执行。change_bi。
13、t()函数根据bitmap的对应组,判断回收块的前后邻居是否也为空。,Linux Memory Management,空闲物理内存管理,LINUX用free_area数组记录空闲的物理页帧 struct free_area_struct struct page *next; /* 此结构的next,prev指针与struct page匹配 */ struct page *prev; unsigned int * map; /* 指向bitmap */ ; static struct free_area_struct free_areaNR_MEM_LISTS;,Linux Memory Man。
14、agement,空闲物理内存管理,next 每1 bit对应20页 prev map next prev 每1 bit对应21页 map next prev 每1 bit对应22页 map . .,page,page,2 pages,2 pages,4 pages,4 pages,free_area,Linux Memory Management,内核态实存的申请与释放,kmalloc()和kfree() kmalloc_cache 在新版本里已经被SLAB替换 Slab: memory object(Solaris2.4) SLAB可供用户使用的函数有: kmem_cache_create(。
15、), kmem_cache_alloc(), kmalloc(), kmem_cache_free, kfree()/kfree_s(), kmem_cache_shrink(), kmem_cache_reap(),Linux Memory Management,在新版本里已经被SLAB替换,blocksize表,sizes表,Linux Memory Management,内核态虚存的申请与释放,可分配的虚拟空间在3G+high_memory+HOLE_8M以上高端,由vmlist链表管理 申请与释放(mm/vmalloc.c) vmalloc()和vfree() vmlist链表的节点类。
16、型(include/linux/vmalloc.h) struct vm_struct unsigned long flags; /* 虚拟内存块的占用标志 */ void * addr; /* 虚拟内存块的起始地址 */ unsigned long size; /* 虚拟内存块的长度 */ struct vm_struct * next; /* 下一个虚拟内存块 */ ; static struct vm_struct * vmlist = NULL;,Linux Memory Management,3G+high_memory+HOLE_8M以上高端空间,flags,size,flags,。
17、size,3G+high_memory+HOLE_8M high_memory:=896M,vmlist,Linux Memory Management,页交换进程和页面换出,内核态交换进程kswapd 一个是内核线程(kernel thread):没有虚拟存储空间,运行在内核态,直接使用物理地址空间。 它不仅能将页面换出到交换空间(交换区或交换文件),它也保证系统中有足够的空闲页面以保持存储系统高效地运行。 在系统初启时由核心态线程init创建,并等待系统交换定时器swap_tick周期性地唤醒。 系统的空闲页面不够时,kswapd依次从三条途径缩减系统使用的物理页面 缩减Page Cach。
18、e和Buffer Cache; 换出System V共享系统的内存页面; 换出或丢弃页面。,Linux Memory Management,缺页中断和页面换入,产生缺页的虚存地址(CR2)传递给内核的缺页中断服务程序 如果没有找到与缺页相对应的vm_area_struct结构,那么说明进程访问了一个非法存储区,LINUX向进程发送信号SIGSEGV 接着检测缺页时,该访问是否合法 经过以上两步检查,可以确定的确是缺页中断,Linux Memory Management,Cache,Swap Cache Swap Cache是一个页表项的列表。 被换出的页面在Swap Cache中占有一表项,该表项描述页面在交换空间中的位置。 Page Cache 文件被映射到内存中,每次读取一页,该页就保存于Page Cache中。 Buffer Cache。