ZTEXTADDR 在Linux内核中的作用是什么?
从lxr.linux.no开始,它是RAM中的一个地址,它将zImage的地址保存为下面的序列?
:一种。
uImage (DataFlash/NAND) ---load_to_RAM--->
uImage (@ boot_addr) ---decompress_uImage-->
zImage (@ ZTEXTADDR) --- decompress_zImage--->
uncompressed image (@ ZRELADDR).
或只是:
乙
uImage (DataFlash/NAND) ---load_to_RAM--->
uImage (@ boot_addr) ---decompress_uImage-->
uncompressed image (@ ZRELADDR)
在新内核版本中没有使用ZTEXTADDR进行启动过程吗?
答案 0 :(得分:2)
Linux ARM解压缩引导加载程序能够在从RAM运行时重新定位自身。重定位部分是PC相关的,因此可以在任何地址加载。但是,如果您的主图像从FLASH / ROM开始,则代码无法重新定位;在RAM中移动图像是一个简单的memmove()
,它更多地涉及到NOR闪存,而且对于ROM来说是不可能的。
在this case中,compressed boot linker script与 ZTEXTADDR 一起用作解压缩代码的位置。在您的图表中,您有一个 u-boot ,它将加载 uImage 。没有理由直接从Flash / ROM执行此操作。 u-boot 可以将图像复制到RAM中,不需要 ZTEXTADDR 值,它应该保留为零。
如果您的图像直接从Flash / ROM引导,没有引导加载程序,则 ZTEXTADDR 非常有用,
zImage (in flash) --> decompress vmlinux.bin to RAM --> run kernel
zImage 可能需要通过一些芯片设置进行注释才能实现,并且需要 ATAGS 或设备树链接。出于这个原因,boot/compressed中有许多机器变体;这是不可维护的,不鼓励这些类型的文件。通常,另一个引导加载程序将映像加载到RAM, zImage 可以将自身移动到所需的任何目的地;我认为这是你的情况,你应该将 ZTEXTADDR 设置为零并忘记它。