f1c100s入坑笔记(3)-从uboot开始

本文详细介绍了U-Boot的作用、启动过程,包括硬件初始化、内核加载等,并分享了下载、安装交叉编译器以及编译U-Boot的步骤,强调了在编译过程中可能遇到的GCC版本问题及其解决方案。

     其实我所希望的是:拿到一颗arm芯片,能从原理图的设计开始,自己打样板,自己创建启动文件,然后加载自己定制的linux系统…… 好吧,想的有点远,arm的学习还得一步一步来。

1. 初识uboot

  • uboot作用
          uboot属于bootloader的一种,用来引导和启动内核的,其目的是从flash中读出内核放到内存中,启动内核
  • uboot是怎样引导启动内核的
          uboot刚开始被放入flash中,cpu上电后,先拷贝一部分代码到内存中,然后这部分代码负责把其余代码拷贝到内存中,然后再把kernel代码拷贝到内存中并启动。内核启动后,挂着根文件系统,执行应用程序
  • uboot的启动过程
          uboot启动主要分两个阶段,主要在start.s文件中。
          第一阶段:
              主要做的是硬件的初始化。包括,设置处理器模式为SVC模式,关闭看门狗,屏蔽中断,初始化sdram,设置栈、时钟,从flash拷贝代码到内存,清除bss段等(bss段是存储静态变量及全局变量的),然后程序跳转到start_arm_boot函数。
         第二阶段:
              主要是从flash中读出并启动内核。
              从start_arm_boot开始, 其的主要流程为,设置机器id,初始化flash,然后进入main_loop,等待uboot命令,uboot要启动内核,主要经过两个函数,第一个是s=getenv("bootcmd"),第二个是run_command(s...),所以要启动内核,需要根据bootcmd环境变量的内容启动,bootcmd环境变量一般指示了从某个flash地址读取内核到启动的内存地址,然后启动bootm
              bootm要做的事情是
                    (1)读取内核镜像的头部,并把内核拷贝到合适的地址
                    (2)在do_boom_linux()中把参数给内核准备好,并告诉内核参数的首地址
                    (3)在do_boom_linux()中最后使用theKernel () 引导内核
     
  • 总结uboot的作用
    (1) uboot主要作用是用来启动操作系统内核。体现在uboot最后一句代码就是启动内核。
    (2) uboot还要负责部署整个计算机系统。体现在uboot最后的传参。
    (3) uboot中还有操作Flash等板子上硬件的驱动。例如串口要打印,ping网络成功,擦除、烧写flash是否成功等。
    (4) uboot还得提供一个命令行界面供人来操作。很简单,至少你能看到。
    (5) uboot大小一般在180K~400K之间

2. 下载并安装交叉编译器

  • wget http://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz
    上边的下载相当慢,不知是不是我这边网络的原因, 我直接windows下迅雷下载了复制到之前建立的共享目录中
  • sudo tar -vxJf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz --directory=/opt/
    解压到 /opt/目录下
  • sudo vim /etc/bash.bashrc
    # 在文件末尾 添加以下内容
    PATH="$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin"
    # 添加完毕

    # 使路径生效
    sudo source /etc/bash.bashrc 
    注意这里要加sudo ,否则用sudo编译会提示你找不到arm-linux-gnueabi-gcc
  • 此时可用arm-linux-gnueabi-gcc -v 进行测试;若普通用户状态下没有成功,通过 sudo su 切换到root用户再尝试;

3. 下载并编译u-boot

  • 由于用的是荔枝派的小板子, 所以从荔枝派的代码仓库中获取
  • sudo git clone https://github.com/Lichee-Pi/u-boot.git -b nano-v2018.01       #把代码从仓库克隆到本地
  • cd u-boot                                   #进入u-boot目录
  • git branch -a                              #查看分支
  • git checkout nano-v2018.01      #切换到需要的分支
  • make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_spiflash_defconfig
    # 此处告知make采用arm-linux-gnueabi下的所有交叉编译工具,目标架构为Arm,设定各默认配置为 nano 的spiflash支持版
    # 若不带spi-flash的板子,请换成 licheepi_nano_defconfig
  • make ARCH=arm menuconfig   # 进行可视化配置
  • 若提示没有curses.h,则需安装libncurses5-dev库
    sudo apt-get install libncurses5-dev
  • 执行编译
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8   # -j8 指8线程编译
  • 若提示recipe for target 'scripts/dtc/pylibfdt/_libfdt.so' failed, 缺少python库
    apt-get install swig python-dev python3-dev

4. 升级gcc版本

  • 在执行make 时出现报错:Your GCC is older than 6.0 and is not supported ubuntu update gcc-6.1
  • 解决方法:更新GCC
  • 方法一  下载并自己编译
    (1)wget http://ftp.gnu.org/gnu/gcc/gcc-6.1.0/gcc-6.1.0.tar.gz   #下载压缩包,可到windows下下载
    (2)tar -zvxf gcc-6.1.0.tar.gz --directory=/usr/local/                    #解压到 /usr/local目录下
    (3)cd /usr/local/gcc-6.1.0                                                          #进入目录
    (4)sudo ./contrib/download_prerequisites                                #下载所需要的文件
    (5)sudo mkdir build                                                                  #创建build目录
    (6)cd build                                                                                #进入build迷了路
    (7)sudo ../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib  #生成Makefile
    (8)sudo make -j4                                                                      #执行make 过程很慢,耐心等待
    (9)sudo make install                                                                 #执行make install
  • 方法二  下载ubuntu打包好的gcc
    (1)添加ppa到库
             sudo add-apt-repository ppa:ubuntu-toolchain-r/test
             sudo apt-get update
    (2)安装最新版本的gcc9
             sudo apt-get install gcc-9 g++-9
             sudo apt-get install gcc-9 g++-9
    (3)更新系统(可选)
             sudo apt-get upgrade
    (4)强制更新软件包到最新版本,并解决缺少的依赖包
             sudo apt-get dist-upgrade
    (5)刷新db并locate
             sudo updatedb
             sudo ldconfig
             locate gcc | grep -E "/usr/bin/gcc-[0-9]"          #此指令可查看所有安装的gcc版本
             locate g++ | grep -E "/usr/bin/g\+\+-[0-9]"       #此指令可查看所有安装的g++版本
    (6)切换gcc/g++版本
             我们正常使用的gcc/g++其实都是/usr/bin/gcc/usr/bin/g++, 他们指向了/usr/bin下真正版本的gcc/g++程序
             cd /usr/bin
             sudo rm gcc
             sudo ln -s gcc-9 gcc
             sudo rm g++
             sudo ln -s g++-9 g++
    (7)查看当前gcc/g++版本
             gcc  -v
             g++  -v

5 uboot编译总结

  • (1) 需要安装交叉编译器
  • (2) 需要安装python库
  • (3) 需要匹配的gcc编译器版本
  • (4) 根据编译时的提示信息,安装其他缺少的库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值