这是同一块开发板运行Melis4.0系统的内存布局图:

板级的物理地址和软件系统是没有关系的,软件系统只会影响虚拟地址,现在分析Tina的地址映射过程,构造一张类似的表.
从启动开始:
首先查看编译的固件vmlinux入口地址,是链接时由链接参数指定:

编译参数:
+ arm-openwrt-linux-muslgnueabi-ld -EL -p --no-undefined -X --pic-veneer --build-id -o vmlinux -T ./arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o init/built-in.o --start-group usr/built-in.o arch/arm/vfp/built-in.o arch/arm/kernel/built-in.o arch/arm/mm/built-in.o arch/arm/common/built-in.o arch/arm/probes/built-in.o arch/arm/net/built-in.o arch/arm/crypto/built-in.o arch/arm/firmware/built-in.o arch/arm/mach-sunxi/built-in.o kernel/built-in.o certs/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o drivers/built-in.o sound/built-in.o firmware/built-in.o net/built-in.o virt/built-in.o --end-group .tmp_kallsyms2.o

以上编译通过如下命令触发:
make -C /home1/caozilong/WorkSpace/gov/tina-v83x/out/v833-perf1/compile_dir/target/linux-v833-perf1/linux-4.9.191 HOSTCFLAGS="-O2 -I/home1/caozilong/WorkSpace/gov/tina-v83x/out/host/include -I/home1/caozilong/WorkSpace/gov/tina-v83x/out/host/usr/include -Wall -Wmissing-prototypes -Wstrict-prototypes" CROSS_COMPILE="arm-openwrt-linux-muslgnueabi-" ARCH="arm" KBUILD_HAVE_NLS=no KBUILD_BUILD_USER="" KBUILD_BUILD_HOST="" CONFIG_SHELL="bash" V='' CC="arm-openwrt-linux-muslgnueabi-gcc" zImage V=1 -B -j32
当我们在入口处添加死循环指令后,发现它确实会断在这里:


CONFIG_ARM_VIRT_EXT是默认开启的,无法关闭: 
配合系统数据:
这张表是怎么来的呢?
首先按从更简单的看起


释放的位置:

DISP模块reseaved的地址范围为[0x4e3f000, 0x12c0000] ,这个地址区间比较特殊,首先是因为我们并没有在reserved列表中看到它。原因正如上面所看到的,disp_reserve_mem接口被调用了两次,第二次是释放掉了,所以才导致看不到,这片内存是用来传递bootlogo用的。
uboot的也会显示logo,为了防止内核启动过程中,logo所在内存被内核占用(导致花屏),所以保留了这块内存,但是等到显示驱动加载完毕后,这个快保留内存会被释放。
另外一个:



所以,这里添加了[0x40008200, 0x7372bc]到系统里面。
下一个:

本文详细分析了Linux在启动过程中的内存布局,特别是针对Linux reserved内存机制,包括memblock内存块记录、reserved内存的管理,以及如何通过/dev/firmware/memmap获取内存分布。此外,还探讨了在不同架构下,如X86和ARM,内存管理的差异,以及在Melis系统中的内存分配接口。最后,讨论了如何通过页表管理和页表标志来实现缓存一致性。
最低0.47元/天 解锁文章
3723





