Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15363786
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类:

2008-03-20 09:44:15

obm加载流程
obm前边启动部分__main运行与地址空间无关,__main现检测当前obm是否运行在0x80000000地址,
如果没有运行在该地址,那么调用DDRInit初始化内存,之后调用__CopyDKBOBM将OBM_DKB自己的0x3500*4字节大小
数据(OBM/TAVOR/DDR/xlli_platform_defs.inc)拷贝到0x80000000地址处,执行完毕之后接下来的代码就是__ENABLE_MMU
打开MMU内存映射,之后跳转到0x80000000继续执行,因为MMU已经打开,所以0x80000000映射到了虚拟0地址,
OBM开始在0地址下运行,irq_handler也就可以正常使用,跳转到OBMBootMain开始执行OBM主程序

blob分2段,第1段为start,与地址无关,连接脚本
preview-kit/blob/src/blob$ ll start-ld-script
编译链接地址为0,该start代码运行与地址无关,将由OBM首先加载到0x83000000
,这样start将运行在0x83000000然后start代码将链接到_piggy_start中的
_trampoline,编译地址为BLOB_ABS_BASE_ADDR,也就是0x80040000的blob主体程序
加载到0x80040000地址空间,然后跳转过去执行_trampoline函数,真正启动blob主体程序

因为我们的blob没有实现mmu管理,所以导致我们的blob的zise最大为256K,blob使用obm初始化的虚拟0地址--也就是物理地址0x80000000的DDR地址,作为blob实际运行的起始地址;
0x80000000 ~ 0x80040000    ---> DDR_DKB_OBM    ( 4*64=256K)    0 ~ 0x40000
0x80040000 ~ 0x80100000   ---> DDR_TLB               (12*64=768K)    0x80040000 ~ 0x80100000
0x80100000 ~ 0xC0000000   ---> DDR_Memory        (1023*1M)        没有作任何映射
以上为1G的DDR空间在DKB、OBM和BLOB中的分配图谱


/wtptp_pxa930/DKB/StartUp/dkb_startup.s小写的s是源文件,
然后在wtptp目录下执行make之后,脚本会自动翻译生成
wtptp_pxa930/DKB/StartUp/dkb_startup.S大写的S是源文件,功编译连接使用,所以只能修改小写.s文件
阅读(5761) | 评论(12) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-05-30 13:46:08

------------startup.s------------ __main: 58 B ResetHandler 59 B UndefinedHandler 60 B SwiHandler 61 B PrefetchHandler 62 B AbortHandler 63 NOP @ Reserved Vector 64 B SaveProgramState @ B IRQ Interrupt SaveProgramState 65 B FiqHandler @ FIQ interrupts not anabled USB/UART驱动确实用的是中断传输方式,但是最后都导入startup.s中的中断向量表吗? 请教一下具体是哪个中断入口? SWI?

chinaunix网友2008-05-30 09:48:06

您好: 能否和您探讨一下pxa处理器的启动流程,您用的是TAVOR,我用的是pxa310。上电启动后各个模块的加载顺序: BOOTROM-> DKB ->OBM-> BLOB DKB接收主机发过来的TIM/OBM/BLOB这些镜像文件,将这些文件写入Flash,然后 将控制转给OBM,OBM在根据NTIM的信息,将Flash上blob的镜像写入NTIM中指定的load_addr,这个地址是在内存中。 整体流程就是这样,但是仔细看汇编代码发现: DKB在ISRAM中运行,为什么它要复制自身到DDR,打开MMU后在接收PC发过来的镜像文件,直接在ISRAM中运行不可以吗?在ISRAM中不也可以访问DDR内存吗? OBM也是按照DKB这样的方法,先从ISRAM中运行,在复制自己到DDR,找到NTIM中指定的BLOB信息后有复制自己到ISRAM,接着把BOLB复制到内存,打开MMU,直接跳到内存开始执行BLOB。 总而言之,我觉的DKB、OBM应该和成一个,要么在ISRAM中运行,要么在DDR中运行。功能就是接收PC发的NTIM/BLOB这些镜像文件,存在DDR中的起始地