[原创]u-boot 里面的环境变量的设置 的问题。 07..
时间:2009-07-07 来源:bob_zhang2004
|
||||||
请教 u-boot 里面的环境变量的设置 的问题。
而这里 env_ptr 默认是 就是 static env_t *flash_addr = (env_t *)CFG_ENV_ADDR; 即:0x10020000 ++++++++++++++++++++++++++++ 关键就是 env_relocate()这个函数, 我觉得有问题啊: env_ptr = (env_t *)malloc (CFG_ENV_SIZE); 输出是这样的: env_relocate[204] offset = 0x0 , no modify : env_ptr addr=10020000 env_relocate[222] malloced ENV at 00000000 怎么malloc返回的就是 0 呢?
-------------------- http://KernelChina.cublog.cn 文章选项: |
||||||
bob2004 (old hand) 07-12-19 22:06 |
|
其实, 我要问的核心问题就是: 文章选项: |
|||||
bob2004 (old hand) 07-12-20 10:19 |
|
继续看代码:
-------------------- http://KernelChina.cublog.cn 文章选项: |
|||||
bob2004 (old hand) 07-12-20 14:26 |
|
通过用multi-ICE + realview 调试发现一个奇怪的问题 , 明明c 语言里面是malloc 一次, 结果查看汇编的时候, 就变成了 3次malloc , 文章选项: |
||||
tpu (old hand) 07-12-20 16:21 |
|
但汇编里面BL malloc只有一次啊,说明只调用了一次。C语言的显示混乱是否跟优化有关呢? 文章选项: |
|||||
bob2004 (old hand) 07-12-20 17:56 |
|
你说得有道理, 看来malloc确实被调用了一次,
大家觉得呢? 我不明白的是, mem_malloc_init () 仅仅是做了上面的动作, malloc怎么就返回 CFG_MALLOC_LEN 地址范围的地址呢? 有详尽分析过 malloc实现的兄弟指点一下啊, 我也仔细再分析一下,分析明白了, 又够一篇经典文章的了。 -------------------- http://KernelChina.cublog.cn 文章选项: |
|||||
bob2004 (old hand) 07-12-20 23:54 |
|
找到一篇 env_relocate()实现的文章 , 正在分析: 文章选项: |
|||||
bob2004 (old hand) 07-12-21 10:38 |
|
接着读 env_relocate() 函数: 有两个地方有疑问, 还望研究过的大侠指教:
-------------------- http://KernelChina.cublog.cn 文章选项: |
||||
kernelworld (addict) 07-12-24 00:39 |
|
出现这种奇怪的现象,首先看看你的地址配置怎么样,因为这已经涉及到操作内存了, 编辑者: kernelworld (07-12-24 00:43) 文章选项: |
|||||
bob2004 (old hand) 07-12-24 09:59 |
|
谢谢你的分享 , 确实是地址设定的问题 , 问题已经解决了,
而这里 CFG_ENV_SIZE 我定义的是 128k ,( 因为 nor flash的 扇区大小刚好是 128k) , 而CFG_MALLOC_LEN 我又恰好根据SRAM 大小调整了 ,
这样的话, malloc 就有可能失败了, 因为SRAM实在太少了。 ] 当以上配置都采用正常值的时候, 直接把 u-boot 烧写到 nor 里面去 执行 , config.mk 里面配置的 TEXT_BASE也改为 SDRAM的相应地址(我是 0x63f80000) , malloc就正常了。 ------------- 我总结了一条经验, 仿真器是个好东西, 但是有的时候, 仿真器毕竟不能模仿真实的一切, 所以还要自己调整。 -------------------- http://KernelChina.cublog.cn 文章选项: |
|||||
bob2004 (old hand) 07-12-24 20:33 |
|
这就和上面的 CFG_MALLOC_LEN 和 GLOBAL_DATA_SIZE 和 irq,FIQ 区域, 第二阶段的代码,做了初始化工作:
1, 可是上面图上的 “用户栈区” , 到底是在哪里分配并初始化的呢?在u-boot代码并没有看到啊? 2, 另外: /* Pointer is writable since we allocated a register for it */ gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t)); /* compiler optimization barrier needed for GCC >= 3.4 */ __asm__ __volatile__("": : :"memory"); 上面的 /* Pointer is writable since we allocated a register for it */ 什么意思呢?没看明白啊。 (不要翻译哦) 谢谢了。 -------------------- http://KernelChina.cublog.cn 文章选项: |
|||||
bob2004 (old hand) 07-12-24 21:26 |
|
1,
adr 是怎么做到 当从 nor flash启动的时候, 就是 0 , 而debug得时候, 就是0x63f80000 的呢? 2,
当 u-boot已经烧写道nor flash里面的时候, _start的值是多少呢? 从System.map 来看 _start 是 0x63f80000 , 而这里又 .globl _start _start: b reset ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq ldr pc, _fiq 从这里来看, 从 nor flash 启动的时候, _start的地址应该就是 0 啊, 谁来解释一下啊? 谢谢了。 -------------------- http://KernelChina.cublog.cn 文章选项: |
||||
freebsdxjj (newbie) 07-12-26 17:14 |
|
我来回答start的问题 文章选项: |
加到“个人收藏夹” | 打印 |
|
前往讨论区 *Linux 社区和文化* ----- 社区公告栏 社区服务台 业界新闻与评论 自由软件杂谈 IT 人生 Linux软件快递 翻译作坊 Linux图书与评论 招聘和求职*Linux 桌面与办公自动化* ----- GNU Emacs/XEmacs Linux 中文环境和中文化 Linux桌面与办公软件 Linux 多媒体与娱乐版 自由之窗Mozilla 笔记本电脑上的Linux*Linux 入门及网络应用* ----- Gentoo Debian 一族 网络管理技术 Linux 安装与入门 WEB服务器和FTP服务器 域名服务器和邮件服务器 Linux防火墙和代理服务器应用 文件及打印服务器 技术培训与认证*Linux 高级应用* ----- TI专版 Linux内核技术 Linux 嵌入技术 Linux设备驱动程序 Linux 集群技术 LINUX平台数据库 系统和网络安全 CPU 与 编译器 系统计算研究所专栏*Linux 环境下的程序设计* ----- Linux下的GUI软件开发 C/C++编程版 PHP 技 术 Java&jsp技术 Shell编程技术 Perl 编 程 Python 编 程 XML/Web Service 技术*永远的 UNIX* ----- 永远的Unix FreeBSD世界 |
|