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)
解析特定硬件配置下的Linux内核内存布局
本文详细分析了基于M805_893x EVM板的Linux内核启动过程中的内存布局,包括物理地址、虚拟地址、内存大小及用途等关键信息。通过官方规格和日志信息,揭示了系统内存如何被划分为不同部分,如ATAG、Kernel Image、ramdisk、UMP、FBWMIXER等,并提供了详细的内存分配和使用情况。
2146

被折叠的 条评论
为什么被折叠?



