zoukankan      html  css  js  c++  java
  • android 分区layout以及虚拟内存布局-小结

    摘要

    简述启动过程的内存分配,各个映像的烧写,加载,logo的刷新,文件系统mount

    DRAM:外部RAM

    ISRAM:内部RAM128K),(PL会跑在ISRAM里面,去初始化DRAMloadub映像到DRAM);


    目录

    1概述-分区layout以及虚拟内存布局

    一概述

    首先了解mt6573nand flash16分区结构:如下

    1.preloader:

    下载和程序启动引导,初始化EMIPLL...

    2.DSP_BL

    modem+dsp

    3.NVRAM

    是一个yaffs2的文件系统,保存硬件相关信息,如校准参数,MAC地址和IMEI--开机之后生成

    4.SECCFG

    保留安全平台配置参数

    5.UBOOT

    处理大多数硬件初始化和linux内核的调试-引导进入不同的开机模式(Meta,facorymodenormal,recover)

    6.BOOTIMG

    内核和ramdiskfile的根文件系统打包在一起了(还有factory/adb/meta),是编译生成boot.img来烧录的

    7.RECOVERY

    是恢复模式镜像区,和boot类似。

    8.SEC_RO

    安全区域

    9.MISC

    保存设备配置信息:CID(Carrier or Region ID),USB和其它硬件设备配置信息

    10.LOGO

    开机logo区域

    11.EXPDB

    kernelpanic debug调试信息

    12.ANDROID

    是一个yaffs2的文件系统,这里有/system/bin/system/sbin保存很多系统命令。它是由编译出来的system.img来烧入.system系统分区,启动后此镜像挂载在根目录下的system文件夹中,包含了所有主要的android系统文件。

    13.CACHE

    是一个yaffs2文件系统,它将挂载到/cache目录下,看一般解释,这里主要用升级的缓存,内容由运行而定.

    14.USRDATA

    是一个yaffs2文件系统,它将挂载到/data目录下,它是由编译出来的userdata.img来烧入是用户安装的软件以及各种数据,挂载为/data目录,用户自行安装的软件都在此。将会被挂接到/data下,包含了所有应用相关的配置文件,以及用户相关的数据nvram等参数.

    15.BMTPOOL

    坏块管理

    EMMC分区信息:


    1.preloader:

    下载和程序启动引导,初始化EMIPLL…; RAW

    2.DSP_BL

    modem+dsp---RAW

    3.MBR

    主引导记录;定义在mediatek/source/misc/

    4.EBR1

    扩展分区1:存放NVRAMubRECOVERYandroid等定义在mediatek/source/misc/

    x.EBR2

    扩展分区2:也可以存放其他映像,取决与分区需要,如:EBR1raw类型的映像;EBR2放文件系统类型的映像。

    定义在mediatek/source/misc/

    5.NVRAM

    是一个yaffs的文件系统,保存硬件相关信息,如校准参数,MAC地址和IMEI---开机之后生成

    6.UBOOT

    处理大多数硬件初始化和linux内核的调试-引导进入不同的开机模式(Meta,facorymodenormal,recover)

    7.BOOTIMG

    内核和ramdiskfile的根文件系统打包在一起了(还有factory/adb/meta),是编译生成boot.img来烧录的

    8.RECOVERY

    是恢复模式镜像区,和boot类似。RAW

    9.SEC_RO

    安全区域--RAW

    10.MISC

    保存设备配置信息:CID(Carrier or Region ID),USB和其它硬件设备配置信息;RAW

    11.LOGO

    开机logo区域-RAW

    12.EXPDB

    kernelpanic debug调试信息

    13.ANDROID

    是一个ext4的文件系统,这里有/system/bin/system/sbin保存很多系统命令。它是由编译出来的system.img来烧入.system系统分区,启动后此镜像挂载在根目录下的system文件夹中,包含了所有主要的android系统文件。

    14.CACHE

    是一个ext4文件系统,它将挂载到/cache目录下,看一般解释,这里主要用升级的缓存,内容由运行而定.

    15.USRDATA

    是一个ext4文件系统,它将挂载到/data目录下,它是由编译出来的userdata.img来烧入是用户安装的软件以及各种数据,挂载为/data目录,用户自行安装的软件都在此。将会被挂接到/data下,包含了所有应用相关的配置文件,以及用户相关的数据,nvram.

    16.BMTPOOL

    坏块管理


    1.1NAND flash信息

    MT6573_BIN文件,包括以下一些文件,如果没有,请打开ProjectConfig.mk里面对应的开关。
    boot.img
    DSP_BL
    logo.bin 
    MT6573_Android_scatter.txt
    preloader_XXX_gb.bin
    recovery.img
    secro.img
    system.img
    uboot_XXX_gb.bin
    userdata.img



    命令:#cat/proc/mtd----->查看NAND分区大小等信息

    或者:cat emmc

    A1000

    root@android:/proc# cat emmc

    partno: start_sect nr_sects partition_name

    emmc_p1:00000020 00000002 "ebr1"

    emmc_p2:0000ac40 00002800 "sec_ro"

    emmc_p3:00010740 000c0000 "android"

    emmc_p4:000d0f40 000d6800 "cache"

    emmc_p5:001a7f40 0018f800 "usrdata"

    emmc_p6:00337f40 004039c0 "fat"

    分区设备节点:

    #cat /proc/partitions----->注意这里面显示的分区索引:与PartInfo定义的一致,所以看不到全部的分区信息

    #ls /dev/block/ ----->mtdblock13-0

    sys信息:

    cd/sys/block/只是链接文件

    #ls-l

    mtdblock0-> ../devices/virtual/mtd/mtd0/mtdblock0----真正的文件位置




    1.2虚拟内核内存布局

    1)布局:查看logA100P为例4Gb+2Gb

    log:(A100p4Gb+2Gb256MB

    [ 0.000000] Memory: 240348k/240348k available,10532k reserved,0K highmem:

    [ 0.000000] Virtual kernel memory layout:

    [ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)

    [ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)

    [ 0.000000] DMA : 0xffc00000 - 0xffe00000 ( 2 MB)

    [ 0.000000] vmalloc : 0xcf800000 - 0xf0000000 ( 520 MB)

    [ 0.000000] lowmem : 0Xc0000000 - 0xcf500000 ( 245 MB)

    [ 0.000000] modules : 0xbf000000 - 0xc0000000 ( 16 MB)

    [ 0.000000] .init : 0xc0008000 - 0xc0034000 ( 176 kB)

    [ 0.000000] .text : 0xc0034000 - 0xc05d1000 (5748 kB)

    [ 0.000000] .data : 0xc05d2000 - 0xc06108c0 ( 251 kB)


    内核空间

    address

    size

    描述

    机器映射

    0xFfff8000-0xffffffff


    copy_user_page/ clear_user_page use.

    ForSA11xx and Xscale, this is used to

    setupa minicache mapping

    使用,对于SA11XXXscal,它用于设置机器映射。

    保留

    0xFfff1000-0xffff7fff


    Reserved.保留,ARM平台一定不使用这个区间。

    Platformsmust not use this address range.

    vector

    0xffff0000- 0xffff1000

    4kB

    如果CPU支持向量重定向(控制寄存器的V位),则CPU中断向量被映射到这里。

    fixmap

    0xfff00000- 0xfffe0000

    896kB

    固定映射区,用来分配大页内存

    DMA

    0xffc00000- 0xffe00000

    2MB

    DMA内存映射区间。由dma_ammoc_xxx系列函数返回的内存会动态的映射到这里。PS:最终还会到lowmem分配实际的物理内存)

    DMAreserve

    0xff000000--0xffbfffff


    Reservedfor future expansion of DMA mapping region.

    保留,用于以后的DMA扩展映射区间。

    PS:用作PMEM+VMEMandroid+FB,实际映射了物理内存。

    Platformreserver

    0xf0000001-0xfeffffff


    Free forplatform use, recommended.用作其他硬件IO映射

    VMALLOC_ENDmust be aligned to a 2MB boundary.

    VMALLOC_END必须在2MB的边界上对齐。

    vmalloc

    0xcf800000- 0xf0000000

    520MB

    虚拟内存申请的地址范围,实际大小

    VMALLOC_END=0xf0000000must be aligned to a 2MB boundary.

    VMALLOC_END必须在2MB的边界上对齐。

    lowmem

    0xC0000000- 0xcf500000

    245MB

    直接物理内存映射区,它映射平台的RAM,通常所有的平台都使用11的映射关系。这里是245MB。大小=总物理内存大小减去其他分区总和。

    0xC0000000也就是PAGE_OFFSET内核镜像起始虚拟地址。

    modules

    0xbf000000- 0xc0000000

    16MB

    内核模块空间,内核模块通过insmod命令加载,会动态的映射到这里。

    .init

    0xc0008000- 0xc0034000

    176kB

    内核映像(系统启动过程中以__init宏标识的函数占用的空间被vmlinux.lds标识为__init_begin__init_end启动init进程前被释放掉)init函数的init段,内核映像的虚拟起始地址:0xc0008000

    .text

    0xc0034000- 0xc05d1000

    5748kB

    内核映像(同上) text函数的代码段

    .data

    0xc05d2000- 0xc06108c0

    251kB

    内核映像(同上) data函数的数据段 内核映像的虚拟结束地址0xc06108c0大小:6175KB

    用户空间

    0x00001000-0x0xc0000000

    3G

    用户进程空间


    0x00000000 -0x00000fff


    CPU向量表,NULL指针陷井

    不支持向量重映射的CPU的向量表被映射到这里。用户空间和内核态的NULL指针引通过这个映射可以被捕获。 

    地址划分,定义在/arch/arm/include/asm/memory.h

    ------首先明确物理内存的起始地址:

    Memory.h(trunkmediatekplatformmt6575kernelcoreincludemach):

    #definePHYS_OFFSET 0x00A00000 2G

    #definePHYS_OFFSET 0x01600000 3G


    ------lowmem:就是linux最终可支配的物理内存大小。



    2)为什么是可用RAM空间245MB

    PS240348+10532k保留空间=245MB这个就是linux计算出来的总内存大小,尽管我们有256MB,剩余的11MB11264KB)呢?

    请看以下物理内存的分配(MTK默认配置,实际上请看代码里面的配置):


    log:(mt6575_dev.c

    [ 1.678067] PMEM start: 0xff00000 size: 0x0

    [ 1.678925] android_pmem: probe of android_pmem.1 failed with error-1

    [ 1.679754] VMEM start: 0xff00000 size: 0x0

    组成:

    -------FBRESERVED_MEM_SIZE_FOR_FB 0x100000 =1MB

    fbdev->fb_pa_base = 0xff00000, fbdev->fb_va_base = cfa00000

    -------PMEMRESERVED_MEM_SIZE_FOR_PMEM 0x0 =0MB

    start:0xff00000 size: 0x0

    -------modem:RESERVED_MEM_MODEM 0xa00000==10MB


    FB+PMEM+modem=11MB


    3linux内存空间消耗分配情况简述,也就是说lowmem245MB(250880KB)又是如何分配的呢:

    第一部分是:内核映像占据的空间,起始地址就为0xc0008000大小是6175KB。这里面内核本身不会被释放,也就是还占用。

    第二部分是:其他映射区,(4+896kB+2048KB2MBDMA=2948KB

    第三部分是:保留内存,大小:10532KB;作用:包括linux内核占用的代码数据段空间,initrd占用的空间以及一些平台相关的内存(boot的时候参数,系统管理内存的页表占用空间等等)。

    系统启动完成之后,Freeinginit memoryInit.c(trunkkernelarcharmmm):void free_initmem(void)

    在这里会释放了176KB


    A100P4Gb521MB+4Gb512MB))

    1)查看整体内存使用情况

    #cat/proc/meminfo

    为何大于240348kB多了764kB?如上面所言,系统启动完成之后,会从保留内存10532KB释放部分内存留给系统用。释放那些呢?

    包括:.initinitrd(也就是根文件系统ramdisk.img=588KB)。

    176+588=764kB

    MemTotal: 241112 kB

    MemFree: 24688 kB

    Buffers: 0 kB

    Cached: 67936 kB

    SwapCached: 0 kB

    Active: 116160 kB

    Inactive: 51116 kB

    Active(anon): 99384 kB

    .


    VmallocTotal: 532480 kB--------520Mb

    VmallocUsed: 99508 kB

    VmallocChunk: 413700 kB

    2)查看IOMEM分配情况:

    #cat/proc/iomem


    3)查看vmallocinfo

    #cat/proc/vmallocinfo

    4)内存初始化

    Init.c(trunkkernelarcharmmm):

    mem_init()----

  • 相关阅读:
    PatentTips
    PatentTips
    PatentTips
    PatentTips
    PatentTips
    PatentTips
    PatentTips
    PatentTips
    How to build and run ARM Linux on QEMU from scratch
    How to debug Android Native Application with eclipse
  • 原文地址:https://www.cnblogs.com/liang123/p/6325494.html
Copyright © 2011-2022 走看看