修改理由:
由于eboot 和KITL 同时调用 DM9000DBG_Init 这个函数,在eboot 掉用时使用的是没有经过映射的地址,当镜像加载完成后,时候的是映射过的地址。 而DM9000DBG_Init 任然时候的是没有经过映射的地址。这样做导致的直接后果是,KITL起来当访问没有这段地址(0x15000000)的时候立马死机。
但是有引出了另外的一个问题,就是这样修改在启动eboot的时候,用的是映射过的地址,在eboot中访问映射过的地址同样会死机(因为mmu还没有起来)。
最后找了一种比较折中的解决方案:
在编译eboot的时候用下面代码:
DM9000DBG_Init
{
......
//Add ed by peng
/OALPAtoVA((UINT32)0x15000000, FALSE);
//OALPAtoVA((UINT32)0x15000000+ 0x400, FALSE);
//Mask by peng
//Give the Index and Data port Address
dwIndexPortAddress = 0x15000000;
dwDataPortAddress = 0x15000000 + 0x400;
.......
}
编译内核的时候用下面代码:
DM9000DBG_Init
{
......
//Add ed by peng
dwIndexPortAddress = OALPAtoVA((UINT32)0x15000000, FALSE);
dwDataPortAddress = OALPAtoVA((UINT32)0x15000000+ 0x400, FALSE);
//Mask by peng
//Give the Index and Data port Address
//dwIndexPortAddress = 0x15000000;
//dwDataPortAddress = 0x15000000 + 0x400;
.......
}
本文介绍了解决eboot与KITL在调用DM9000DBG_Init函数时产生的内存映射冲突问题。通过在不同阶段采用特定的地址映射方式,避免了因MMU未准备好而导致的系统死机问题。
827

被折叠的 条评论
为什么被折叠?



