调试kernel的时候。我先通过启动uboot
随后使用fatload命令从sd卡中加载kernel.然后使用bootz跳转到kernel入口点执行。
比如
fatload mmc 0:1 0x800000 kernel.img
表示从mmc 0 的第1个分区加载kernel.img到地址 0x800000
然后
bootz 0x800000 表示跳转到0x800000启动内核
因为如果直接调试kernel的时候要设置r1 r2关闭mmu这些,比较麻烦。
每次编译调试都要重新插拔sd卡拷贝kernel然后再调试。
发现了uboot有从内存拷贝数据到文件的功能。
所以可以通过jlink先下载文件到内存。然后再使用uboot的fatwrite功能把数据写入sd卡
前提是使用jlink配置好jlinkgdbserver 使用gdb
第一:启动uboot进入命令行状态
第二:暂停cpu运行
第三:使用jlink的loadbin命令
(为了使下载速度快一些。必须先使用jlink的speed命令设置频率)
在gdb中
monitor speed 4000
设置传输频率为4000khz
monitor loadbin /home/user/kernel.img 0x700000
使用loadbin命令从本机的目录下载 kernel.img到内存地址0x700000上。这个地址要是可以使用的sdram地址。并且不能踩到uboot的内存和其他地方。也就是
只能是不被其他任何地方使用内存。
执行命令后由于jlink下载需要时间。所以gdb可能会出现短暂的错误提示Ignoring packet error, continuing...
这个不用管。等待下载完毕后会提示下载成功并且显示下载的字节数目
Binary file loaded successfully (2593524 bytes downloaded)
第四:使用fatwrite 命令保存文件
在uboot命令行中
fatwrite mmc 0:1 0x700000 kernel.img 0x2792f4
表示从地址0x700000 dump 0x2792f4字节大小的内存保存到 mmc0的第一分区命名为kernel.img
这样bin就下载到sd卡上了 。不用每次都插拔sd卡拷贝bin了
如果是每次编译立马调试。就只需要使用loadbin加载到内存就行了。不用dump到sd卡里面保存文件。