5-global_data介绍
[uboot] (番外篇)global_data介紹
2016年11月02日 22:05:49閱讀數:2266以下例子都以project X項目tiny210(s5pv210平臺,armv7架構)為例
[uboot] uboot流程系列:?
[project X] tiny210(s5pv210)上電啟動流程(BL0-BL2)?
[uboot] (第一章)uboot流程——概述?
[uboot] (第二章)uboot流程——uboot-spl編譯流程
===================================================================================
一、global_data功能
1、global_data存在的意義
在某些情況下,uboot是在某些只讀存儲器上運行,比如ROM、nor flash等等。?
在uboot被重定向到RAM(可讀可寫)之前,我們都無法寫入數據,更無法通過全局變量來傳遞數據。?
而global_data則是為了解決這個問題。?
這里順便一下,后續的uboot的relocation操作,也就是uboot的重定向操作,最主要的目的也是為了解決這個問題,后續會專門說明。
2、 global_data簡單介紹
global_data又稱之為GD.?
簡單地說,uboot把global_data放在RAM區,并且使用global_data來存儲全局數據。由此來解決上述場景中無法使用全局變量的問題。
二、global_data數據結構
1、數據結構說明
global_data數據結構結構體定義為struct global_data,被typedef為gd_t。?
也就是說可以直接通過struct global_data或者gd_t來進行聲明。?
struct global_data定義如下(過濾掉一些被宏定義包含的部分):?
include/asm-generic/global_data.h
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
2、成員說明
- 重點說明?
- bd_t *bd:board info數據結構定義,位于文件 include/asm-arm/u-boot.h定義,主要是保存開發板的相關參數。
- unsigned long env_addr:環境變量的地址。
- unsigned long ram_top:RAM空間的頂端地址
- unsigned long relocaddr:UBOOT重定向后地址
- phys_size_t ram_size:物理ram的size
- unsigned long irq_sp:中斷的堆棧地址
- unsigned long start_addr_sp:堆棧地址
- unsigned long reloc_off:uboot的relocation的偏移
- struct global_data *new_gd:重定向后的struct global_data結構體
- const void *fdt_blob:我們設備的dtb地址
- void *new_fdt:relocation之后的dtb地址
- unsigned long fdt_size:dtb的長度
- struct udevice *cur_serial_dev:當前使用的串口設備。
其他成員在后續時候到的時候在進行說明。
三、global_data存放位置以及如何獲取其地址
1、global_data區域設置代碼
(1)首先參考一下分配global_data的代碼。?
common/init/board_init.c
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
(2)然后看一下初始化global_data區域的代碼。?
common/init/board_init.c?
去除無關代碼的部分
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
(3)arm平臺如何分配global_data區域,并保存其地址。?
代碼如下,去除掉被宏定義包含的無關代碼部分?
arch/arm/lib/crt0.S
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
注意:最終global_data的地址存放在r9中了。
2、global_data內存分布
內存分布如下:?
———————-CONFIG_SYS_LOAD_ADDR —————————–高地址
……………………………..?early malloc 內存池
————————-early malloc 內存池基地址 —————————
…………………………………?global_data區域
—————-global_data基地址(r9), 也是堆棧的起始地址————-
………………………………………堆棧空間
————————————–堆棧結束—————————————-低地址?
注意:最終global_data的地址存放在r9中了。
四、global_data使用方式
1、原理說明
前面我們一直強調了global_data的地址存放在r9中了。?
所以當我們需要global_data的時候,直接從r9寄存器中獲取其地址即可。
uboot中定義了一個宏DECLARE_GLOBAL_DATA_PTR,使我們可以更加簡單地獲取global_data。?
定義如下:?
arch/arm/include/asm/global_data.h
- 1
DECLARE_GLOBAL_DATA_PTR定義了gd_t *gd,并且其地址是r9中的值。?
一旦使用了DECLARE_GLOBAL_DATA_PTR聲明之后,后續就可以直接使用gd變量,也就是global_data了。
2、使用示例
DECLARE_GLOBAL_DATA_PTR定義了gd_t *gd,并且其地址是r9中的值。?
一旦使用了DECLARE_GLOBAL_DATA_PTR聲明之后,后續就可以直接使用gd變量,也就是global_data了。?
簡單例子如下:?
common/board_r.c
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
global_data相對比較簡單,也就不多說了。
總結
以上是生活随笔為你收集整理的5-global_data介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4-uboot编译流程
- 下一篇: 6-uboot relocation介绍