阅读:3939回复:36
关于Config.bib中,内存分配问题KN,RAM
1 在MEMORY下,我们需要分配好下列空间
NK 96CB8000 01F48000 RAMIMAGE ; SDRAM 31.9MB RAM 98C00000 01A00000 RAM ; SDRAM 26MB 那么请问:这里的NK分配的空间,是用来存放image的吧?那么刚开始那个image是放在哪里的啊? 2 那我们的image存放在NOR Flash中时, 我们是不是要把这个NK分配到NOR flash的空间上,把整个SDRAM作为系统RAM? 3 如果image存放在NAND FLASH上时,怎么分配啊? 糊涂了,请兄弟们给分析分析 |
|
最新喜欢:ltgbj |
沙发#
发布于:2005-01-13 10:11
我理解应该是这样的:
(1)NK的image文件,即压缩文件存在于NOR flash(或其他外存)上,它只是一个文件而已; (2)在系统启动的时候,这个压缩文件会被解压到内存中的某一地址范围,这个范围就是由下面的配置确定的: MEMORY NK 96CB8000 01F48000 RAMIMAGE 而 RAM 98C00000 01A00000 RAM 则确定了系统实际可使用的RAM。 不完整之处,还请其他大侠补充:))) [编辑 - 1/13/05 by wwei_wang] |
|
|
论坛版主
|
板凳#
发布于:2005-01-13 13:36
在链接的时候,内核的所有可重定位数据被定址,这时候基地址是根据EXEBASE计算的,这样,对数据池中的数据访问被链接为绝对寻址。接下来,你的这段代码必须放到你EXEBASE指定的空间来运行,否则找不到绝对定址的正确数据。RAMIMAGE需要和EXEBASE一致。
按道理说IMAGE放到NOR里面可以使用XIP执行(ms帮助也说过,但没有详细讲),我调的时候发现不对,第一级页表(我说的是ARM,X86的情况可能类似)被放到OS IMAGE后面64K对齐的地方,这样在NOR里面运行肯定不行,不知道为啥子MS说可以XIP执行...所以把NOR作为空间存放可以,但只能暂时,跳到KernelStart后还是要放到ram里面来跑(你需要在此之前自己搬家)。同理使用nand flash也需要将os image移到sdram里面。 |
|
地板#
发布于:2005-01-13 13:55
我借题发挥,顺便有个很菜的问题想请教wxl_50685330大哥:
在MEMORY下,例如本例中 NK 96CB8000 01F48000 RAMIMAGE RAM 98C00000 01A00000 RAM (1)RAMIMAGE空间的长度(此例为01F48000)与nk的实际大小的关系是什么?是不是这个空间的长度不能小于nk的大小? [编辑 - 1/13/05 by wwei_wang] |
|
|
地下室#
发布于:2005-01-13 14:42
1 wxl_50685330大哥,它是可以在在NOR Flash里运行的,我们现在的就是这样的,
所以它在配置里这么分配了内存 NK 80000000 02000000 RAMIMAGE ;80000000是NOR Flash的首地址 ;它把64M的SDRAM都作为了系统RAM RAM 96C00000 03A00000 RAM 2 要是改用NAND Flash时,我们是不是要在SDRAM中分配RAMIMAGE啊 就像这样 NK 96CB8000 01F48000 RAMIMAGE RAM 98C00000 01A00000 RAM 意思是需要把NAND Flash中的image 拷到RAM中运行 嗯,我认为就是这个意思了 3 而RAMIMAGE的长度应该就是你那个bin文件或是nb0文件的大小,我觉得是不能小于nk大小的啦,要不image拷到ram里也放不全啊 4 另外有个问题就是,把image copy到RAM里,是在那个文件里完成的、? |
|
论坛版主
|
5楼#
发布于:2005-01-13 15:11
wwei_wang
应该是不要小于,不过你定的nk.nb0有时候后面有一段没用的(全0),这个时候不会有问题,但不保证,系统要用这个定出ram的起始地址,从源代码看第一级页表(arm)是放在紧挨os image后的 chang_nicolas 兄弟,你们完全在nor里面跑的?不是吧,我看过源代码,做的时候开始我也没有动,但后来返汇编调的时候发现你把os image放哪儿跑,那也表就会放到它后面,这样在flash里面的话页表地址也在flash里面了,不对阿,我是没办法才自己做的搬家,你们是怎么做的?你们的cpu是什么?你看过页表基址在什么地方吗? 我搬家的代码实现是在startup里面,因为跳到kernelstart后就开始做页表初始化了,我要在这之前搬到sdram 对了,你说的对nand的处理是对的,就那样做 |
|
6楼#
发布于:2005-01-13 16:02
To wxl_50685330,我晕了,请大哥赐教
(1)我看了一下pb带的bsp,无论是cepc还是geode,它们的config.bib文件中,对于RAMIMAGE段的配置都是一样的,如下 MEMORY NK 80220000 009E0000 RAMIMAGE 请问,这里的长度009E0000(等于9.875M),是根据什么定的?如果按照这个配置生成的nk.bin大于这个,如16M(对于debug版这个大小很正常),那么会有什么问题? 值得注意的是:我曾经按照这个配置生成的nk.bin有19M多,但拷贝到目标机后系统仍能正常启动,而且一直工作正常。 所以我不是很清楚,这里RAMIMAGE空间长度的设定到底有什么要求?它的设定应该满足什么要求?怎么设定? 还请大哥耐心解答。如果我有问错的地方还请大哥原谅。 |
|
|
论坛版主
|
7楼#
发布于:2005-01-13 16:21
嗯,我看了一下,确实是,我说说我的看法哈
它里面提到了chain_address,会不会它使用了分段的方式存放,革命遇到这种问题就要兄弟伙一起上了!:)))这个问题大家好好看看怎么回事 |
|
8楼#
发布于:2005-01-13 16:34
我又看了一下:
IF IMGMULTIXIP #define CHAIN_ADDRESS 80220000 ..... ELSE ..... 实际上,CHAIN_ADDRESS 这段应该没进去,它执行的应该是else后面的。 |
|
|
论坛版主
|
9楼#
发布于:2005-01-13 16:47
先记下这个问题,大家研究好了就告诉兄弟们!
|
|
论坛版主
|
10楼#
发布于:2005-01-13 17:30
我又看了一下,好像是这样:如果设了AUTOSIZE=ON系统会自动把大小扩展到合适的地方,要不兄弟试试把这个关掉,如果关掉就不对了那就是这个意思了
|
|
11楼#
发布于:2005-01-13 17:46
其实真正NK的大小是由ROMESIZE决定的
|
|
12楼#
发布于:2005-01-13 21:12
To wxl_50685330: 有可能,我明天试试看。
To chang_nicolas: ROMSIZE是在哪里定义的?请指教。 另外关于内存的配置我还有一个问题: 对于pb里自带的bsp(cepc,geode等),例如当系统的物理内存为64时,内存是这样配置的 MEMORY NK 80220000 009E0000 RAMIMAGE RAM 80C00000 01000000 RAM 内存总和计算如下: 009E0000 + 01000000 +ExtraRAM(=36M)=61.875M 另外 从800A0000到80220000一段被保留,这样就有 61.875M+1.5M=63.375M 还有从80000000到800A0000这段(正好0.625M),这一段内存好像没有定义?难道缺省设置为保留状态?还是怎么着?请各位高手明示。 [编辑 - 1/13/05 by wwei_wang] |
|
|
13楼#
发布于:2005-01-14 08:53
ROMSIZE在config.bib中CONFIG模块下
|
|
14楼#
发布于:2005-01-14 09:11
我是在做x86的,初来乍道,有些冒昧。我来谈谈我的一些理解,希望指正:
NK这段定义表示RAMIMGAE这段内存的区域,这段内存在wince里被认为是类似ROM操作的ram区域,并且NK.exe模块就在这个区域中; RAM这段定义定义内存大小,由IMGRAM16,IMGRAM32,IMGRAM64,IMGRAM128决定; a0000是vga framebuffer保留地址;a0000以下的地址也是使用了的,比如bios和dos初始化时,定义了gdt,idt;一般2m以下的地址wince是不使用的,都有保留功能(比如eboot,dma。。。); romsize的定义的说法不是太准确的,wince里每个模块都会在makeimg的时候决定它的romstart,romsize,根据这些东西一起打包成nk.bin;比如x86平台对于nk.bin第1个模块nk.exe的romstart就是0x80220000,然后根据nk.exe的romsize累加得到下一个模块的romstart。。。 nk.bin的大小是根据你选择的组件,并由你选择是否压缩决定的,至于这个nk.bin能否完全解到内存中去,就要由ramimg参数来配合。 [编辑 - 1/14/05 by liaoxing] |
|
15楼#
发布于:2005-01-14 09:24
To liaoxing:谢谢兄弟指点,你太谦虚了:)
(1)NK定义的这段RAMIMGAE内存区域的长度是根据什么确定的? (2)a0000是否系统缺省为保留? (3)nk.bin能否完全解到内存中去,对系统有什么影响?是否要求nk.bin一定要解压到内存中?或者说什么情况下需要解到内存中,什么时候不需要?? To chang_nicolas: 不好意思,ROMSIZE在哪里设的呀?怎么设的啊?缺省配置里没有啊。我这个问题好像有点弱:)) config段相关代码如下: CONFIG AUTOSIZE=ON IF IMGMULTIXIP RAM_AUTOSIZE=ON ROM_AUTOSIZE=ON DLLADDR_AUTOSIZE=ON XIPSCHAIN=$(CHAIN_ADDRESS) AUTOSIZE_ROMGAP=10000 AUTOSIZE_DLLADDRGAP=0 AUTOSIZE_DLLDATAADDRGAP=0 AUTOSIZE_DLLCODEADDRGAP=0 ENDIF [编辑 - 1/14/05 by wwei_wang] |
|
|
16楼#
发布于:2005-01-14 09:50
我的理解
ROMSTART指定的内核镜像的首地址 ROMSIZE 内核镜像的大小 不如生成的nk.nb0的大小和你ROMSIZE设置的大小是一样的 |
|
17楼#
发布于:2005-01-14 10:04
我的理解 chang_nicolas不好意思,我没明白你最好一句话的意思?另外,ROMSIZE的大小在编译之前是怎么确定的?还是尽量多分配一些? [编辑 - 1/14/05 by wwei_wang] |
|
|
18楼#
发布于:2005-01-14 10:32
写错了,应该是“例如”
我觉得是这个意思了,NK.bin的大小应该是实际的大小,没有给它分配任何多余的空间,而ROMSIZE是分配了比实际上大的空间,如果分配小的话,NK.nb0会被分成两个部分,究竟编译前根据什么计算ROMSIZE大小,我不清楚,不过我认为根据nk.bin文件的大小可以得出ROMSIZE的大小,这是你自己定的 |
|
19楼#
发布于:2005-01-14 10:54
你的意思是:
(1)ROMSIZE确定了nk.bin在内存中映像的区域的大小?系统启动时,nk.bin将被解压到这个内存区域。 (2)如果是这样的话,那么 MEMORY NK 80220000 009E0000 RAMIMAGE RAM 80C00000 01000000 RAM 中,RAMIMAGE的长度(这里是009E0000)和ROMSIZE到底是什么关系?还是没有关系? [编辑 - 1/14/05 by wwei_wang] |
|
|
上一页
下一页