阅读:3527回复:13
我的系统不能跳到NK.nb0去执行,请问从Eboot到NK.nb0的过程是怎么样的?
从Eboot执行后,跳到NK.nb0是如何实现的?
|
|
|
沙发#
发布于:2007-02-13 20:24
跳到OS的起始地址,DOWNLOAD时把OS放在哪,跳到那就好了.
不一定是没有跳过去,可能是跳过去以后就死了. |
|
|
板凳#
发布于:2007-02-14 15:56
我是用烧录器烧录进去flash的,
请问OS起始位置与Flash的地址有何关联? |
|
|
地板#
发布于:2007-02-14 16:48
OS是在FLASH里面的啊
|
|
地下室#
发布于:2007-02-15 17:06
我是问Eboot如何Jump到NK.bin的?
|
|
|
5楼#
发布于:2007-02-16 20:52
EBOOT中有个OEMLauch函数,一般就是从那跳转的.
一般的做法是,EBOOT把OS放到它已知的一个地址上,然后跳转到那个地址.而OS的第一条指令就是跳转到4K之后. |
|
|
6楼#
发布于:2007-02-22 17:13
引用第5楼microsun于2007-02-16 20:52发表的“”: 请问有无一个实例的例子啊?谢谢了啊 |
|
|
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 |
|
8楼#
发布于:2007-02-24 17:06
那请问楼上的兄弟,这个launch与config.bib里面所定义的地址有什么联系,可不可举些实例,越详尽越好
|
|
|
9楼#
发布于:2007-02-24 17:54
在config.bib里定义的Nk地址就决定了生成的nk.bin的imagestart地址,在下载nk的过程中imagestart被保存在全局启动参数dwImageStart中,这是一个虚拟地址,在oemlaunch中将虚拟地址dwImageStart转化为物理地址dwLaunchAddr,然后把这个参数传递给Launch函数,启动. 当然在这之前要把nk镜像复制到内存的dwImageStart处,如果不XIP在内存里运行镜像的话.
这是我的理解,不一定正确,仅供参考.欢迎指正. |
|
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处的代码, 也就是系统启动的初始化代码. |
|
11楼#
发布于:2007-02-25 15:00
不要用nk.nb0,用NK.BIN好一点,速度快很多
|
|
12楼#
发布于:2007-02-25 16:22
我这里有两种方式把NK.BIN复制到RAM中,一种是PCMCIA,一种是Ethnet,全如果用烧录器烧入的NK.NB0,如何才能让系统跟NK.NB0联系起来?
我用的是AMD au1200的CPU+wince5.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 看了各位大侠的贴子,也让我明白了以前的一些疑问,所以就多谈了点自己的看法,哈哈,希望不要见笑. |
|