免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3630 | 回复: 8
打印 上一主题 下一主题

[BootLoader] bootloader的学习困惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-22 11:16 |只看该作者 |倒序浏览
在学习Bootloader的时候,总是避免不了读Start.S,里面有很多#ifndef XXXX,我们知道XXXX是在/config下的配置文件中配置的,就是不明白
这些在配置文件中的宏定义是怎么与Start.S中的那些宏关联起来的,请高手指导一下,谢谢~!

论坛徽章:
0
2 [报告]
发表于 2011-07-22 11:52 |只看该作者
我也不知道,帮顶

论坛徽章:
0
3 [报告]
发表于 2011-07-22 14:28 |只看该作者
在start.S里面包含了配置的头文件, config.h config.h里面有你配置板子的头文件。

论坛徽章:
0
4 [报告]
发表于 2011-07-22 20:22 |只看该作者
回复 3# xs3c


    但是我真没有联系起来,你能帮我做一个流程分析吗?

论坛徽章:
0
5 [报告]
发表于 2011-07-22 21:53 |只看该作者
build目录下的某个脚本会做这件事(貌似是,记不清了),当你make menuconfig之后生成了config配置文件,同时也就会生成对应的config.h,比如
config中有一行  xxx=y
config.h就会对应产生#define  xxx  1
你自己也可以写一个脚本完成类似工作

论坛徽章:
0
6 [报告]
发表于 2011-07-23 15:42 |只看该作者
http://hi.baidu.com/brauceunix/b ... 8e0ae0e6cd40b7.html

这个里面讲得比较清楚。。我以前看过bootloader的源码。和内核源码。。分过过.config 和Makefile.以及相应的c,h文件关系。。。 你可以参考下,不懂的话。发我消息吧。。

论坛徽章:
0
7 [报告]
发表于 2011-07-23 19:48 |只看该作者
回复 1# jtou100


    既然你已经知道start.S中的宏是在config/xxx.h中定义的,那就容易给你讲解清楚了。

首先,start.S也包含了对应的头文件:
  1. #include <config.h>
复制代码
这个,你查看start.S中,即可找到。
而对应的config/xxx.h中的内容,包含在此config.h中。
再来解释config.h是哪里来的。:
以TQ2440为例,正常的编译流程是:
  1. make EmbedSky_config
  2. make
复制代码
其中,第一步:
  1. make EmbedSky_config
复制代码
是生成对应的配置,这你应该也知道的。
其内部处理流程,就是对应着根目录下makefile中的:
  1. EmbedSky_config        :        unconfig
  2.         @$(MKCONFIG) $(@:_config=) arm arm920t EmbedSky NULL s3c24x0
复制代码
其中MKCONFIG是根目录下的mkconfig,其是一个脚本,脚本的作用是配置对应的变量,最后生成对应的config.h头文件,即我们上面所说的被start.S所包含的那个头文件。
先说一下,上面的$(@:_config=) 的含义是,把@中的_config删除掉,而@就是EmbedSky_config,所以,处理后的结果是EmbedSky,也就是传入mkconfig的第一个参数,是EmbedSky,即我们开发板的名字。
然后再来看mkconfig脚本,其最后几行是:

  1. #
  2. # Create board specific header file
  3. #
  4. if [ "$APPEND" = "yes" ] # Append to existing config file
  5. then
  6. echo >> config.h
  7. else
  8. > config.h  # Create new config file
  9. fi
  10. echo "/* Automatically generated - do not edit */" >>config.h
  11. echo "#include <configs/$1.h>" >>config.h
复制代码

即先判断是否是append,如果不是,则新生成一个config.h文件,
然后想里面写入一行警告信息:/* Automatically generated - do not edit */
再把对应的config/$1.h写入到此config.h中。
而其中$1,表示传入mkconfg脚本时候,第一个参数,此处即EmbedSky,所以就是把configs/EmbedSky.h加到config.h中。
至此,你应该看懂了吧。
再简单总结一下
【start.S中的宏,即属于config/BOARD_NAME.h中的宏,是如何传入到start.S中去的】
其实只是因为start.S包含了config.h文件,而config.h中包含了configs/BOARD_NAME.h而已。
【关于config.h】
而config.h头文件,是在make BOARD_NAME去配置开发板的时候,makefile调用mkconfig自动生成的,
生成过程中,把对应的#include <configs/BOARD_NAME.h>加入到了config.h中。
所以,start.S中,才可以使用configs/BOARD_NAME.h中的宏的。

论坛徽章:
0
8 [报告]
发表于 2011-07-23 19:49 |只看该作者
话说uboot中的makefile的流程和mkconfig的流程,之前有专门看过,本打算整理出来的,不过后来还是觉得太烦而懒得弄了。

论坛徽章:
0
9 [报告]
发表于 2011-07-25 08:23 |只看该作者
回复 7# crifan
非常感激你细致的讲解,通过你的知道,对这个已经清楚了,非常感谢!
同时也希望你多多执教新手
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP