memory:arm 分區layout以及虛擬內存佈局-小結

摘要 linux

簡述啓動過程的內存分配,各個映像的燒寫,加載,logo的刷新,文件系統mountandroid

DRAM:外部RAMc#

ISRAM:內部RAM128K),(PL會跑在ISRAM裏面,去初始化DRAMloadub映像到DRAM); 緩存


目錄 安全

1概述-分區layout以及虛擬內存佈局 app

一律述 函數

首先了解mt6573nand flash16分區結構:以下 佈局

1.preloader: this

下載和程序啓動引導,初始化EMIPLL... spa

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(trunk\mediatek\platform\mt6575\kernel\core\include\mach):

#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(trunk\kernel\arch\arm\mm):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(trunk\kernel\arch\arm\mm):

mem_init()----

相關文章
相關標籤/搜索