内存访问分为两种体系结构:一致性内存访问(UMA)和非一致性内存访问(NUMA)。NUMA指CPU对不同内存单元的访问时间可能不一样,因而这些物理内存被划分为几个节点,每个节点里的内存访问时间一致,NUMA体系结构主要存在大型机器、alpha等,嵌入式的基本都是UMA。UMA也使用了节点概念,只是永远都只有1个节点。本文讲的是UMA模型的嵌入式平台。
每个节点又将物理内存划分为3个管理区,在x86机器上管理区如下:
ZONE_DMA:0~16MB
ZONE_NORMAL:16MB~896MB
ZONE_HIGHMEM:896~末尾(对于64位,则不需要高端内存,虚拟地址足够直接映射)
在hi3536嵌入式平台上实际的使用时由于系统mem超过896M,因此有两个管理区(cat /proc/buddyinfo):
Node 0, zone Normal 33 33 14 13 33 33 11 3 4 4 166
Node 0, zone HighMem 36 10 13 5 2 2 1 1 1 2 278
每个管理区管理该内存区域内的所有页面(linux中每个页面的大小为4KB)。
以下linux物理内存组织结构标准的关系图:
在Documentation/arm/memory.txt文件中定义了arm平台的线性地址空间布局情况,其与物理内存关系图:
当用户空间和内核空间比例3:1时,PAGE_OFFSET=0xC0000000。上面橙色虚线地址是一一映射关系,而高于highmem则需要vmalloc申请使用。
PHYS_OFFSET=0x40000000
ZRELADDR == virt_to_phys(PAGE_OFFSET +TEXT_OFFSET) = virt_to_phys (TEXT_ADDR) = 0x40008000
INITRD_PHYS= 0x00800000
PARAMS_PHYS= 0x00000100
high_memory和VMALLOC_START之间保留了8M空间间隙
high_memory=PAGE_OFFSET+ highmem
当系统内存在0~896MB时,highmem=系统内存
当系统内存>896MB时,highmem=896MB,多余的内存需要vmalloc映射访问
VMALLOC_START和VMALLOC_END-1之间用于vmalloc() / ioremap() space映射。
cat /proc/vmallocinfo:
0xfb000000-0xfe190000 51970048iotable_init+0x0/0xb0 phys=10000000 ioremap
映射了CPU寄存器空间
名词解释:
ZTEXTADDR
解压代码运行的开始地址。没有物理地址和虚拟地址之分,因为此时MMU处于关闭状态。这个地址不一定时RAM的地址,可以是支持读写寻址的flash等存储中介。
ZRELADDR
内核启动在RAM中的地址。压缩的内核映像被解压到这个地址,然后执行。
__virt_to_phys(TEXTADDR) == ZRELADDR
TEXTADDR
内核启动的虚拟地址,与ZRELADDR相对应。一般内核启动的虚拟地址为RAM的第一个bank地址加上0x8000。
TEXTADDR = PAGE_OFFSET + TEXTOFFST
TEXTOFFSET
内核偏移地址。在arch/arm/makefile中设定。
PHYS_OFFSET
RAM第一个bank的物理起始地址。
PAGE_OFFSET
RAM第一个bank的虚拟起始地址。
文章来源:https://blog.csdn.net/heliangbin87/article/details/77989953