jsjlj 发表于 2010-12-20 21:36:03

s3c2440启动代码从flash拷贝到SDRAM上后,地址重映射是怎样的!一直搞不明白这问题!请各

最近正在看S3C2440自带的2440init.s中的启动文件,有一点总是理解不了,请各位侠客指点~在些谢过了~~

ARM启动时总是从0X000地址开始,然后执行到一定程序就把Flash里的启动代码拷贝到SDRAM上来(如:0x30000000),然后PC跳到SDRAM上来继续执行,此时中断向量表也在SDRAM上的0x30000000~0x30000020上了,那在启动程序执行完,假如这时发生IRQ中断,CPU将直接跳到0X00000018处执行,但此时应跳到0x30000018处执行才对。这个实现好像是通过内存重映射机制来实现,可是我看2440init.s的对flash拷贝代码到SDRAM上后没有相关的重映射操作。那发生中断时是怎样跳到SDRAM中的中断向量表来执行的呢!?内存重映射的要怎样做呢,是设置相关寄存器吗?
这两三天都没搞明白这个问题。郁闷~~~请侠客们拨刀相助!!!!!

yankaiyutong 发表于 2011-4-20 19:21:22

我和你有同样的疑问,ATMEL的芯片中有相关寄存器的映射设置。不知道S3C2440中是怎么运行的,难道必须启动MMU的功能?

xiaowei061 发表于 2011-4-25 05:26:19

我也想了半天才明白,原因貌似很简单 - -
还是那4K启动内存,硬件已经帮我们拷贝了...程序链接地址ROBASE是0x30000000,实际我们编译的程序入口地址在0x30000000起始位置,而且中断向量表的指令与地址无关,启动后硬件自动拷贝了前4k程序,刚好与ARM中断向量位置一样,所以不需要地址重映射到0x30000000,里面的跳转地址是0x30000000位置后的中断服务程序。所以程序运行后,那4K内存存储了中断向量,不能修改...至少中向量断。。。。

下面是mini2440 test 代码的地址连接设置,可以看到,链接地址并不是从0开始的。。
http://cache.amobbs.com/bbs_upload782111/files_38/ourdev_633345M0Q0K5.png
mini2440 编译地址 (原文件名:搜狗截图_2011-04-25_05-21-20.png)

gccsky 发表于 2011-7-9 05:13:12

mark

sailen 发表于 2011-7-9 15:27:58

2楼正解,通过编译器设置的

menson 发表于 2011-9-26 23:25:14

回复【2楼】xiaowei061
-----------------------------------------------------------------------

追问一下:你的意思是,把程序下载到nand flash后,从stepstone(0地址)启动,硬件自动把前4K程序copy到链接地址开始的区域了。如果是这样,为什么韦东山《嵌入式LINUX应用完全开发手册》中对sdram的裸机实验中还需要拷贝前4K数据到sdram这一步呢?这是不是多余呢?
我现在有两个版本的理解:
第一,就是如你所说的,只要指定了链接地址,那么拷贝代码到链接地址的工作就不需要我们来做了,想不通的就是韦东山那个拷贝的必要性;
第二,程序一开始应该是在stepstone那里运行,直到这部分程序把数据copy到sdram后,并且mov pc, =on_sdram后,才真正在sdram上面运行。但如果是这样的话,也存在问题:指定链接地址后,应该所有label都以这个地址为基准的,在数据拷贝之前,也会用到label来做跳转,比如关闭看门狗、禁用中断等子程序。那用到这些label不就链接到sdram后面的地址去了?这时sdram还没有拷贝到数据哦。

menson 发表于 2011-9-27 23:36:09

经过网上的资料,终于明白,第二种理解是正确的,但这样不会跳错地址,因为B、BL这些跳转指令是与地址无关的,只是算偏移量来调整。

zuoqiangavr 发表于 2012-10-25 22:53:16

呵呵,谢谢解释!
页: [1]
查看完整版本: s3c2440启动代码从flash拷贝到SDRAM上后,地址重映射是怎样的!一直搞不明白这问题!请各