"Miz-702-u-boot笔记详细解析了米联科Zynq7000系列开发板中u-boot的启动流程,包括关键的代码分析,特别是对start.S中的初始化步骤进行了深入探讨。文章指出_u-text_base变量位于DDR内存的起始地址,而_bss_start_ofs、_image_copy_end_ofs、_bss_end_ofs和_end_ofs等变量用于定义数据段的位置。此外,还提到了IRQ和FIQ堆栈的设置。"
在Zynq7000系列的u-boot启动过程中,start.S是整个程序执行的第一步。这个汇编语言文件包含了初始化的必要步骤,它定义了一些关键的全局变量,这些变量对于正确加载和定位代码和数据至关重要。
首先,全局变量_TEXT_BASE定义了u-boot代码的基地址,这个地址通常被配置为DDR内存的起始地址0x04000000。这个地址在zynq_common.h通过CONFIG_SYS_TEXT_BASE宏进行设定,而具体的值在zynq_zed.h中给出。这个地址作为代码的入口点,是后续执行的基础。
接着,_bss_start_ofs、_image_copy_end_ofs、_bss_end_ofs和_end_ofs这些变量用于确定数据段的边界。它们分别表示BSS段的开始偏移量、已初始化数据段的结束偏移量、BSS段的结束偏移量以及整个程序的结束偏移量。这些偏移量是在链接脚本u-boot.lds中根据各个段的大小计算得出,确保在运行时能正确地初始化和清理BSS段(未初始化的数据段)。
在启动过程中,中断处理机制的初始化也是重要环节。全局变量IRQ_STACK_START和FIQ_STACK_START分别定义了中断服务例程(IRQ)和快速中断服务例程(FIQ)的堆栈起始位置。这两个初始值通常是0x0badc0de,一个特定的调试值,实际运行时会被动态计算并替换为实际的堆栈地址,以确保中断处理时有足够的堆栈空间。
最后,IRQ_STACK_START_IN是IRQ堆栈的入口地址,它在堆栈初始化时也会被计算并设置为合适的值,通常比IRQ_STACK_START多8个字节,这8个字节可能用于存放中断处理前的状态保存信息。
Miz-702-u-boot笔记详细阐述了u-boot在Zynq7000开发板上的启动流程,特别是涉及代码定位、数据段管理和中断堆栈初始化的关键步骤,这对于理解u-boot的工作原理和进行定制化开发具有重要意义。