这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 下载专区 » [原创]4510 bootloader的实现与分析 (附源代码)

共108条 1/11 1 2 3 4 5 6 ›| 跳转至

[原创]4510 bootloader的实现与分析 (附源代码)

菜鸟
2004-05-03 19:30:38     打赏
前段时间自己写了个简单的bootloader,这几天写了个实现和分析的文档,希望对大家有帮助。
欢迎访问我的BLOG: Http://twentyone.blogchina.com

分析文档下载:
[upload=rar]viewFile.asp?ID=2981[/upload]

源代码下载:
[upload=rar]viewFile.asp?ID=2982[/upload]

Bin2c工具下载:
[upload=rar]viewFile.asp?ID=2983[/upload]


[align=right][color=#000066][此贴子已经被作者于2005-11-2 14:18:22编辑过][/color][/align]



关键词: 原创     bootloader     实现     分析     源代码    

菜鸟
2004-05-04 22:48:00     打赏
2楼
part5这部分代码的目的就是要把整个bootlaoder拷贝到sdram里去,包括RW段和RO段。在程序里,RO BASE = 0X0, RW BASE = 0XA00000, 这里需要注意一个问题:在编译链接好的程序里面,RW段是放置在RO段后面的,所以|Image$$RO$$Limit|既是RO段的结束位置也是RW段的起始地址。 而RW BASE是指在运行的时候RW段的地址,因为运行时我们需要把RW段拷贝到memory里可读写的存储介质上去,所以RW BASE 被设置为 0XA00000. 所以,RW BASE 大于2M并不是个问题。 其实你也可以开始指把RO段拷贝到SDRAM里去,回头在从flash里把RW段拷贝到合适的位置上去,但为了使得实现更简单和直接,我没有这样做,而是一口气就把整个bootloader拷贝到sdram里去了,回头就不用在管flash了。在remap后再把RW段从SDRAM里拷贝到SDRAM合适的位置去。 因为kernel[]这个数组是一个全局变量,所以肯定是被放到RW段去了。所以,在remap后,先把RW段拷贝到RW_BASE的位置上去,设置好堆栈指针,就可以调用loadkernel函数了,这个函数会把knerle[]这个数组(其实就是内核image.ram)拷贝到0x8000的位置上去,然后跳转过去就可以启动了。 希望能够解释清楚,如果有问题请发贴继续讨论。

菜鸟
2004-05-04 23:14:00     打赏
3楼
不客气,希望对你有帮助!

菜鸟
2004-05-05 05:20:00     打赏
4楼
以下是引用mala在2004-5-4 20:46:00的发言:
编译出来有1M多,怎么会如此大呢?
是的,大概有1M多。为了简单起见,在把image.ram转化为char数组前并没有把image.ram先压缩一下,所以编译出来比较大。如果你感兴趣的话,可以自己把压缩和解压缩添加进去,网上找的到压缩和解压缩的源代码,应该挺容易实现的。

菜鸟
2004-05-07 04:12:00     打赏
5楼
以下是引用chhhhhhhhh在2004-5-6 16:43:00的发言:
非常清楚的說明。另外有個問題想請教,在 load kernal 完成後,uClinux kernal 會在位址 0x0 重設中斷向量嗎? thks
bootloader里不用管中断。但在kernel起来后,kernel自己肯定会设置中断向量的。

菜鸟
2004-05-08 00:16:00     打赏
6楼
以下是引用gaochaor在2004-5-7 16:10:00的发言:
呵呵,很不错呀!真是好人! 现在有一个问题: 在loadkernel.c中2097152你是怎么计算出来的呢?也就是uclinux内核字节的大小。 for(i = 0; i < 2097152; i++){
*to = *from;
to++;
from++;
} 我通过ultraEdit计算出来的是:2732523,好像差别蛮大呀?敢问大侠如何计算? 再次谢谢了! 其实在这个地方我偷了个懒,呵呵,直接设置成2M了,因为flash的大小就是2M。 [em04] [align=right][color=#000066][此贴子已经被作者于2004-5-7 16:16:35编辑过][/color][/align]

菜鸟
2004-05-08 07:30:00     打赏
7楼
这里设置的堆栈指针只是bootloader用的,可以随便设置在那里(SDRAM or SRAM),只要不占用0x8000开始的那块SDRAM就可以了。 因为必须把kernel转载到0x8000处,所以我把堆栈指针设置在了SDRAM的高端。

菜鸟
2004-05-08 22:50:00     打赏
8楼
以下是引用gaochaor在2004-5-7 16:33:00的发言:
请问那个bin2c的软件,原理是什么?功能是把一个二进制的文件按字节存储在一个数组中。能否将一个图片保存在一个数组中?你有bin2c的源代码吗?我没有源代码,但我想应该可以把图片转换成一个数组的。

菜鸟
2004-05-11 22:01:00     打赏
9楼
以下是引用twentyone在2004-5-7 23:30:00的发言:
这里设置的堆栈指针只是bootloader用的,可以随便设置在那里(SDRAM or SRAM),只要不占用0x8000开始的那块SDRAM就可以了。 因为必须把kernel转载到0x8000处,所以我把堆栈指针设置在了SDRAM的高端。
为什么必须把kernel转载到0x8000处?见笑[em04]

菜鸟
2004-05-11 22:09:00     打赏
10楼
这是内核要求的。

共108条 1/11 1 2 3 4 5 6 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]