找回密码
 注册
关于网站域名变更的通知
查看: 213|回复: 1
打印 上一主题 下一主题

TQ2440之U-Boot-1.1.6之初解二个重要的数据结构gd_t与bd_t

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-5-13 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
. \5 R  |) v: i3 Z  I
在分析U-Boot第二阶段的C函数之前,我们有必要先分析二个重要的数据结构,因为它们在第二阶段中无处不在!知道它们的厉害了吧?究竟是谁那么厉害呢?
0 x; h" ^) \1 ~1 q4 Z
9 A% `+ i" n* q. [( p9 l, Z     打开 lib_ARM/board.c  在第55行看到:" \( J$ @. R1 j: z% h
, V0 E. \6 W5 x- b5 }* _5 }
55    DECLARE_GLOBAL_DATA_PTR;
. Z9 w! P% [* _# S0 a* E: K1 ~) g) `! k8 _! C9 V2 x( F8 i
     这是什么意思呢?找遍board.c也没找着它的第二次出现,因为它只出现一次,而且仅需一次就够了。从字义上翻译,“声明全局的数据结构型指针”。大概可以猜到,它起着声明的作用,在include/am-arm/global_data.h头文件的第64行:: m- Y% r7 b8 `- ^0 Y

! w5 X" `2 ^: j8 h) @9 t64    #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8")
4 r: F- a9 b  w
* |, p2 Z& ~4 p$ m4 P! w* [     原来它的作用是,声明gd这么一个全局的指针,这个指针指向gd_t结构体类型,并且这个gd指针是保存在ARM的r8这个寄存器里面的。
$ Q$ N& q/ {0 H' e! V$ P, j) B  A8 L1 M; i1 p3 M- `
     gd_t : global data数据结构定义,位于文件 include/asm-arm/global_data.h。其成员主要是一些全局的系统初始化参数。需要用到时用宏定义: DECLARE_GLOBAL_DATA_PTR,指定占用寄存器r8。原型如下:$ w6 e& _+ o' t) V/ Y! c  T: O. A
# J+ ?! p! k# s/ ^- e( m9 u
typedef struct global_data
& i. ]. R0 l# ?8 ~! N
: V4 _0 V- ^) z/ @8 p* T, @{2 d& q$ w' W, k0 {7 R) s) H
       bd_t    *bd;            // bd指针指向bd_info这个结构体,保存开发板的相关参数
3 @8 I3 j$ k* g+ }# e! T" f) t$ O% J" g+ F$ O
       unsigned long flags;        //指示标志,如设备已经初始化标志等4 _4 K3 G5 Q) B: {
       unsigned long baudrate;         // 串口的波特率
3 y1 T7 t/ P- U) `) ?; a4 R. _8 V6 C       unsigned long have_console;    // 串口初始化标志
8 X$ o$ S; [- u+ R( t* D
7 P+ {2 T- N# U  F+ L- G$ C, y3 r1 [2 t7 A( f
/* Relocation Offset 重定位偏移,就是实际定向的位置与编译连接时指定的位置之差,一般为0 */6 ?3 z$ p- n% ^3 x; ?

. F& o3 q8 O! k* q3 Z       unsigned long reloc_off;     ( d5 a& d& g7 \; k5 {8 _+ U
       unsigned long env_addr;       // Address of Environment struct ,环境参数地址' t" ], [: O, A* T' G# _
       unsigned long env_valid;      // 环境参数CRC检验有效标志( A$ C/ D# f4 u- Z; J. P8 r
       unsigned long fb_base;       //base address of frame buffer 帧缓冲区基地址8 B5 I' i% J/ R

2 q# M/ F2 ]9 a; V& B. X+ \' b8 k9 k1 s# Q2 J1 V
#ifdef CONFIG_VFD           //  include/configs/EmbedSky.h里面没有此宏定义,故忽略8 r8 I* k& F0 k* C5 D5 d  T# f
       unsigned char vfd_type; /* display type */, v$ T( p4 P2 m
#endif5 b: W! O3 O/ q
#if 0
& `' @3 u7 u! T; L+ s! l       unsigned long cpu_clk;             /* CPU clock in Hz!  */  O( h6 Z8 R5 ]7 V6 ?  w
       unsigned long bus_clk;            /*  Bus  clock in Hz!  */. Q% c) I  [: |; h/ z+ C# z
       unsigned long ram_size;        /* RAM size */$ `. n5 w: u2 d# P
       unsigned long reset_status;   /* reset status register at boot */
$ ?# }4 M/ o- Y; F6 E) q" [#endif* A+ x4 z* z; u( X
       void  **jt;          /* jump table 跳转表,用来"函数调用地址登记" */
/ v- }: |9 {( r} gd_t! X0 ?; V9 {. g
; D; |9 G5 f! c  V
______________________________________________________________________" h0 B) ^/ P' K" x' s: ?

# g+ k; }; q( t( j$ x4 g6 `! @1 D7 L      bd_t : board info数据结构定义,位于文件 include/asm-arm/u-boot.h定义,主要是保存开发板的相关参数。
8 ]& a$ b5 c; l/ G3 s3 K  Q# @3 A  t6 S
typedef struct bd_info2 D2 R+ C6 @( F8 T+ y7 N9 z% h
' d0 i4 [9 F9 k! U1 {# W* R
{- o6 J8 E) u- i; w6 d
       int   bi_baudrate;                          / /串口波特率
6 g8 Y0 p6 p' \* I- r       unsigned long bi_ip_addr;           // IP地址, o8 T0 [# h  E
       unsigned char bi_enetaddr[6];    // MAC地址7 C- F: z: {7 {. r# c7 Z5 K
       struct environment_s        *bi_env;3 h8 C: M" F, }  j
       ulong    bi_arch_number;          //板子ID号
( H. d) T! C  j/ e9 @$ x; N2 e* w       ulong     bi_boot_params;         // 启动参数
* N% S% g) r2 [2 u5 W, p       struct                                        //RAM 配置 % D& @+ J7 _/ S& {) A/ K
       {  }/ h  \" F# ~6 L. m+ V" B9 d
              ulong start;
* |- g% e" t. |2 c6 k0 [7 H0 V( g6 v              ulong size;     //CONFIG_NR_DRAM_BANKS=1,即1 bank of DRAM
- b- r8 X5 k5 l, k/ I5 W  z       } bi_dram[CONFIG_NR_DRAM_BANKS];      
3 H- N7 t! U' I& R; i: N- n
( E" Z4 y* ]. x- Q& L  }1 c/ J' M9 d2 `4 ~7 k% v* I- R9 f0 z
#ifdef CONFIG_HAS_ETH1          //  include/configs/EmbedSky.h里面没有此宏定义,故忽略
7 L8 {$ d2 J( G& Q2 G" X    /*  如果有第二块网卡,指定MAC地址   */
& i  l! T9 z* ~- D! W/ u& p1 c* E       unsigned char   bi_enet1addr[6];4 F6 I1 Q) e2 F4 i' g
#endif
# n  D, y6 L" c) j/ `} bd_t;
7 R4 d1 N; B6 X$ l4 E& F" |, p! H1 v0 j3 w; @1 l& j5 `
——————————————————————————————————————
' @! @7 P6 _4 |% N$ [5 O
6 m0 T/ c% {) k" dU-Boot启动内核时要给内核传递参数,这时就要使用gd_t,bd_t结构体中的信息来设置标记列表。7 E$ h; D4 E8 R3 ?8 k7 {, o" O
' _6 f5 J7 V4 S6 d( e2 F) D) _
这节就讲到这里,祝愿大家学习愉快。
$ q( E' w/ K' y) G) d( W5 u. J  S7 N
3 o( U/ L- @" r$ e% p! [" i
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-5-13 11:26 | 只看该作者
    初解二个重要的数据结构gd_t与bd_t
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-10-26 10:14 , Processed in 0.140625 second(s), 24 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表