wcapc
驱动牛犊
驱动牛犊
  • 注册日期2001-12-07
  • 最后登录2010-04-18
  • 粉丝0
  • 关注0
  • 积分220分
  • 威望22点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
阅读:3409回复:13

我的系统不能跳到NK.nb0去执行,请问从Eboot到NK.nb0的过程是怎么样的?

楼主#
更多 发布于:2007-02-13 12:22
  从Eboot执行后,跳到NK.nb0是如何实现的?
天行健,君子以自强不息
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-02-13 20:24
跳到OS的起始地址,DOWNLOAD时把OS放在哪,跳到那就好了.
不一定是没有跳过去,可能是跳过去以后就死了.
学海无涯
wcapc
驱动牛犊
驱动牛犊
  • 注册日期2001-12-07
  • 最后登录2010-04-18
  • 粉丝0
  • 关注0
  • 积分220分
  • 威望22点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-02-14 15:56
我是用烧录器烧录进去flash的,
请问OS起始位置与Flash的地址有何关联?
天行健,君子以自强不息
panzhenjie
驱动牛犊
驱动牛犊
  • 注册日期2005-02-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望69点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-02-14 16:48
OS是在FLASH里面的啊
wcapc
驱动牛犊
驱动牛犊
  • 注册日期2001-12-07
  • 最后登录2010-04-18
  • 粉丝0
  • 关注0
  • 积分220分
  • 威望22点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-02-15 17:06
我是问Eboot如何Jump到NK.bin的?
天行健,君子以自强不息
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-02-16 20:52
EBOOT中有个OEMLauch函数,一般就是从那跳转的.

一般的做法是,EBOOT把OS放到它已知的一个地址上,然后跳转到那个地址.而OS的第一条指令就是跳转到4K之后.
学海无涯
wcapc
驱动牛犊
驱动牛犊
  • 注册日期2001-12-07
  • 最后登录2010-04-18
  • 粉丝0
  • 关注0
  • 积分220分
  • 威望22点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-02-22 17:13
引用第5楼microsun2007-02-16 20:52发表的“”:
EBOOT中有个OEMLauch函数,一般就是从那跳转的.

一般的做法是,EBOOT把OS放到它已知的一个地址上,然后跳转到那个地址.而OS的第一条指令就是跳转到4K之后.



请问有无一个实例的例子啊?谢谢了啊
天行健,君子以自强不息
rilyyu
驱动小牛
驱动小牛
  • 注册日期2006-11-17
  • 最后登录2010-08-17
  • 粉丝0
  • 关注0
  • 积分512分
  • 威望130点
  • 贡献值0点
  • 好评度127点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-02-23 23:19
ALIGN
    LEAF_ENTRY Launch
  
    ; r3 now contains the physical launch address.
    ;
    mov     r3, r0

    ; Compute the physical address of the PhysicalStart tag.  We'll jump to this
    ; address once we've turned the MMU and caches off.
    ;
    stmdb   sp!, {r3}
    ldr     r0, =PhysicalStart
    bl      OALVAtoPA
    nop
    ldmia   sp!, {r3}
    
    ; r0 now contains the physical address of 'PhysicalStart'.
    ; r3 now contains the physical launch address.
  
    ; Next, we disable the MMU, and I&D caches.
    ;
    mov     r1, #0x0078
    mcr     p15, 0, r1, c1, c0, 0

    
    ; Jump to 'PhysicalStart'.
    ;
    mov  pc, r0
    nop
    nop
    nop
    nop

PhysicalStart

    ; Flush the I&D TLBs.
    ;
    mcr     p15, 0, r2, c8, c7, 0   ; Flush the I&D TLBs

    ; Jump to the physical launch address.  This should never return...
    ;    
    mov     pc, r3
    nop
    nop
    nop
    nop
    nop
    nop
      
    END

OEMLaunch 里调用Launch函数 Launch就是这样的 intel xscale
wcapc
驱动牛犊
驱动牛犊
  • 注册日期2001-12-07
  • 最后登录2010-04-18
  • 粉丝0
  • 关注0
  • 积分220分
  • 威望22点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-02-24 17:06
那请问楼上的兄弟,这个launch与config.bib里面所定义的地址有什么联系,可不可举些实例,越详尽越好
天行健,君子以自强不息
rilyyu
驱动小牛
驱动小牛
  • 注册日期2006-11-17
  • 最后登录2010-08-17
  • 粉丝0
  • 关注0
  • 积分512分
  • 威望130点
  • 贡献值0点
  • 好评度127点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-02-24 17:54
在config.bib里定义的Nk地址就决定了生成的nk.bin的imagestart地址,在下载nk的过程中imagestart被保存在全局启动参数dwImageStart中,这是一个虚拟地址,在oemlaunch中将虚拟地址dwImageStart转化为物理地址dwLaunchAddr,然后把这个参数传递给Launch函数,启动. 当然在这之前要把nk镜像复制到内存的dwImageStart处,如果不XIP在内存里运行镜像的话.
这是我的理解,不一定正确,仅供参考.欢迎指正.
dalee_xd
驱动牛犊
驱动牛犊
  • 注册日期2005-12-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-02-24 23:23
我想补充一下楼上的说法.

我用的是SMDK2410, 可能和xscale的情况不太一样.
我的config.bib定义的镜像起始地址为0x8c20 0000(虚拟地址), EBoot将镜像下载到以0x8c20 0000为起始地址的RAM中, 但实际上OS跳转的地址却是0x8c20 1000, 也就是说, 传递到Lauch函数的参数应该是对应的物理地址0x3020 1000, 也就是镜像开始后4K的位置.

为什么跳到4K后的位置执行呢? 如果直接在下载的其实地址(0x3020 0000)执行会怎么样呢? 答案是:程序同样会跳转到后4K的位置.

我看了一下NK.nb0中的机器码, 最前面4字节的内容是FE 03 00 EA, 它对应的指令是B跳转, 偏移地址是(0x3FE+2)*4正好就是4K, 也就是将跳转到偏移地址为0x1000的地方, 这也就很好的解释了上面的现象.

这条指令之后的内容一直到0x1000的位置基本上全部为0x00. 而0x1000的机器码则对应了fw.s中StartUp处的代码, 也就是系统启动的初始化代码.
jackzhang
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2014-01-06
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-02-25 15:00
不要用nk.nb0,用NK.BIN好一点,速度快很多
wcapc
驱动牛犊
驱动牛犊
  • 注册日期2001-12-07
  • 最后登录2010-04-18
  • 粉丝0
  • 关注0
  • 积分220分
  • 威望22点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-02-25 16:22
我这里有两种方式把NK.BIN复制到RAM中,一种是PCMCIA,一种是Ethnet,全如果用烧录器烧入的NK.NB0,如何才能让系统跟NK.NB0联系起来?

我用的是AMD au1200的CPU+wince5.0
天行健,君子以自强不息
rilyyu
驱动小牛
驱动小牛
  • 注册日期2006-11-17
  • 最后登录2010-08-17
  • 粉丝0
  • 关注0
  • 积分512分
  • 威望130点
  • 贡献值0点
  • 好评度127点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-02-25 17:23
nk.bin是nk.nb0的压缩形式.把nk.bin下载到ram里后就是nk.nb0了.
你说用烧录器烧入nk.nb0应该是烧到flash去了.如果你的平台用的是nor flash可以XIP的话,就把flash里存放nk.nb0的首地址(物理地址)传递给launch函数,就可以跳转到os启动了.
如果在内存里运行os,那么就要在eboot里把nk.nb0复制到内存的某个位置,然后把这个位置的物理地址给launch就可以了.一般说来,这个位置就是bib里定义的imagestart,启动地址也可以是楼上大侠说的imagestart+0x1000
看了各位大侠的贴子,也让我明白了以前的一些疑问,所以就多谈了点自己的看法,哈哈,希望不要见笑.
游客

返回顶部