C语言实现简易的Bootloader启动Linux

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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值