android 分区layout以及虚拟内存布局-小结
摘要
簡述啟動過程的內(nèi)存分配,各個映像的燒寫,加載,logo的刷新,文件系統(tǒng)mount。
DRAM:外部RAM;
ISRAM:內(nèi)部RAM(128K),(PL會跑在ISRAM里面,去初始化DRAM,loadub映像到DRAM);
目錄
1概述-分區(qū)layout以及虛擬內(nèi)存布局
一概述
首先了解mt6573nand flash的16分區(qū)結(jié)構(gòu):如下
| 1.preloader: | 下載和程序啟動引導(dǎo),初始化EMI和PLL... |
| 2.DSP_BL | modem+dsp |
| 3.NVRAM | 是一個yaffs2的文件系統(tǒng),保存硬件相關(guān)信息,如校準參數(shù),MAC地址和IMEI--開機之后生成 |
| 4.SECCFG | 保留安全平臺配置參數(shù) |
| 5.UBOOT | 處理大多數(shù)硬件初始化和linux內(nèi)核的調(diào)試-引導(dǎo)進入不同的開機模式(Meta,facorymode,normal,recover) |
| 6.BOOTIMG | 內(nèi)核和ramdiskfile的根文件系統(tǒng)打包在一起了(還有factory/adb/meta),是編譯生成boot.img來燒錄的 |
| 7.RECOVERY | 是恢復(fù)模式鏡像區(qū),和boot類似。 |
| 8.SEC_RO | 安全區(qū)域 |
| 9.MISC | 保存設(shè)備配置信息:CID(Carrier or Region ID),USB和其它硬件設(shè)備配置信息 |
| 10.LOGO | 開機logo區(qū)域 |
| 11.EXPDB | kernelpanic debug調(diào)試信息 |
| 12.ANDROID | 是一個yaffs2的文件系統(tǒng),這里有/system/bin和/system/sbin保存很多系統(tǒng)命令。它是由編譯出來的system.img來燒入.system系統(tǒng)分區(qū),啟動后此鏡像掛載在根目錄下的system文件夾中,包含了所有主要的android系統(tǒng)文件。 |
| 13.CACHE | 是一個yaffs2文件系統(tǒng),它將掛載到/cache目錄下,看一般解釋,這里主要用升級的緩存,內(nèi)容由運行而定. |
| 14.USRDATA | 是一個yaffs2文件系統(tǒng),它將掛載到/data目錄下,它是由編譯出來的userdata.img來燒入是用戶安裝的軟件以及各種數(shù)據(jù),掛載為/data目錄,用戶自行安裝的軟件都在此。將會被掛接到/data下,包含了所有應(yīng)用相關(guān)的配置文件,以及用戶相關(guān)的數(shù)據(jù)nvram等參數(shù). |
| 15.BMTPOOL | 壞塊管理 |
EMMC分區(qū)信息:
| 1.preloader: | 下載和程序啟動引導(dǎo),初始化EMI和PLL…; RAW |
| 2.DSP_BL | modem+dsp---RAW |
| 3.MBR | 主引導(dǎo)記錄;定義在mediatek/source/misc/ |
| 4.EBR1 | 擴展分區(qū)1:存放NVRAM,ub,RECOVERY,android等定義在mediatek/source/misc/ |
| x.EBR2 | 擴展分區(qū)2:也可以存放其他映像,取決與分區(qū)需要,如:EBR1放raw類型的映像;EBR2放文件系統(tǒng)類型的映像。 定義在mediatek/source/misc/ |
| 5.NVRAM | 是一個yaffs的文件系統(tǒng),保存硬件相關(guān)信息,如校準參數(shù),MAC地址和IMEI---開機之后生成 |
| 6.UBOOT | 處理大多數(shù)硬件初始化和linux內(nèi)核的調(diào)試-引導(dǎo)進入不同的開機模式(Meta,facorymode,normal,recover) |
| 7.BOOTIMG | 內(nèi)核和ramdiskfile的根文件系統(tǒng)打包在一起了(還有factory/adb/meta),是編譯生成boot.img來燒錄的 |
| 8.RECOVERY | 是恢復(fù)模式鏡像區(qū),和boot類似。RAW |
| 9.SEC_RO | 安全區(qū)域--RAW |
| 10.MISC | 保存設(shè)備配置信息:CID(Carrier or Region ID),USB和其它硬件設(shè)備配置信息;RAW |
| 11.LOGO | 開機logo區(qū)域-RAW |
| 12.EXPDB | kernelpanic debug調(diào)試信息 |
| 13.ANDROID | 是一個ext4的文件系統(tǒng),這里有/system/bin和/system/sbin保存很多系統(tǒng)命令。它是由編譯出來的system.img來燒入.system系統(tǒng)分區(qū),啟動后此鏡像掛載在根目錄下的system文件夾中,包含了所有主要的android系統(tǒng)文件。 |
| 14.CACHE | 是一個ext4文件系統(tǒng),它將掛載到/cache目錄下,看一般解釋,這里主要用升級的緩存,內(nèi)容由運行而定. |
| 15.USRDATA | 是一個ext4文件系統(tǒng),它將掛載到/data目錄下,它是由編譯出來的userdata.img來燒入是用戶安裝的軟件以及各種數(shù)據(jù),掛載為/data目錄,用戶自行安裝的軟件都在此。將會被掛接到/data下,包含了所有應(yīng)用相關(guān)的配置文件,以及用戶相關(guān)的數(shù)據(jù),nvram等. |
| 16.BMTPOOL | 壞塊管理 |
1.1NAND flash信息
MT6573_BIN文件,包括以下一些文件,如果沒有,請打開ProjectConfig.mk里面對應(yīng)的開關(guān)。
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分區(qū)大小等信息
或者: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"
分區(qū)設(shè)備節(jié)點:
#cat?/proc/partitions----->注意這里面顯示的分區(qū)索引:與PartInfo定義的一致,所以看不到全部的分區(qū)信息
#ls /dev/block/ ----->mtdblock13-0
sys信息:
cd/sys/block/只是鏈接文件
#ls-l
mtdblock0-> ../devices/virtual/mtd/mtd0/mtdblock0----真正的文件位置
1.2虛擬內(nèi)核內(nèi)存布局
1)布局:查看log(A100P為例4Gb+2Gb)
log:(A100p)4Gb+2Gb(256MB)
[ 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)
| 內(nèi)核空間 | address | size | 描述 |
| 機器映射 | 0xFfff8000-0xffffffff |
| copy_user_page/ clear_user_page use. ForSA11xx and Xscale, this is used to setupa minicache mapping。 使用,對于SA11XX和Xscal,它用于設(shè)置機器映射。 |
| 保留 | 0xFfff1000-0xffff7fff |
| Reserved.保留,ARM平臺一定不使用這個區(qū)間。 Platformsmust not use this address range. |
| vector | 0xffff0000- 0xffff1000 | 4kB | 如果CPU支持向量重定向(控制寄存器的V位),則CPU中斷向量被映射到這里。 |
| fixmap | 0xfff00000- 0xfffe0000 | 896kB | 固定映射區(qū),用來分配大頁內(nèi)存 |
| DMA | 0xffc00000- 0xffe00000 | 2MB | DMA內(nèi)存映射區(qū)間。由dma_ammoc_xxx系列函數(shù)返回的內(nèi)存會動態(tài)的映射到這里。(PS:最終還會到lowmem分配實際的物理內(nèi)存) |
| DMAreserve | 0xff000000--0xffbfffff |
| Reservedfor future expansion of DMA mapping region. 保留,用于以后的DMA擴展映射區(qū)間。 PS:用作PMEM+VMEMandroid+FB,實際映射了物理內(nèi)存。 |
| Platformreserver | 0xf0000001-0xfeffffff |
| Free forplatform use, recommended.用作其他硬件IO映射 VMALLOC_ENDmust be aligned to a 2MB boundary. VMALLOC_END必須在2MB的邊界上對齊。 |
| vmalloc | 0xcf800000- 0xf0000000 | 520MB | 虛擬內(nèi)存申請的地址范圍,實際大小 VMALLOC_END=0xf0000000must be aligned to a 2MB boundary. VMALLOC_END必須在2MB的邊界上對齊。 |
| lowmem | 0xC0000000- 0xcf500000 | 245MB | 直接物理內(nèi)存映射區(qū),它映射平臺的RAM,通常所有的平臺都使用1:1的映射關(guān)系。這里是245MB。大小=總物理內(nèi)存大小減去其他分區(qū)總和。 0xC0000000也就是PAGE_OFFSET內(nèi)核鏡像起始虛擬地址。 |
| modules | 0xbf000000- 0xc0000000 | 16MB | 內(nèi)核模塊空間,內(nèi)核模塊通過insmod命令加載,會動態(tài)的映射到這里。 |
| .init | 0xc0008000- 0xc0034000 | 176kB | 內(nèi)核映像(系統(tǒng)啟動過程中以__init宏標識的函數(shù)占用的空間被vmlinux.lds標識為__init_begin__init_end啟動init進程前被釋放掉)init函數(shù)的init段,內(nèi)核映像的虛擬起始地址:0xc0008000 |
| .text | 0xc0034000- 0xc05d1000 | 5748kB | 內(nèi)核映像(同上) text函數(shù)的代碼段 |
| .data | 0xc05d2000- 0xc06108c0 | 251kB | 內(nèi)核映像(同上) data函數(shù)的數(shù)據(jù)段 內(nèi)核映像的虛擬結(jié)束地址0xc06108c0大小:6175KB |
| 用戶空間 | 0x00001000-0x0xc0000000 | 3G | 用戶進程空間 |
|
| 0x00000000 -0x00000fff |
| CPU向量表,NULL指針陷井 不支持向量重映射的CPU的向量表被映射到這里。用戶空間和內(nèi)核態(tài)的NULL指針引通過這個映射可以被捕獲。 |
地址劃分,定義在/arch/arm/include/asm/memory.h
------首先明確物理內(nèi)存的起始地址:
Memory.h(trunk\mediatek\platform\mt6575\kernel\core\include\mach):
#definePHYS_OFFSET 0x00A00000 2G
#definePHYS_OFFSET 0x01600000 3G
------lowmem:就是linux最終可支配的物理內(nèi)存大小。
2)為什么是可用RAM空間245MB?
PS:240348+10532k保留空間=245MB這個就是linux計算出來的總內(nèi)存大小,盡管我們有256MB,剩余的11MB(11264KB)呢?
請看以下物理內(nèi)存的分配(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
組成:
-------FB:RESERVED_MEM_SIZE_FOR_FB?0x100000 =1MB
fbdev->fb_pa_base = 0xff00000, fbdev->fb_va_base = cfa00000
-------PMEM:RESERVED_MEM_SIZE_FOR_PMEM?0x0 =0MB
start:0xff00000 size: 0x0
-------modem:RESERVED_MEM_MODEM?0xa00000==10MB
FB+PMEM+modem=11MB
3)linux內(nèi)存空間消耗分配情況簡述,也就是說lowmem245MB(250880KB)又是如何分配的呢:
第一部分是:內(nèi)核映像占據(jù)的空間,起始地址就為0xc0008000大小是6175KB。這里面內(nèi)核本身不會被釋放,也就是還占用。
第二部分是:其他映射區(qū),(4+896)kB+2048KB(2MBDMA)=2948KB。
第三部分是:保留內(nèi)存,大小:10532KB;作用:包括linux內(nèi)核占用的代碼數(shù)據(jù)段空間,initrd占用的空間以及一些平臺相關(guān)的內(nèi)存(boot的時候參數(shù),系統(tǒng)管理內(nèi)存的頁表占用空間等等)。
系統(tǒng)啟動完成之后,Freeinginit memory:Init.c(trunk\kernel\arch\arm\mm):void free_initmem(void)
在這里會釋放了176KB。
如A100P(4Gb(521MB)+4Gb(512MB))
1)查看整體內(nèi)存使用情況
#cat/proc/meminfo
為何大于240348kB,多了764kB?如上面所言,系統(tǒng)啟動完成之后,會從保留內(nèi)存10532KB釋放部分內(nèi)存留給系統(tǒng)用。釋放那些呢?
包括:.init,initrd(也就是根文件系統(tǒng)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)內(nèi)存初始化
Init.c(trunk\kernel\arch\arm\mm):
mem_init()----》
總結(jié)
以上是生活随笔為你收集整理的android 分区layout以及虚拟内存布局-小结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 好的产品经理是怎样炼成的?
- 下一篇: MTK平台缩写