其实我所希望的是:拿到一颗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) 根据编译时的提示信息,安装其他缺少的库
本文详细介绍了U-Boot的作用、启动过程,包括硬件初始化、内核加载等,并分享了下载、安装交叉编译器以及编译U-Boot的步骤,强调了在编译过程中可能遇到的GCC版本问题及其解决方案。

9011

被折叠的 条评论
为什么被折叠?



