23.最小uboot的笔记

本文详细介绍了从零开始编写Bootloader的步骤,以U-Boot为例,涉及初始化SDRAM、NANDFlash、串口、内核加载及参数传递等关键环节。理解这些基础知识对于裸板编程至关重要,特别是对内核启动参数ATAGS的构造和传递。通过这样的实践,可以为后续的嵌入式系统开发打下坚实基础。
摘要由CSDN通过智能技术生成

自己写 bootloader_漫不经心-CSDN博客_自己写bootloader

从零开始写一个简单的bootloader(1)_lee_jimmy的博客-CSDN博客_bootloader开发

从零开始写一个简单的bootloader(2)_lee_jimmy的博客-CSDN博客_从零编写bootloader

u-boot(五)内核启动 - zongzi10010 - 博客园

大神们已经写得很详细,俺按自己实验和看资料的印象写一遍,加深巩固。

uboot可以说是裸板的集大成者,把uboot搞通了裸板就基本入门,剩下的不外乎各种外设的操作,那些看手册就可以。

uboot的最终目的是为了把nandflash中的内核加载到sdram运行,只要实现这个目标,最小的uboot就完成。

从目的倒退的话:

1.为了读取nandflash中的内核到sdram,需要初始化sdram和nandflash

2.为了初始化sdram和nandflash,就得配安置好单板环境,关看门狗,时钟设置。如果代码过于庞大或者程序是从norflash开始启动的,就得进行代码重定位

3.代码重定位到sdram中,需要人为分配好sdram的空间的使用情况,内核空间、根文件系统空间、栈空间、内核信息空间等不能重叠。

4.内核启动需要打印信息,就要初始化串口

5.完成以上操作后,把内核需要的信息传到内核参数区域,最后执行theKernel()函数,把控制权交给内核即可。

一些注意点:

1.配置生成的内核是zImage,zImage=64字节头部+uImage(真正的内核)。要注意程序是跳转到zImage还是直接跳到 uImage 启示地址。如果程序需要头部的信息做一些事情跳转到zImage,最后启动内核时还需要进行64字节的偏移。如果不需要头部,直接跳到uImage的地址即可,或者拷贝到sdram时不带头部,所以nand_read的起始位置是0x60000+64。

头部用来告诉 uboot 内核的信息,比如版本号、加载地址、链接地址、编译时间等。

2.启动内核时传递给内核的参数有3个,第一个默认0,第二个是机器ID,内核会根据ID判断该单板是否支持内核,第三个是 tag 的地址。

3.tag的放置方法,可以参考 uboot ,必须以 ATAG_CORE 类型的开头,以 ATAG_NONE 类型的结尾。最少包含四个:setup_start_tag()、setup_memory_tags、setup_commandline_tag()、
setup_end_tag()。

setup_start_tag()是标注开始位置的参数

setup_memory_tags()是内存的参数

setup_commandline_tag()是内核启动命令的参数

setup_end_tag()表示结束。

四个tag()函数使用params = tag_next (params);进行拼接,params是一个 tag结构体

上面的一切都完成,就可以进行最后的步骤:

一个函数指针,只要把一个函数的首地址赋予这个函数指针,我们就可以通过这个函数指针运行某个函数。因此:

函数的名字其实就是一个地址值,我们前面已经把内核拷贝到内存0x3000800的地方,只要将这个地址值赋给函数指针变量thekernel。我猜0x3000800也就是内核启动函数的首地址(内核自己的0地址位置)。

把机器ID,刚才设置好tag的起始地址传给thekernel函数。 362就是单板的ID,这个需要在uboot内查。0x30000100是tag的起始地址,内核会到这里读取信息。

自此uboot的寿终正寝,控制权交给了内核。

更复杂的uboot无非就是最小uboot里增加网卡等功能

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值