4.u-boot理论知识

u-boot理论知识

  • 一、解压文件

    • 将待解压文件u-boot-2013.01.tar.bz2u-boot-2013-learn.tar.xz放在==/home/linux/SystemPorting/FS4412/BootLoader==目录下

    • # 解压
      tar -xvf u-boot-2013.01.tar.bz2 # u-boot-2013.01源码
      tar -xvf u-boot-2013-learn.tar.xz # u-boot-2013.01源码中删除了与实验开发板不相关的代码,防止其他开发板代码的干扰
      
    • 文件大小

    • BootLoader和u-boot

      • 在嵌入式操作系统中,BootLoader在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常没有像BIOS那样的固件程序(有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成BootLoader有很多种,u-boot只是其中一种,使用的比较广泛!
  • 二、u-boot的目录结构

    • 1、开发板

      • (1)CPU核
        • ARM Cortex-A9 ARMv7指令集(ARM每做一个核时都会在之前的指令上升级)
      • (2)SOC
        • Samsung Exynos4412 4个Cortex-A9核
      • (3)开发板平台
        • fs4412:参照三星的母板origen/smdk4412(BootLoader Linux Android)进行设计
    • 2、board目录

      • 存放特定开发板相关的代码,一般以芯片厂家的名字命名
      • board
    • 3、arch目录

      • 存放跟CPU架构相关的代码(ARM/X86/MIPS/PowerPC),采用指令集划分
      • arch/arm/cpu/armv7/start.S
        • u-boot首先执行的代码(异常向量表)
        • arch_armv7
      • arch/arm/cpu/u-boot.lds
        • 链接脚本文件告诉编译器在链接生成可执行文件的时候,一些段的存放位置)
          • arch_cpu
        • Linux可执行程序组成
          • Linux可执行程序组成
          • .data,.ro,.txt会影响最终文件的大小,.bss不会影响文件大小,.bss不占空间是因为它所存储的全局变量没有初始化,值没有意义,所以没有必要表示它的每一个变量的值,因此不需要为其表示出每一个变量。
          • .bss不占据实际的磁盘空间,只在段表中记录大小,在符号表中记录符号。当文件加载运行时,才分配空间以及初始化
        • .bss与.data段验证
          • # bss.c
            #include <stdio.h>
            
            int a[1000];
            int b[1000] = {1};
            
            int main(int argc, const char *argv[])
            {
            	return 0;
            }
            
          • # data.c
            #include <stdio.h>
            
            int a[1000] = {2};
            int b[1000] = {1};
            
            int main(int argc, const char *argv[])
            {
            	return 0;
            }
            
          • bssVSdata
    • 4、include目录

      • 存放u-boot相关代码所需要的头文件
      • include /configs/origen.h这个头文件非常重要,就相当于内核移植中用到的.config,它决定了origen所需要的一些代码的宏开关,它也是开发板配置头文件
      • origen_path
      • u-boot是想控制所有开发板,但是每块开发板都有差异,然后写u-boot的程序员就写了一个框架让内核动态选择,就采用了C语言中的一种语法,即条件编译。开发板所需要的代码宏开关和相关宏定义的参数都在origen.h文件中定义
      • origen.h
    • 5、net目录

      • u-boot支持的一些网络协议
      • ping(ICMP)TftpARP(根据IP地址获取目录主机MAC地址【网卡地址】)、RARP(反向地址转换协议,允许局域网的物理设备从网关服务器的ARP表或者缓存上请求其IP地址)
      • net
    • 6、lib目录

      • 通用的实现代码(库)
      • lib
    • 7、common目录

      • u-boot支持的命令实现代码
      • common
    • 8、drivers目录

      • u-boot支持的一些硬件驱动代码
      • 查看对应的网卡驱动,驱动在drivers目录下的net下的dm9000x.c;这里的驱动和之前的内核中的驱动是不一样的,这个是一个裸机驱动,那个是带有系统的驱动,这两个驱动是不一样的。
      • DM9000裸机驱动
    • 9、boards.cfg

      • u-boot支持的开发板的配置信息,u-boot编译系统根据此配置文件来识别当前开发板的信息
      • bords_cfg_path
      • boards_cfg
  • 三、在u-boot工程中添加代码

    • 1、以/drivers/net/dm9000x.c为例,添加到u-boot中,首先找到DM9000,DM9000受本层目录下的Makefile控制,我们查看Makefile可以看到DM9000的编译取决于CONFIG_DRIVER_DM9000是否配置

      • Makefile
    • 2、想让DM9000编译进内核,就必须在include/configs/origen.h中定义这个宏,做法和内核很像。

      • origen.h
  • 四、通过tags文件阅读源代码

    • 1、什么是tags

      • tags相当于新华字典中的索引,当我们查生字可以通过索引来快速找到那个字,tags中记录了所有的符号信息。我们可以先生成一个tags文件,通过ctags -R命令来生成,生成之后这个目录下的所有的结构体定义、函数定义、宏定义都可以通过索引文件找到它所在的路径文件。这个文件已经生成,在==/home/linux/SystemPorting/FS4412/BootLoader/u-boot-2013-learn==中可以查看到(只有Samsung相关开发板信息)。
        • tags
      • 如果在/home/linux/SystemPorting/FS4412/BootLoader/u-boot-2013.01源码目录下使用ctags -R命令生成tags文件,因为除了Samaung还有很多其他开发板的信息,会生成很多不需要的信息。
        • board_info
    • 2、使用tags(以DM9000网卡为例)

      • # /home/linux/SystemPorting/FS4412/BootLoader/u-boot-2013-learn目录下打开
        vi drivers/net/dm9000x.c
        
        # 跳到dm9000x.c文件末尾,找到结构体struct eth_device
        GG
        
        # 跳转到struct eth_device定义的地方
        Ctrl + ]
        
        # 返回到之前的文件
        Ctrl + T
        
        • DM9000_tags
        • DM9000_tags_jump
      • # /home/linux/SystemPorting/FS4412/BootLoader/u-boot-2013-learn/drivers/net目录下打开
        vi dm9000x.c
        
        # 跳到dm9000x.c文件末尾,找到结构体struct eth_device
        GG
        
        # 跳转到struct eth_device定义的地方(发现进不去)
        Ctrl + ]
        
        • DM9000_tags_failed
      • tags在/home/linux/SystemPorting/FS4412/BootLoader/u-boot-2013-learn目录下,vim编辑器默认在当前目录查找tags文件,如果在其他目录,vim这个编辑器就找不到,所以需要修改对应vim的配置文件,让它全局有效。修改用户主目录下的.vimrc文件,添加自己的tags文件路径,这样vi编辑器就可以找到我们自己的tags
        • # /home/linux/.vimrc添加代码
          set tags+=/home/linux/SystemPorting/FS4412/BootLoader/u-boot-2013-learn/tags
          
        • .vimrc
  • 五、find命令和grep命令

    • 有时候通过tags命令,只能跳到声明的地方,不能跳到对应定义的地方,没有办法跳到我们想要的路径,因此可以使用find和grep命令

    • # 显示所在的行号
      grep "cpu_init_cp15" -nr
      
      # 打开start.S文件的第287行
      vi arch/arm/cpu/armv7/start.S +287
      
      • grep_search
      • grep_result
    • # 显示所在的路径
      find -name start.S
      find -name dm9000*
      
      • find_search1
      • find_search2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0x2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值