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

共108条 2/11 1 2 3 4 5 6 ›| 跳转至
菜鸟
2004-05-12 00:29:00     打赏
11楼
以下是引用lisim51在2004-5-11 15:03:00的发言:
从那里可以找到内核的压缩和解压缩的源码?找了半天,累死了。现在还有twentyone 这么好的人啊,我们科技兴国的目标可以实现了!呵呵
压缩的话,用linux下的gzip就行了,要在bootloader里解压缩的话,可以到bios的源代码里找gunzip.c 和 gunzip.h,我上载了,你下载吧:
[upload=rar]viewFile.asp?ID=3036[/upload]

菜鸟
2004-05-12 05:45:00     打赏
12楼
是的,image.rom已经包含了bootloader,可以直接少写到flash 0x0地址上,上电后就会直接运行了。因为bootloader在合并image.ram的时候对内核进行了压缩,所以需要解压缩。 其实你可以认为image.rom = image.ram + bootloader [align=right][color=#000066][此贴子已经被作者于2004-5-11 21:46:50编辑过][/color][/align]

菜鸟
2004-05-12 06:27:00     打赏
13楼
ha以下是引用ygqing_fen在2004-5-11 22:13:00的发言:
引用:因为kernel[]这个数组是一个全局变量,所以肯定是被放到RW段去了。所以,在remap后,先把RW段拷贝到RW_BASE的位置上去,设置好堆栈指针,就可以调用loadkernel函数了,这个函数会把knerle[]这个数组(其实就是内核image.ram)拷贝到0x8000的位置上去,然后跳转过去就可以启动了。 这就是说kernel[]这个内核是放在RW里面了,那么在flash里面放的就只有RO和RW两部分了,而RO的任务就是完成系统初始化,REMAP,把RW的内容拷贝到SDRAM中,最后跳到loadkernel函数中去, 是这样的吗?谢谢! 过程基本是这样的
[align=right][color=#000066][此贴子已经被作者于2004-5-11 22:27:45编辑过][/color][/align]

菜鸟
2004-05-12 06:31:00     打赏
14楼
以下是引用gaochaor在2004-5-11 21:53:00的发言:
image.rom可以自己重新映射RAM到0X00地址吗?它怎么知道板子的RAM是多大,Flash是多大呢? 是不是需要自己在编译时配置呢? 还有一问:既然image.rom可以直接用,那么用自己写的Bootloader+image.ram的方式是处于什么目的呢? 呵呵手头没有板子,只能多问了 FLASH, SDRAM的大小都是要预先定义好的。 其实自己尝试写一个bootloader也是一个学习过程。 image.rom其实包含了一个bootloader叫bios(专门为4510开发的),这个bootloader是linux_tao大侠写的,功能很强大。

菜鸟
2004-05-12 22:39:00     打赏
15楼
以下是引用ygqing_fen在2004-5-12 14:20:00的发言:
如果是这样的话,那就是把flash中的全部内容拷贝到SDRAM里了,把RW部分拷贝到RW_base开始的地方,而把R0部分拷贝到SDRAM的基地址,因为image.ram是从0x8000处开始运行的,在映射之后,R0部分应该在0x0000到0x8000这段区间内,是这样的吗?谢谢! 是的

菜鸟
2004-05-12 22:42:00     打赏
16楼
以下是引用ygqing_fen在2004-5-12 14:29:00的发言:
因为我现在还没有看程序,所以问的问题可能初级,请大家莫怪。因为在SDRAM的0x0000处应该放中断向量才是,肯定放的不是BOOTLOADER的的R0部分,那么这一部分又放到哪儿去了呢?我用的是sc44b0的开发板,它是不支持remap的,所以要把中断向量放在flash的起始地址,这是不是意味着我在flash的0地址应放一条跳转语句,跳到BOOTLOADER的的R0部分?
系统起来以后在SDRAM的地址0x0处放的应该是中断向量,这是由操作系统完成的,所以在bootloader里不用管它。其实在把image.ram装载到0x8000后,bootloader就没有作用了,所以bootloader RO段占用的地方会被内核覆盖掉了。

菜鸟
2004-05-13 10:08:00     打赏
17楼
以下是引用lisim51在2004-5-12 17:05:00的发言:
问一个不好意思地问题:我看part4部分 ;****************************************************************
;Initalize the memory as followa:
; FLASH @ 0 ~ 2 M
; SDRAM @ 2 ~ 18M
; ;/*************************************************************************/
; /* SYSTEM MEMORY CONTROL REGISTER EQU TABLES */
; /*************************************************************************/ ;***************Init***************
;rEXTDBWTH EQU 0x00003001
;rROMCON0 EQU 0x02000060
;rROMCON1 EQU 0x60
;rROMCON2 EQU 0x60
;rROMCON3 EQU 0x60
;rROMCON4 EQU 0x60
;rROMCON5 EQU 0x60
;rSDRAMCON0 EQU 0x12008380
;rSDRAMCON1 EQU 0x00
;rSDRAMCON2 EQU 0x00
;rSDRAMCON3 EQU 0x00
;rSREFEXTCON EQU 0xCE278360 LDR r1, =rEXTDBWTH ;EXTDBWTH
LDR r2, =rROMCON0 ;ROMCON0 @ 0M ~ 2M
LDR r3, =rROMCON1 ;ROMCON1 @ DISABLED
LDR r4, =rROMCON2 ;ROMCON1 @ DISABLED
LDR r5, =rROMCON3 ;ROMCON1 @ DISABLED
LDR r6, =rROMCON4 ;ROMCON1 @ DISABLED
LDR r7, =rROMCON5 ;ROMCON1 @ DISABLED
LDR r8, =rSDRAMCON0 ;SDRAMCON0 @ 2M ~ 18M
LDR r9, =rSDRAMCON1 ;SDRAMCON1 @ DISABLED
LDR r10,=rSDRAMCON2 ;SDRAMCON2 @ DISABLED
LDR r11,=rSDRAMCON3 ;SDRAMCON3 @ DISABLED
LDR r12,=rSREFEXTCON

LDR r0, =ARM7_EXTDBWTH //最后这两句话怎么理解阿? STMIA r0, {r1-r12} //EXTDBWTH是个寄存器,怎么能把R1-R12写进去 对寄存器ROMCON0写入0x02000060,其中[19:10]该设置值左移16位即为FLASH的起始地质。这一共9位,怎么左移16位?怎么确定REMAP后的地质? 问题比较初级,耽误了您的时间?谢谢! STMIA r0, {r1-r12} STMIA是批量存储指令,通过一条指令可以实现多过存储。

菜鸟
2004-05-13 10:10:00     打赏
18楼
以下是引用lisim51在2004-5-12 17:14:00的发言:
我知道了,EXTDBWTH 和后边的寄存器地置是连着的,08,0C,10,14,,,,,,, 我现在还有点不明白的是 对寄存器ROMCON0写入0x02000060,其中[19:10]该设置值左移16位即为FLASH的起始地质。这一共9位,怎么左移16位?怎么确定REMAP后的地质? 另外,我没找到SREFEXTCON这个寄存器,只有REFEXTCON这个寄存器。 我看得是ARM应用系统开发详解--基于S3C4510的系统设计
不好意思,是我写错了,只有REFEXTCON这个寄存器[em04]

菜鸟
2004-05-13 10:12:00     打赏
19楼
以下是引用ygqing_fen在2004-5-12 22:14:00的发言:
对part7部分,我看了N久,但总是琢磨不透,不知哪位高手可以帮忙解释一下,万分感激!你自己可以用ADS调试跟踪一下

菜鸟
2004-05-31 22:04:00     打赏
20楼
以下是引用duyunhai在2004-5-28 14:43:00的发言:
前面已经定义了void (*fp)(void); 即fp是一个函数指针,指向的函数返回类型是void,参数类型也是void (void (*)(void))是一个强制类型转换,将0x8000这个常数转化为一个指向函数的地址,这个函数和上面定义fp是一样的,并将该值赋给fp 而后用(*fp)(),即可进入0x8000处的函数
揭开疑惑,谢谢杜兄

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

回复

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