bootloader加载kernel image 函数

本文介绍了bootloader如何加载kernel image的过程,重点解析了loadImage()函数,该函数负责从nandflash的特定起始地址到结束地址读取kernel映像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面是一个bootloader加载一个kernel image的函数

1.  loadImage()  --- 参数是nandflash 中的起始地址和结束地址

uint32_t loadImage(uint32_t start, uint32_t end)                
{       
        image_header_t *header = (image_header_t *) nandPage;   
        uint8_t *src = (uint8_t *) nandPage;                    
        uint8_t *dst;
        uint32_t page = PAGE(start);                            
        uint32_t endPage = PAGE(end);                           
        uint32_t crc;
        
        //读nandflash中的内容
        page = ReadNandPages(page, src, 1, endPage);    
        if (!page)
        {
                puts("ERROR: Cannot read header page\r\n");
                return ~0;
        }

        //然后开始校验是不是标准的kernel image
        if (ntohl(header->ih_magic) != IH_MAGIC)
        {
                puts("ERROR: Header magic mismatch\r\n");
                return ~0;
        }

        switch (header->ih_os)
        {
        case IH_OS_LINUX:
                isUboot = 0;
                break;
        case IH_OS_U_BOOT:
                isUboot = 1;
                break;
        default:
                puts("ERROR: Unsupported OS type\r\n");
                return ~0;
        }

        if (header->ih_arch != IH_ARCH_ARM) {
                puts("ERROR: Unsupported ARCH type\r\n");
                return ~0;
        }

        if (header->ih_type != IH_TYPE_KERNEL) {
                puts("ERROR: Unsupported Image type\r\n");
                return ~0;
        }
        puts("Image: ");
        puts(header->ih_name);
        puts("\r\n");

        src += sizeof(image_header_t);
        dst = (uint8_t *) ntohl(header->ih_load);

        switch (header->ih_comp) {
        case IH_COMP_NONE:
        {
                const int inSRAM = PAGE_SIZE - sizeof(image_header_t);
                memcpy(dst, src, inSRAM);
                dst += PAGE_SIZE - sizeof(image_header_t);

                page = ReadNandPages(page, dst, PAGE(ntohl(header->ih_size) - inSRAM), endPage);
                if (!page)
                {
                        puts("ERROR: problem reading NAND\r\n");
                        return ~0;
                }

                // Calculate CRC
                dst = (uint8_t *) ntohl(header->ih_load);
                crc = crc32(0, dst, ntohl(header->ih_size));
                break;
        }
        default:
                puts("ERROR: Unsupported compression\r\n");
                return ~0;
        }

        // Verify CRC
        if (ntohl(header->ih_dcrc) != crc) {
                puts("ERROR: CRC mismatch\r\n");
                return ~0;
        }

        return ntohl(header->ih_ep);
}

2.  image_header_t --- 用mkimage 做出来的image 都会有这个头。

typedef struct image_header
{               
        uint32_t ih_magic;                                      /* Magic Number */
        uint32_t ih_hcrc;                                       /* Header CRC */
        uint32_t ih_time;                                       /* Creation Timestamp */
        uint32_t ih_size;                                       /* Image Size */
        uint32_t ih_load;                                       /* Address to put image */
        uint32_t ih_ep;                                         /* Address to jump to */
        uint32_t ih_dcrc;                                       /* Image CRC */
        uint8_t ih_os;                                          /* OS */
        uint8_t ih_arch;                                        /* CPU arch */
        uint8_t ih_type;                                        /* Type */
        uint8_t ih_comp;                                        /* Compression */
        uint8_t ih_name[IH_NMLEN];                      /* Name */
} image_header_t;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值