Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15363787
  • 博文数量: 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文件
阅读(5762) | 评论(12) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-07-09 09:14:49

谢谢您

chinaunix网友2008-07-08 12:30:05

blob分为两个阶段,stage_1和stage_2 stage_1 负责初始化和体系结构相关的内容,然后把stage_2的代码拷贝的内存指定的0x80100000中开始执行,trampoline清理数据段后就跳到第二阶段的C代码去了(main.c 中的main函数),博主您的意思是OBM中已经将0x8010000这个地址映射到了0x0地址吗,我看了一下OBM的代码, ----OBM/MHLV/memmap.INC---- .equ DDR_DKB_PHYSICAL, 0x80000000 @ 256 KB Remapped to 0 .equ DDR_DKB_VIRTUAL, 0x0 .equ TLB_BASE_PHYSICAL, 0x80040000 .equ TLB_BASE_VIRTUAL, 0x80040000 .equ DDR_PHYSICAL, 0x80100000 @ ~127 MB .equ DDR_VIRTUAL, 0x8010000

chinaunix网友2008-07-07 16:04:07

////////////////////////////////////////////// 对于blob使用的irq中断,将直接使用OBM的irq_handler(), 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中的分配图谱 博主您好,和您探讨一个问题,为什么blob将自己复制到DDR时是从0x8010_0000开始的,而不是从0x8000_0000开始,也就是说把OBM的代码和页表还保留在内存开始的1M有什么用处吗? /////////////////////

chinaunix网友2008-05-30 21:40:10

B SaveProgramState @ B IRQ Interrupt SaveProgramState 没看到这个 呵呵

chinaunix网友2008-05-30 21:19:10

看了一下datasheet,硬件上的流程是这样的: 所有的中断源最后都通过中断控制器仲裁后导入IRQ/FIQ 你说的SaveProgramState是代码上的实现。 真相终于大白了 多谢博主点拨 祝好:)