最近在学习嵌入式Linux驱动开发,用的是qt210的板子,碰到了一个问题,试过各种方法都没有解决。
问题:ubuntu下编译好uboot和内核zImage,uboot直接烧写到sd卡中,然后利用uboot和tftp服务下载zImage到内存,下载成功了。但当执行bootm 20008000时,minicom中卡在boot with zImage,就没有下文了。
我重新编译了很多次uboot和zImage,甚至更换了linux系统,都还是一样的现象。实在无奈,对uboot又不了解,所以决定学习一下。学完再研究一下内核方面的知识。希望能解决这个问题。
如果有大神知道是什么原因,希望能给我留个言,不甚感激。
以下内容可能大部分来自网络或者书籍,本人仅是在学习过程做笔记。
1. uboot官方下载地址
ftp://ftp.denx.de/pub/u-boot/
2. uboot目录结构(最新版)
目录 |
说明 |
board | 与开发板相关,每种开发板对应其中一个子目录 |
common |
实现uboot命令行下支持的命令,每条命令都对应其中一个文件 |
cpu |
与CPU相关,每种CPU对应其中一个子目录 |
disk |
对磁盘的支持 |
doc |
文档目录 |
drivers | uboot支持的设备驱动程序都放在该目录 |
fs |
支持的文件系统 |
include |
uboot使用的头文件,还有支持各种硬件平台的汇编文件、系统的配置文件和对文件系统支持的文件。其中子目录configs存放与开发板相关的配置头文件,子目录asm存放与CPU体系结构相关的头文件 |
lib |
与体系结构相关的库文件 |
net |
网络协议相关代码 |
tools |
生成uboot的工具 |
3. uboot启动的两个阶段
uboot启动分为两个阶段。第一阶段使用汇编来实现,它完成一些依赖于CPU体系结构的初始化,并调用第二阶段的代码。第二阶段则通常使用C语言来实现,这样可以实现更复杂的功能,而且代码会有更好的可读性和可移植性。
3.1 第一阶段
3.2 第二阶段
3.3 将内核存放在适当的位置后,直接跳到它的入口点即可调用内核,调用内核之前,下列条件要满足
(1)CPU寄存器的设置
(2)CPU工作模式
(3)Cache和MMU的设置
4. uboot引导内核分析
4.1 bootm命令使用方法:bootm [address] zImage
4.2 bootm命令在common/cmd_bootm.c中由do_bootm函数实现。
bootm获取当前内核的地址,默认地址或者bootm的第一个参数。默认的加载地址或传递给bootm命令的地址(优先)与实际的内核存放地址需要一致。