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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
/ m3 Q6 x8 I7 O% D3 V
在分析U-Boot第二阶段的C函数之前,我们有必要先分析二个重要的数据结构,因为它们在第二阶段中无处不在!知道它们的厉害了吧?究竟是谁那么厉害呢?
- G: Z3 _2 s- Q& g6 \- `
+ \3 ^; b; I; A6 p9 x     打开 lib_ARM/board.c  在第55行看到:, X* B5 s4 H- X- Z+ n1 Q
! F3 @2 }9 X1 G1 m0 |3 I' L
55    DECLARE_GLOBAL_DATA_PTR;
0 S& h, r- z$ }1 T. u+ T& [! x  I( ~
     这是什么意思呢?找遍board.c也没找着它的第二次出现,因为它只出现一次,而且仅需一次就够了。从字义上翻译,“声明全局的数据结构型指针”。大概可以猜到,它起着声明的作用,在include/am-arm/global_data.h头文件的第64行:
0 S! i  D  \7 l) p( b* w
% x$ w/ C$ K- p8 K5 m64    #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8")$ w' `0 ~0 n# S8 H8 Y% f

/ |) E0 Z# z, c1 s     原来它的作用是,声明gd这么一个全局的指针,这个指针指向gd_t结构体类型,并且这个gd指针是保存在ARM的r8这个寄存器里面的。* J! y+ J& c1 ]% B) |4 q
' L& d. ?5 `  e" ~$ ?
     gd_t : global data数据结构定义,位于文件 include/asm-arm/global_data.h。其成员主要是一些全局的系统初始化参数。需要用到时用宏定义: DECLARE_GLOBAL_DATA_PTR,指定占用寄存器r8。原型如下:
# r3 j* I/ P0 a. ^# Y* F, t1 o+ U+ e2 r/ w1 W/ I. \
typedef struct global_data& f+ I" q+ r: k2 B7 r4 j0 h

" I/ B8 {4 C3 v4 |) M8 V6 O" N" w{8 S" \, X' V7 @) T2 x6 j+ V
       bd_t    *bd;            // bd指针指向bd_info这个结构体,保存开发板的相关参数
, ]9 C4 P, ]( v3 v$ s* H
# t* V( y# i, B4 j7 T# h0 a       unsigned long flags;        //指示标志,如设备已经初始化标志等! w6 m. |5 _  i( W3 g
       unsigned long baudrate;         // 串口的波特率
9 p5 J* z8 g/ M0 [       unsigned long have_console;    // 串口初始化标志
5 Y% B0 c  W0 x- ~' o/ _* [6 L  b
/ W/ P9 l0 r! n
/* Relocation Offset 重定位偏移,就是实际定向的位置与编译连接时指定的位置之差,一般为0 */' j7 t. _5 @/ d/ t6 l  ^0 a* E% ?  L

0 d8 z" x  A  P. ^, m1 @# ?- |       unsigned long reloc_off;     
- v. I4 y( P( v       unsigned long env_addr;       // Address of Environment struct ,环境参数地址! b! K9 X3 j0 Z# y3 ?
       unsigned long env_valid;      // 环境参数CRC检验有效标志% `# k8 k  g  I9 I) \
       unsigned long fb_base;       //base address of frame buffer 帧缓冲区基地址' h1 e" [4 Q: l( S/ o

  V+ \1 s- C/ Z' W3 \* h0 G" n0 r3 |1 Z5 V/ @
#ifdef CONFIG_VFD           //  include/configs/EmbedSky.h里面没有此宏定义,故忽略# ?- L3 S: u4 e% Z# c) I$ A) c
       unsigned char vfd_type; /* display type */* u8 M9 G/ ?. w3 M! y6 O+ x
#endif. |$ y2 y# D$ }6 ?
#if 06 X0 D: S5 J5 F% ]5 M4 R" y9 Q, n
       unsigned long cpu_clk;             /* CPU clock in Hz!  */
+ \: i2 A0 H% C3 t       unsigned long bus_clk;            /*  Bus  clock in Hz!  *// C: o) [6 L# |
       unsigned long ram_size;        /* RAM size */
6 D2 ^* x! B: B7 c       unsigned long reset_status;   /* reset status register at boot */* v% i$ r4 {! \* E) P1 c
#endif
2 r2 M( A; W. X- }+ G( @. _       void  **jt;          /* jump table 跳转表,用来"函数调用地址登记" */: @7 B* T- M" v1 M
} gd_t. c$ o8 D$ T- ^* B* _( E$ e

3 I- D1 ~; L! Y9 C3 q______________________________________________________________________/ _' D, `4 {! p9 Z# v; ^
, v  H# w+ i& X4 t5 G% p
      bd_t : board info数据结构定义,位于文件 include/asm-arm/u-boot.h定义,主要是保存开发板的相关参数。
4 x4 s, ?% k8 x; J( `  r$ Z- x/ _; W7 j7 m; T2 c" l! h
typedef struct bd_info
5 k" T/ r( k/ e; J
4 c4 l) @# |1 y- w{
& m, N' T; I/ q8 e' }/ r+ U       int   bi_baudrate;                          / /串口波特率
% `$ y: y, U3 J0 \       unsigned long bi_ip_addr;           // IP地址8 O/ p+ V7 A% P& s* I, ?3 P
       unsigned char bi_enetaddr[6];    // MAC地址3 B+ S2 t$ z# ~2 L4 ]. \
       struct environment_s        *bi_env;
! K. ^: r! }+ u. P4 R& {& k       ulong    bi_arch_number;          //板子ID号% g, V' a4 K! L/ @1 C: Y! m
       ulong     bi_boot_params;         // 启动参数3 a; i' a* G; _
       struct                                        //RAM 配置
: C( s, O; B. l# I1 f! y9 R       {# S5 X# v# W: b
              ulong start;
3 A/ q, U' b% s% t9 _1 ^              ulong size;     //CONFIG_NR_DRAM_BANKS=1,即1 bank of DRAM: [% x. i  Y# X  m/ q& e
       } bi_dram[CONFIG_NR_DRAM_BANKS];      9 k! S) I! [9 R: `( J

. M8 K& p) r7 G1 o  Z7 t  X$ X# y0 M/ _2 N# O7 s
#ifdef CONFIG_HAS_ETH1          //  include/configs/EmbedSky.h里面没有此宏定义,故忽略6 G$ D; R, T$ h  J
    /*  如果有第二块网卡,指定MAC地址   */
0 \& I- J/ I( N# |- u       unsigned char   bi_enet1addr[6];' O6 f; P/ f0 @+ J) i' @$ M- Z
#endif' R+ I0 P. _: h  {3 {
} bd_t;0 N2 l, K4 i8 W" l: v0 a( _
( d$ }) P) t8 i* J5 Z$ b
——————————————————————————————————————
! l$ r+ d( D3 V0 e6 a  Q6 K) j. t$ b+ j" e; u6 }/ }
U-Boot启动内核时要给内核传递参数,这时就要使用gd_t,bd_t结构体中的信息来设置标记列表。
& |2 E+ i4 @% U0 u! ~6 a: s% a0 ^- M9 T0 D2 W
这节就讲到这里,祝愿大家学习愉快。
! |+ n: g6 _  e4 A2 Y/ K
2 |0 w& U6 Q) P; K9 R' W" E
  • 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-11-25 23:05 , Processed in 0.171875 second(s), 24 queries , Gzip On.

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

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

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