博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uboot内存布局
阅读量:4070 次
发布时间:2019-05-25

本文共 3055 字,大约阅读时间需要 10 分钟。

转自:http://www.latelee.org/porting-uboot/139-u-boot-porting-memory-allocation.html

花了两天时间来专门研究u-boot的内存分布,这个图网上已经有了,但只是大致图形,没有详细、深入解析。所以自己就专门画了图,添加一些东西。

此外,还专门测试了一下u-boot下全局变量、未初始化变量等等的地址分布,也画了一张图。不过好像跟linux下进程的内存分布不太一致,估计是u-boot自己管理内存的——很明显,此时linux还不知道在哪里呢。但是,这些都不妨碍我们学习一些底层的东西。

 

这个测试就是自己编写一个自定义的命令,添加自定义命令其实很简单的,在中已经简单写了一下了。本着“够用即可”的原则,还没有深入追踪u-boot到底如何实现shell命令的——有些时候难得糊涂是很有必要的,凡事看开些总归有好处。

 

先上第一张图:

再上第二张图:

测试代码如下:

#include <common.h>
#include <command.h>
#include <malloc.h>

DECLARE_GLOBAL_DATA_PTR;

int g_foo = 100;
int g_foo_bss;
static int g_foo_static;

int do_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{

 int l_foo = 100;
 int l_foo_bss;
 static int l_foo_static;
 char *bar;
 char *hello="hello world";
 
 bar = (char*)malloc(strlen(hello) + 1);
 if (bar == NULL)
  return 1;
 strcpy(bar, hello);
 
 printf("sizeof gd:%d sizeof bd:%d\n", sizeof(gd_t), sizeof(bd_t));
 printf("gd:%08lx bd:%08lx bd->flags:%d\n",gd,gd->bd,gd->flags);
 
 printf("do_test:%p &do_test:%p\n", do_test, &do_test);
 printf("g_foo:%p g_foo_bss:%p g_foo_static:%p\n",&g_foo,&g_foo_bss,&g_foo_static);
 printf("l_foo:%p l_foo_bss:%p l_foo_static:%p\n",&l_foo,&l_foo_bss,&l_foo_static);
 printf("hello:%p bar:%s bar:%p\n", hello, bar, &bar);
 free(bar);
 return 0;
}

U_BOOT_CMD(
 gotohell, 2, 1,do_test,
 "just a test of my own",
 "nothing"
);

 

启动信息如下(有删改)

U-Boot 2010.09-svn9 (Nov 30 2010 - 09:36:08)


U-Boot code: 33F80000 -> 33F9CC64  BSS: -> 33FA1EC0
I2C:   ready
RAM Configuration:
Bank #0: 30000000 64 MiB
Flash: 8 MiB
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   dm9000
Hit any key to stop autoboot:  0
LATE2440> gotohell
sizeof gd:32 sizeof bd:28
gd:33f4ffe0 bd:33f4ffc4 bd->flags:3
do_test:33f90740 &do_test:33f90740
g_foo:33f9c59c g_foo_bss:33fa1dbc g_foo_static:33fa1dc0
l_foo:33f4fbc4 l_foo_bss:33f4fbc0 l_foo_static:33fa1dc4
hello:33f9b5e4 bar:hello world bar:33f4fbbc
LATE2440>

 

其中的“U-Boot 2010.09-svn9 ”表示在svn控制下的第9个版本(看来提交服务器不勤快啊!)

 

注:本文出现的地址肯定会根据实际情况而改变(因为u-boot映像文件大小会改变的)!但也肯定不会影响其本质!这一点,山人可以作保证。如果有心情,可以使用md来查看你想查看的内存地址的内容,对比代码,这样可以认识更深入一些。

比如,某一些查看内存是这样的:

LATE2440> md.b 33f9b62c (这个地址是hello那个地址,注意,这个地址改变了)
33f9b62c: 68 65 6c 6c 6f 20 77 6f 72 6c 64 00 73 69 7a 65    hello world.size
33f9b63c: 6f 66 20 67 64 3a 25 64 20 73 69 7a 65 6f 66 20    of gd:%d sizeof
33f9b64c: 62 64 3a 25 64 0a 00 67 64 3a 25 30 38 6c 78 20    bd:%d..gd:%08lx
33f9b65c: 62 64 3a 25 30 38 6c 78 20 62 64 2d 3e 66 6c 61    bd:%08lx bd->fla
LATE2440>
33f9b66c: 67 73 3a 25 64 0a 00 64 6f 5f 74 65 73 74 3a 25    gs:%d..do_test:%
33f9b67c: 70 20 26 64 6f 5f 74 65 73 74 3a 25 70 0a 00 67    p &do_test:%p..g
33f9b68c: 5f 66 6f 6f 3a 25 70 20 67 5f 66 6f 6f 5f 62 73    _foo:%p g_foo_bs
33f9b69c: 73 3a 25 70 20 67 5f 66 6f 6f 5f 73 74 61 74 69    s:%p g_foo_stati
LATE2440>
33f9b6ac: 63 3a 25 70 0a 00 6c 5f 66 6f 6f 3a 25 70 20 6c    c:%p..l_foo:%p l
33f9b6bc: 5f 66 6f 6f 5f 62 73 73 3a 25 70 20 6c 5f 66 6f    _foo_bss:%p l_fo
33f9b6cc: 6f 5f 73 74 61 74 69 63 3a 25 70 0a 00 68 65 6c    o_static:%p..hel
33f9b6dc: 6c 6f 3a 25 70 20 62 61 72 3a 25 73 20 62 61 72    lo:%p bar:%s bar

转载地址:http://rwhji.baihongyu.com/

你可能感兴趣的文章
iOS开发中一些常见的并行处理
查看>>
iOS获取手机的Mac地址
查看>>
ios7.1发布企业证书测试包的问题
查看>>
如何自定义iOS中的控件
查看>>
iOS 开发百问
查看>>
Mac环境下svn的使用
查看>>
github简单使用教程
查看>>
如何高效利用GitHub
查看>>
环境分支-git版本管理
查看>>
uni-app 全局变量
查看>>
js判断空对象的几种方法
查看>>
java 不用递归写tree
查看>>
springboot2 集成Hibernate JPA 用 声明式事物
查看>>
fhs-framework jetcache 缓存维护之自动清除缓存
查看>>
SpringBoot 动态编译 JAVA class 解决 jar in jar 的依赖问题
查看>>
fhs-framework springboot mybatis 解决表关联查询问题的关键方案-翻译服务
查看>>
ZUUL2 使用场景
查看>>
Spring AOP + Redis + 注解实现redis 分布式锁
查看>>
elastic-job 和springboot 集成干货
查看>>
php开发微服务注册到eureka中(使用sidecar)
查看>>