- 论坛徽章:
- 3
|
本帖最后由 460769013 于 2013-10-22 14:27 编辑
问题背景:
在2416arm板子上面配有两片SDRAM,64M*2=128M,分别挂在bank6和bank7上面。由bootload进行地址映射,且把参数传给linux内核。
1、当我把SDRAM的参数128M传给内核后(两片内存),内核启动、文件系统跑起来什么的都正常。问题在于当我在执行CP(或者mv、dd)命令时,只要我复制的文件大小大于20M时,系统就会崩溃,打印出Oops消息。如果小于20M就没事。Oops消息:http://bbs.chinaunix.net/thread-4100966-1-1.html
2、当我把SDRAM的参数64M传给内核后(一片内存),内核启动、文件系统跑起来什么的都正常。而且CP命令也正常,100多M都没有问题。
基于这问题,我想知道内核是怎样判断SDRAM是多大的??怎么初始化SDRAM。为什么会出现上面的那个问题??
{
PS:1、网上看了一些资料,是从bootload那边参数传过来的,直接用。
2、内核本身会再对SDRAM进行一次初始化,并进行把不连续的物理地址映射成连续的虚拟地址。
}
大家知道的能否帮忙指导下!!在下感激不尽啊!!
最近的进展:
因为是加了两片的SDRAM后才出现CP等命令会出现系统崩溃,所以怀疑是将物理地址映射到虚拟地址出了问题,
例如:
物理地址是:bank6:0x30000000-0x34000000 (映射虚拟地址:0xc0000000-0xc4000000)。
bank7:0x38000000-0x3c000000 (映射虚拟地址:0xc4000000-0xc8000000) 。
怀疑在bank6和bank7映射到虚拟地址的衔接处是不是没映射过去,导致这一段会出现空指针。
于是就做了测试:
在boot命令下我把内核下载到 0xc3c50000 (内核大小是:0x3bc660,+0xc3c50000=0XC400C660),这样可以下载进去,
但是直接在这边启动内核(命令:bootm 0xc3c50000),确跑不起来,会停在 start kernel 。。。。
如果我把内核下载到0xc3c40000 或者 0xc4000000等,只要内核不夸越两片内存就都会起来。。
分析:因为可以下载在两片内存的衔接处,这可以说明这两片SDRAM映射到连续的虚拟地址上是没有问题的吧??那为啥内核起不来?
若是内存映射连续虚拟地址没问题,那我上面的CP等问题是不是由于内核处理内存时出的错吗???、
求解啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|