您的位置:首页 > 运维架构 > Linux

linux 高端内存

2015-08-12 10:55 405 查看
最近又温习了一下linux内存分配,自己逻辑地址与物理地址的映射,特别针对高端内存的理解

首先说32bit 和64 bit针对空间的划分

1 32bit 虚拟空间划分内核空间1g和用户空间4g(其实可以调整变成内核空间2g和用户空间2g)

这点要注意的是虚拟的概念和物理内存无关,只是操作系统便于管理的一种抽象,我以前总是和物理内存去做对比的理解,最后纠缠不清,精神崩溃了

2 32bit物理内存咱就4g物理内存举例子

根据分配策略,物理内存前1g和虚拟空间的内核空间相对应,offset是PAGE_OFFSET(3g)为偏移量

这就是规定,没有商量的余地,也就是内核空间和物理内存是有对应关系的,而用户空间和物理内存暂时没有对应关系,

这就引出一个问题4g物理空间,只有1g是对应起来的,那剩下的3g呢,这又引出了一个高端内存的概念,(如果物理内存只有256m,那内核内存1g空间可以完全包括这256m物理空间,所以不需要高端内存的存在,内核空间完全包含了物理内存大小)

首先无论什么时候内核空间针对物理内存的使用时必须有一个虚拟的线性地址的(内核空间也有自己的页表为了mmu统一查询,swapper_pg_dir就是页表目录,虽然位移是固定的page_offset,但是还是必须利用页表去查询),这样大于物理内存1g的空间是没法进行线性对应关系的,因为规定好了内核空间就1g,线性关系对应也只有1g空间,除非虚拟内核空间大于4g,利用page_offset可以做偏移量,但是内核空间需要用剩下的3g怎么办,必须提供一个线性地址,那就利用高端内存去做映射,也就是1g中后128m,需要注意的是也就是能映射128m物理内存,因为牵扯到内核分配,分多了也没必要,128m大家轮换使用没什么问题。但是当时我有这么个因为,虚拟用户空间的3g怎么对应内存,根据分页分段,最后pte指向的是任何范围的物理空间的物理地址,不需要线性地址的对应关系,所以多大都可以分配。

之前我一直纠结是不是虚拟的用户内存只有分配到后3g空间,其实不然,物理空间是没有1g和3g的界限的,他只有zone_DMA,ZONE_NORMAL等物理块的概念,所以不要在乎1g还是3g,只有有free的块就可以给用户空间来用

3 64bit因为逻辑内核空间和用户空间能够达到128t的空间,物理内存不可能达到这么多,所以一定会做到page_offet的线性映射,所以不需要高端内存这种东西存在。

4 物理内存分配是利用zone块去查看free_area列表去分配,可以通过 cat /proc/zoneinfo去看相应块的分布,留意start_prk_page的开始物理页的分配如4096就是16m
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: