欢迎来到天天文库
浏览记录
ID:59416609
大小:186.50 KB
页数:40页
时间:2020-09-19
《linux内核完全注释课件第十章.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux操作系统内核分析湘潭大学信息工程学院内存布局内核模块高速缓存ram主内存main_memory_startmemory_end在main.c中(P65第121行)main_memory_start的最小值可能是1Mmemory_end的最大值可能是16Mbuffer_memory_end主内存界限定义在memory.c(P335第43行)#defineLOW_MEM0x100000#definePAGING_MEMORY(15*1024*1024)#definePAGING_PAGES(
2、PAGING_MEMORY>>12)物理页面要管理物理页面,必须知道以下属性是否被分配被多少个对象共同使用存取权限(可写、只读)是否被访问过是否被修改过硬件支持,参见书P330图10-4内存管理数据结构记录下物理页面的被引用次数。0该页面还没有被分配分配次数=n该页面被分配,被n个进程使用内存管理数据结构在memory.c(P335第57行)staticunsignedcharmem_map[PAGING_PAGES]={0,};内核模块第0页1M第1页第2页第3页mem_map数组的每一个数组元
3、素记录每一页的分配次数物理页面开始地址与映射数组下标从物理页面开始地址到数组下标#defineMAP_NR(addr)(((addr)-LOW_MEM)>>12)//P335第46行从数组下标到物理页面开始地址数组下标<<12+LOW_MEM内存管理模块的接口内存管理模块中断/异常管理模块内核其它模块进程管理模块get_free_pagefree_pagecopy_page_tablesfree_page_tablespage_fault初始化模块mem_init内存管理初始化内核模块1M0000
4、00000000mem_map数组高速缓冲虚拟盘主内存10010010010010010010000000内存管理初始化定义在memory.c(P344第399行)voidmem_init(longstart_mem,longend_mem)参数:start_mem——主内存的开始位置end_mem——主内存的结束位置voidmem_init(longstart_mem,longend_mem){inti;HIGH_MEMORY=end_mem;for(i=0;i5、)mem_map[i]=USED;i=MAP_NR(start_mem);end_mem-=start_mem;end_mem>>=12;while(end_mem-->0)mem_map[i++]=0;}全局变量主内存开始页面对应的数组下标分配物理页面unsignedlongget_free_page(void)定义在memory.c(P335第63行)作用:分配一个物理页面返回:可以分配一个物理页面则返回物理页面的开始地址,否则返回0分配物理页面算法unsignedlongget_free_p6、age(void){registerunsignedlong__resasm("ax");__asm__("std;repne;scasbt""jne1ft""movb$1,1(%%edi)t""sall$12,%%ecxt""addl%2,%%ecxt""movl%%ecx,%%edxt""movl$1024,%%ecxt""leal4092(%%edx),%%edit""rep;stoslt""movl%%edx,%%eax""1:":7、"=a"(__res):"0"(0),"i"(LOW_MEM),"c"(PAGING_PAGES),"D"(mem_map+PAGING_PAGES-1));return__res;}scasb把al中的值与edi所指向的内存单元的值进行比较,比较完后根据DF标志把edi的值加1(DF=0)或减1(DF=1)010000mem_mapediedi1回收物理页面voidfree_page(unsignedlongaddr)定义在memory.c(P335第89行)作用:回收一个物理页面参数:addr8、——要回收的物理页面的开始地址voidfree_page(unsignedlongaddr){if(addr=HIGH_MEMORY)panic("tryingtofreenonexistentpage");addr-=LOW_MEM;addr>>=12;if(mem_map[addr]--)return;mem_map[addr]=0;panic("tryingtofreefreepage");}回收页面并不把页面清0,清0工作放在
5、)mem_map[i]=USED;i=MAP_NR(start_mem);end_mem-=start_mem;end_mem>>=12;while(end_mem-->0)mem_map[i++]=0;}全局变量主内存开始页面对应的数组下标分配物理页面unsignedlongget_free_page(void)定义在memory.c(P335第63行)作用:分配一个物理页面返回:可以分配一个物理页面则返回物理页面的开始地址,否则返回0分配物理页面算法unsignedlongget_free_p
6、age(void){registerunsignedlong__resasm("ax");__asm__("std;repne;scasbt""jne1ft""movb$1,1(%%edi)t""sall$12,%%ecxt""addl%2,%%ecxt""movl%%ecx,%%edxt""movl$1024,%%ecxt""leal4092(%%edx),%%edit""rep;stoslt""movl%%edx,%%eax""1:":
7、"=a"(__res):"0"(0),"i"(LOW_MEM),"c"(PAGING_PAGES),"D"(mem_map+PAGING_PAGES-1));return__res;}scasb把al中的值与edi所指向的内存单元的值进行比较,比较完后根据DF标志把edi的值加1(DF=0)或减1(DF=1)010000mem_mapediedi1回收物理页面voidfree_page(unsignedlongaddr)定义在memory.c(P335第89行)作用:回收一个物理页面参数:addr
8、——要回收的物理页面的开始地址voidfree_page(unsignedlongaddr){if(addr=HIGH_MEMORY)panic("tryingtofreenonexistentpage");addr-=LOW_MEM;addr>>=12;if(mem_map[addr]--)return;mem_map[addr]=0;panic("tryingtofreefreepage");}回收页面并不把页面清0,清0工作放在
此文档下载收益归作者所有