|
引用 1 楼 hzdysymbol 的回复:
Launch函数其实只是把PC指针指过去,跳转到相应的地址运行
Eboot中应该有需要访问虚拟地址吧,所以不能关
关掉后再跳到Image是因为Image中还会再做一次初始化的动作,如果在Image中的起始部分把相关的初始化拿掉,应该可以不关MMU
你说的我明白,我的意思是对他的做法有点不解。
我觉得这个比较令人费解。
ldr r2, = PhysicalStart
ldr r3, = (VIR_RAM_START - PHY_RAM_START) //为什么要这样做呢?
sub r2, r2, r3
直接把这个0x30200000放到PC不行吗?
------------------------------------------------
优龙是直接跳转到相应的内存物理地址运行的
不会像在上面那样搞得模模糊糊。
- //====================================================
- //优龙bootloader加载NK运行入口函数:使用函数指针的方法,
- //相当巧妙,程序可读性比三星自带的eboot强悍
- //====================================================
- void call_linux(U32 a0, U32 a1, U32 a2)
- {
- void (*goto_start)(U32, U32);
-
- rINTMSK=BIT_ALLMSK;
-
- cache_clean_invalidate();
- tlb_invalidate();
- __asm{
- // mov r0, a0//%0
- // mov r1, a1//%1
- // mov r2, a2//%2
- mov ip, #0
- mcr p15, 0, ip, c13, c0, 0 /* zero PID */
- mcr p15, 0, ip, c7, c7, 0 /* invalidate I,D caches */
- mcr p15, 0, ip, c7, c10, 4 /* drain write buffer */
- mcr p15, 0, ip, c8, c7, 0 /* invalidate I,D TLBs */
- mrc p15, 0, ip, c1, c0, 0 /* get control register */
- bic ip, ip, #0x0001 /* disable MMU */
- mcr p15, 0, ip, c1, c0, 0 /* write control register */
- //mov pc, r2
- //nop
- //nop
- /* no outpus */
- //: "r" (a0), "r" (a1), "r" (a2)
- }
- // SetClockDivider(1, 1);
- // SetSysFclk(FCLK_200M); //start kernel, use 200M
- //SET_IF();
- goto_start = (void (*)(U32, U32))a2;//这个a2=0x30200000,在调用的时候传递进来
- (*goto_start)(a0, a1);
- }
复制代码 |
|