当前位置:  技术问答>linux和unix

100分请教高手uboot段定义

    来源: 互联网  发布时间:2016-09-10

    本文导语:   u-boot.lds文件中有如下内容:      __u_boot_cmd_start = .; .u_boot_cmd : { *(.u_boot_cmd) } __u_boot_cmd_end = .; 请教高手,具体是什么意思? 定义了多大的段? 这样子定义后,声明变量只要用下面这个语句: __attribute__ ((...

 u-boot.lds文件中有如下内容:    

 __u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;

请教高手,具体是什么意思?
定义了多大的段?
这样子定义后,声明变量只要用下面这个语句:
__attribute__ ((unused,section (".u_boot_cmd")))
就不用malloc内存了?
http://blog.chinaunix.net/u3/91522/showart_1851279.html

|
http://www.ipp.mpg.de/~dpc/gnu/ld-2.9.1/html_mono/ld.html#SEC18

|
 malloc是运行时候申请内存的!这里是由__attribute__ ((unused,section (".u_boot_cmd")))告诉编译器将此部分语句划作.u_boot_cmd段,实际是uboot作者自己定义的段,大小看编译出的具体情况,等于u_boot_cmd_end-u_boot_cmd_start.

|
以上几楼说的都是对的,那几句话意思就是把*.u_boot_cmd拼接起来放入那.u_boot_cmd段,__u_boot_cmd_start =.和__u_boot_cmd_end =.这两个可以认为是变量,就是链接后那个段的开始地址和结束 地址。

再来谈谈这个在UBOOT的中的作用,uboot中,注册新命令就会调用楼主说的 __attribute__ ((unused,section (".u_boot_cmd")))来把命令的数据结构放入该段中,这个段的大小要看来你注册了几个命令,uboot代码中会调用__u_boot_cmd_start =.和__u_boot_cmd_end =.来获取命令数据的开始地址和结束地址。当我们输入一个命令或者按tab键时,程序都会在这个范围去查找匹配数据,然后输出信息

|
通俗的讲是的,以text,data,bss段为例,都是先编译出各个模块的text,data,bss段,最后链接成整个image的。推荐loader and linker这本书和elf文件有关文档

|

通俗的讲是的!loader and linker.
 
顺便探讨个问题:Uboot的位置无关代码技术在ARM是怎么实现的?在MIPS又是怎么实现的?


|
/*
 *  Definitions for Command Processor
 */
#ifndef __COMMAND_H
#define __COMMAND_H

#ifndef NULL
#define NULL 0
#endif

#ifndef __ASSEMBLY__
/*
 * Monitor Command Table
 */

struct cmd_tbl_s {
char *name; /* Command Name */
int maxargs; /* maximum number of arguments */
int repeatable; /* autorepeat allowed? */
/* Implementation function */
int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);
char *usage; /* Usage message (short) */
#ifdef CFG_LONGHELP
char *help; /* Help  message (long) */
#endif
#ifdef CONFIG_AUTO_COMPLETE
/* do auto completion on the arguments */
int (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
#endif
};
//显然定义了如上一个结构来表示一条命令的相关属性,多个结构构成一张命令表

typedef struct cmd_tbl_s cmd_tbl_t;

extern cmd_tbl_t  __u_boot_cmd_start; //命令表首地址
extern cmd_tbl_t  __u_boot_cmd_end;  //命令表末地址


/* common/command.c */
cmd_tbl_t *find_cmd(const char *cmd); //命令表查找函数

#ifdef CONFIG_AUTO_COMPLETE
extern void install_auto_complete(void);
extern int cmd_auto_complete(const char *const prompt, char *buf, int *np, int *colp);
#endif

/*
 * Monitor Command
 *
 * All commands use a common argument format:
 *
 * void function (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
 */

typedef void  command_t (cmd_tbl_t *, int, int, char *[]);

#endif /* __ASSEMBLY__ */

/*
 * Command Flags:
 */
#define CMD_FLAG_REPEAT 0x0001 /* repeat last command */
#define CMD_FLAG_BOOTD 0x0002 /* command is from bootd */

/*
 * Configurable monitor commands definitions have been moved
 * to include/cmd_confdefs.h
 */


#define Struct_Section  __attribute__ ((unused,section (".u_boot_cmd")))

//告知编译器将该部分语句划作u_boot_cmd段,表示每条命令的每个结构体一个段,最终通过lds合并成一个段

#ifdef  CFG_LONGHELP

#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) 
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}

#else /* no long help info */

#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) 
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage}


#endif /* CFG_LONGHELP */

#endif /* __COMMAND_H */


//从本质上来说,u_boot_cmd段就是个data段

|
应该就是对文件的布局做了一个定义

|
1楼正解

    
 
 

您可能感兴趣的文章:

  • 请教redhat9下如何查看系统定义的结构的帮助文档
  • 请教!net-snmp里面怎么挂载自己定义的动态链接库
  • 请教宏定义 #define TEST(s) #s 表示了什么?
  • 请教:为什么在<%!...%>内部定义的函数不能用jsp页面缺省的对象如:out,request,session,等。
  • 新手请教Qt下自定义类的使用问题?
  • 请教一个简单问题。。如果我定义了 int data; 我在程序中想得到他的地址,应该怎么做?谢谢
  • 请教一个 Linux 的宏定义问题
  • 请教一个shell里面宏定义执行问题
  • 我用的是atmel一个成熟的开发板。有一个触摸屏驱动程序,以<M>的方式编译为模块,编译时提示某个外部函数没有定义,但如果以<*>的方式编译进内核,则不会出错。请教下可能是什么原因?
  • 请教结构体定义--LINUX驱动程序中语句
  • 请教一个有个EJB中自定义find的方法
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教高手lvs的奇怪问题,我挺着急,希望高手别潜水,就就我,先谢谢了
  • 请教高手:如何用gnome/gtk编写托盘程序
  • 请教各位高手一个简单的问题:在JAVA 中如何才能取得一些系统信息?
  • 请教curses的高手
  • #######菜鸟问题,请教高手,一定给分########
  • 如何在Linux上使用LoadLibrary()?高手请教!
  • 请教:Java高手读书之路
  • 请教高手:cpu占用经常100%怎么解决?
  • linux起不来了,请教高手,谢谢
  • 关于courier邮件服务器的配置问题,请教高手
  • 我的REDHAT 9。0刚装好,显卡不能正常显示,请教各位高手
  • 请教高手,如何将磁盘阵列mount上去??
  • 请教高手,关于vmware中linux的鼠标的问题
  • 请教高手在QT下怎样收串口数据
  • 请教高手,如何在VMware下安装suse10.0??请指教,谢谢。
  • 高手请教!linux怎样通过pid获取进程信息,如:进程名、进程状态等?
  • 请教solaris高手一个solaris安装问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教这种循环的执行过程
  • 请教两个redhat9问题
  • 请教如何在指定目录下查找包含指定文字的文件
  • 请教局域网中如何通过ip地址得到主机名
  • 请教kdevelop的问题
  • 请教linux 下的adsl拨号问题.
  • 请教,如何用虚拟订机安装liux
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教一个opengl的问题
  • 请教unix常用命令命令问题
  • 请教两个shell
  • 菜鸟请教Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3