当前位置: 技术问答>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文件中有如下内容:
请教高手,具体是什么意思?
定义了多大的段?
这样子定义后,声明变量只要用下面这个语句:
__attribute__ ((unused,section (".u_boot_cmd")))
就不用malloc内存了?
http://blog.chinaunix.net/u3/91522/showart_1851279.html
__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键时,程序都会在这个范围去查找匹配数据,然后输出信息
再来谈谈这个在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段
* 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楼正解