linux内核虚拟内存和物理内存的映射

内存访问分为两种体系结构:一致性内存访问(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物理内存组织结构标准的关系图:

linux内核虚拟内存和物理内存的映射_第1张图片

         在Documentation/arm/memory.txt文件中定义了arm平台的线性地址空间布局情况,其与物理内存关系图:

linux内核虚拟内存和物理内存的映射_第2张图片

         当用户空间和内核空间比例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

 

你可能感兴趣的:(Linux,内核)