资源描述:
《linux x86内存管理学习总结》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Linux(x86)内存管理学习总结吴发松2012.6.15硬件基础(x86)•8个通用寄存器–EAX,EBX,ECX,EDX,EBP,ESP,ESI,EDI–AX,BX,CX,DX,BP,SP,SI,DI–AH,BH,CH,DH/AL,BL,CL,DL•6个16位的段寄存器–CS,DS,SS,ES,FS,GS•指令指针寄存器和标志寄存器–EIP–EFLAGS•控制寄存器–CR0:机器状态字–CR1:intel保留–CR2:页故障地址–CR3:页目录地址•系统地址寄存器–全局描述符表寄存器–中断描述符表寄存器–局部描述符表寄存器–任务状态寄存器
2、•其它–调试寄存器–测试寄存器地址的转换•相关概念–虚拟地址–线性地址–物理地址•实模式下的地址转换–段地址:段内偏移•保护模式下的地址转换–MMU把虚拟地址转换成物理地址分段机制•作用:把虚拟地址转换成线性地址•段描述符表–全局描述符表–中断描述符表–局部描述符表•段描述符(8字节)–段基地址:32位–段界限:20位–段属性:12位•段选择符分页机制•作用:把线性地址转换成物理地址•页的大小:4k•页表–物理页面基地址–页的属性•页表项–用低12位表示页的属性(4k=2∧12),则32位的页表项恰好可以表示页的映射关系下级页表或物理页面的基地
3、址属性多级页表•如果不分级,则:–4GB的线性地址空间可以划分为1M个4KB大小的页;即,页表中有1M个页表项。•二级页表:–即把1M个页表项组成的“大”页表,划分成1K个“小”页表,每个表中有1K个页表项。–这样32位的线性地址就被划分成如下结构:页目录页页内偏移•n级页表:–以此类推线性地址到物理地址的转换•二级页表:扩展分页•页的大小为4M•32位的线性地址划分为:–目录域:高10位–页内偏移:低22位Linux的分页机制(2.4.x)•三级分页–页目录–中间目录–页表虚拟地址空间•相关概念–虚拟内存:32位系统上,每个进程都拥有4GB的
4、虚拟地址空间–内核空间:0xC0000000~0xFFFFFFFF–用户空间:0x00000000~0xBFFFFFFF内核空间到物理内存的映射•从物理地址0x00000000开始映射•物理地址和虚拟地址之间有一个偏移:PAGE_OFFSETLinux对物理内存的描述•UMA和NUMA–UMA的重要特征:整个物理内存都是均匀的,CPU访问这个空间中的任何地址所需要的时间都相同。•存储节点–访问时间相同的存储空间叫一个“存储节点”•页面的数据结构–系统在初始化阶段根据系统的内存大小建立一个page结构的数组mem_map,数组的下标就是内存中物理
5、页面的序号•内核的内存管理区Zone–ZONE_DMA(<16M):专供DMA使用–ZONE_NORMAL(16M~896M)–ZONE_HIGHMEM(>896M):高端内存区理解内核的高端内存区•内核在0xc0000000~0xffffffff,大小为1G的逻辑地址空间内运行,但真正的物理内存可能大于1G,即,不可以把所有的内核地址空间按“逻辑地址=物理地址+0xc0000000”的方式简单的和物理地址建立映射,因为那样的话,内核将无法访问超过1G的物理内存。•X86的解决方法是把内核的地址空间划分为3个区,即:–ZONE_DMA16M–Z
6、ONE_NORMAL16~896M–ZONE_HIGHMEM896M~1G•前两个区和物理地址建立简单的映射关系:“逻辑地址=物理地址+0xc0000000”•ZONE_HIGHMEM区128M的地址空间则“预留”出来,以便根据需要用它来映射896M以上的物理内存,达到“内核可以访问所有物理内存”的目的。•可以这样理解:“高端内存”不仅仅是内核逻辑地址空间中的概念,也确实是对应着物理内存中的高端内存。Linux高端内存区的划分•内核将高端内存划分为3部分,对应3种不同的映射方式:–非连续映射区:VMALLOC_START~VMALLOC_END
7、–永久内核映射区:PKMAP_BASE~FIXADDR_START–临时映射区:FIXADDR_START~4G永久内核映射•使用一个专门页表,pkmap_page_table–Pte_t*pkmap_page_table;•大小为LAST_PKMAP,通常为4M–#ifdefCONFIG_X86_PAE–#defineLAST_PKMAP512–#else–#defineLAST_PKMAP1024–#endif•映射的线性地址从PKMAP_BASE(0xfe000000)开始•Kmap()/kunmap()临时内核映射•Km_type•每个
8、cpu占用一块这样的空间•每个cpu占用的空间又被划分为多个小空间,每个小空间的大小为1个page•使用每个cpu数据的原因,是为了提高系统性能:–减