http://my.unix-center.net/~Simon_fu/?p=363
最近正在移植了Android到Mips的机顶盒平台中,目前已经编译出image文件了,经过裁剪也要30M左右。但是我们平台ROM只有16M,RAM很大(大于128M)。不可能把image烧录到ROM中。后来我想出了一个办法来解决这个问题。把Image存放在设备的U盘中(平台支持USB),然后写一个小程序烧录到ROM中,这个小程序的作用就是加载U盘中的Image文件到RAM的指定地址(比如0×8000000),然后把跳转到该地址执行,相当于汇编语言的JMP的作用。这样Linux就可以引导启动了。
读取U盘中Image文件到指定位置,用标准C的IO(fopen,fread,fclose)就可以搞定,这里需要注意的一点,由于是嵌入式设备,不可能一次把image全部读出的,需要设置一个buffer大小循环读出。简单写一点儿示例代码:
int read_cnt = 0; FILE *img_file = fopen(IMG_FILE, "rb"); /* IMG_FILE is the path of the image */ unsigned char * p = IMG_ADRR; /* IMG_ADRR is the address of the image */ /* BUF_SIZE is the buffer size to read from image a time */ while((read_cnt = fread(p, 1, BUF_SIZE, img_file)) > 0) p += read_cnt;
剩下的问题是怎样让程序跳转到IMG_ADRR去执行呢?在汇编语言里面很简单,用JMP,CALL就可以搞定。C语言中如何实现呢?我想到了函数指针。通过定义一个函数指针,然后给函数指针赋值成IMG_ADRR,然后执行这个函数,就可以跳转到该地址执行了。
typedef void (* load_entry)() load_entry img_entry = (load_entry)IMG_ADDR; img_entry();