uboot 启动Linux内核使用bootz命令。当然还有其它的启动命令,例如,bootm命令等等。
本文只分析 bootz命令启动 Linux内核的过程。
本文具体分析 bootz启动 Linux内核过程涉及的一个重要的全局变量 images。
bootm_headers_t images; /* pointers to os/initrd/fdt images */
- typedef struct bootm_headers {
- /*
- * Legacy os image header, if it is a multi component image
- * then boot_get_ramdisk() and get_fdt() will attempt to get
- * data from second and third component accordingly.
- */
- image_header_t *legacy_hdr_os; /* image header pointer */
- image_header_t legacy_hdr_os_copy; /* header copy */
- ulong legacy_hdr_valid;
- .......
- #ifndef USE_HOSTCC
- image_info_t os; /* os image info */
- ulong ep; /* entry point of OS */
-
- ulong rd_start, rd_end;/* ramdisk start/end */
-
- char *ft_addr; /* flat dev tree address */
- ulong ft_len; /* length of flat device tree */
-
- ulong initrd_start;
- ulong initrd_end;
- ulong cmdline_start;
- ulong cmdline_end;
- bd_t *kbd;
- #endif
-
- int verify; /* getenv("verify")[0] != 'n' */
-
- #define BOOTM_STATE_START (0x00000001)
- #define BOOTM_STATE_FINDOS (0x00000002)
- #define BOOTM_STATE_FINDOTHER (0x00000004)
- #define BOOTM_STATE_LOADOS (0x00000008)
- #define BOOTM_STATE_RAMDISK (0x00000010)
- #define BOOTM_STATE_FDT (0x00000020)
- #define BOOTM_STATE_OS_CMDLINE (0x00000040)
- #define BOOTM_STATE_OS_BD_T (0x00000080)
- #define BOOTM_STATE_OS_PREP (0x00000100)
- #define BOOTM_STATE_OS_FAKE_GO (0x00000200) /* 'Almost' run the OS */
- #define BOOTM_STATE_OS_GO (0x00000400)
- int state;
-
- #ifdef CONFIG_LMB
- struct lmb lmb; /* for memory mgmt */
- #endif
- } bootm_headers_t;
成员变量 ep:Linx内核镜像存放的起始地址。
- typedef struct image_info {
- ulong start, end; /* start/end of blob */
- ulong image_start, image_len; /* start of image within blob, len of image */
- ulong load; /* load addr for the image */
- uint8_t comp, type, os; /* compression, type of image, os type */
- uint8_t arch; /* CPU architecture */
- } image_info_t;