The bootloader passes memory layout profile to kernel via tag pmap.
The address/size of TAG/Kernel/Ramdisk are decided by macros in
lk/target/m805_893x_evm/rule.mk:
BASE_ADDR := 0x80000000
MEMBASE := 0x82000000
MEMSIZE := 0x01000000 //16MB
TAGS_ADDR := BASE_ADDR+0x00000100
KERNEL_ADDR := BASE_ADDR+0x00008000
RAMDISK_ADDR := BASE_ADDR+0x01000000
The log shows:
name = pmem, base = 0x82000000, size = 0x0
name = ump_reserved, base = 0x82000000, size = 0x1b00000
name = fb_wmixer, base = 0x83b00000, size = 0x400000
name = ram_console, base = 0x83f00000, size = 0x100000
name = secured_inbuff, base = 0x84000000, size = 0x0
name = overlay, base = 0x84000000, size = 0x1800000
name = overlay1, base = 0x85800000, size = 0x1000000
name = overlay_rot, base = 0x86800000, size = 0x400000
name = video, base = 0x86c00000, size = 0x3e00000
name = viqe, base = 0x8aa00000, size = 0x1500000
name = ext_camera, base = 0x8bf00000, size = 0x0
name = fb_video, base = 0x8bf00000, size = 0x2000000
name = fb_scale, base = 0x8df00000, size = 0x0
name = fb_scale0, base = 0x8df00000, size = 0x0
name = fb_scale1, base = 0x8df00000, size = 0x0
name = fb_g2d0, base = 0x8df00000, size = 0x0
name = fb_g2d1, base = 0x8df00000, size = 0x0
name = video_dual, base = 0x8df00000, size = 0x0
name = jpeg_header, base = 0x8aa00000, size = 0x100000
name = jpeg_raw, base = 0x8b000000, size = 0xf00000
name = jpeg_stream, base = 0x8ab00000, size = 0x500000
name = nand_mem, base = 0x8df00000, size = 0x100000
name = jpg_enc_dxb, base = 0x8e000000, size = 0x300000
name = jpg_raw_dxb, base = 0x8e300000, size = 0x300000
name = video_ext, base = 0x8e600000, size = 0x0
name = total, base = 0x82000000, size = 0xc600000
booting linux @ 0x80008000, ramdisk @ 0x81000000 (1784625)
According to the log info, together with the official spec, we can get the system memory layout like this:
Physical/Virtual address |
description |
size |
comment |
||
80000100 - 80007FFF / c0000100 - c0007FFF | ATAG | 32KB | |||
80008000 - / c0008000 - | Kernel Image | about 4-5 MB | |||
81000000 - / c1000000 - | ramdisk (initramfs) | about 600KB | |||
80000000 - 82000000 / c0000000 - c20000000 | Kernel / User | 32MB | |||
82000000 - 83b00000 / c2000000 - c3b00000 | UMP | 27MB | contiguous physical memory for dedicated UMP |
||
83b00000 - 83f00000 / c3b00000 - c3f00000 | FB WMIXER | 4MB | |||
83f00000 - 84000000 / c3f00000 - c4000000 | RAM console | 1MB | |||
84000000 - 86c00000 / c4000000 - c6c00000 | Overlay | 44MB | |||
86c00000 - 8aa00000 / c6c00000 - caa00000 | Video | 62MB | |||
8aa00000 - 8bf00000 / caa00000 - cbf00000 | VIQE / JPEC decoder | 21MB | |||
8bf00000 - 8df00000 / cbf00000 - cdf00000 | FB_Video | 32MB | Frame buffer | ||
8df00000 - 8e000000 / cdf00000 -ce000000 | NAND | 1MB | |||
8e000000 - 8e600000 / ce000000 - ce600000 | JPEG encoder/capture | 6MB | |||
8e600000 - c0000000 / ce600000 - FFFFFFFF | Kernel / User | 794MB | Max mali heap size is 750MB; Max UMP heap size is 64MB |
||
__phys_to_virt(x) (x) - PHYS_OFFSET + PAGE_OFFSET
PAGE_OFFSET = 0xC0000000;
PHYS_OFFSET = 0x80000000;
As we can see, the virtual address space, from 0xc2000000 t0 0xce600000 (198MB), is reserved for specific 8935 hardware blocks, like VIQE, FB, and so forth.
The virtual address spaces, from 0xc0000000 t0 0xc2000000 and from 0xce600000 - 0xFFFFFFFF (total 826MB) is used by ATAG / Kimage / ramdisk /kernel.
NOTE: 198 + 826 = 1024MB (on-board DDR3)
The details of kernel memory space looks like below:
[ 0.000000] PAGE_OFFSET = 0xc0000000
[ 0.000000] TASK_SIZE = 0xbf000000
[ 0.000000] PHYS_OFFSET = 0x80000000
[ 0.000000] VMALLOC_START = 0xe0800000
[ 0.000000] VMALLOC_OFFSET = 0x800000
[ 0.000000] VMALLOC_END = 0xf0000000
[ 0.000000] MODULES_VADDR = 0xbf000000
[ 0.000000] MODULES_END = 0xbfe00000
[ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
[ 0.000000] DMA : 0xff600000 - 0xffe00000 ( 8 MB)
[ 0.000000] vmalloc : 0xe0800000 - 0xf0000000 ( 248 MB)
[ 0.000000] lowmem : 0xc0000000 - 0xe0000000 ( 512 MB)
[ 0.000000] pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB)
[ 0.000000] modules : 0xbf000000 - 0xbfe00000 ( 14 MB)
[ 0.000000] .text : 0xc0008000 - 0xc0595f80 (5688 kB) //Start of the kernel image
[ 0.000000] .init : 0xc0596000 - 0xc05c36c0 ( 182 kB)
[ 0.000000] .data : 0xc05c4000 - 0xc0786b60 (1803 kB)
[ 0.000000] .bss : 0xc0786b84 - 0xc08fa5a0 (1487 kB)