关于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上时,怎么分配啊? 糊涂了,请兄弟们给分析分析
wwei_wang 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]
wxl_50685330 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里面。
wwei_wang 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]
chang_nicolas 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里,是在那个文件里完成的、?
wxl_50685330 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的处理是对的,就那样做
wwei_wang 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空间长度的设定到底有什么 要求?它的设定应该满足什么 要求?怎么设定? 还请大哥耐心解答。如果我有问错的地方还请大哥原谅。
wxl_50685330 2005-01-13 16:21 嗯,我看了一下,确实是,我说说我的看法哈 它里面提到了chain_address,会不会它使用了分段的方式存放,革命遇到这种问题就要兄弟伙一起上了!:)))这个问题大家好好看看怎么回事
wwei_wang 2005-01-13 16:34 我又看了一下: IF IMGMULTIXIP #define CHAIN_ADDRESS 80220000 ..... ELSE ..... 实际上,CHAIN_ADDRESS 这段应该没进去,它执行的应该是else后面的。
wxl_50685330 2005-01-13 16:47 先记下这个问题,大家研究好了就告诉兄弟们!
wxl_50685330 2005-01-13 17:30 我又看了一下,好像是这样:如果设了AUTOSIZE=ON系统会自动把大小扩展到合适的地方,要不兄弟试试把这个关掉,如果关掉就不对了那就是这个意思 了
chang_nicolas 2005-01-13 17:46 其实真正NK的大小是由ROMESIZE决定的
wwei_wang 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]
chang_nicolas 2005-01-14 08:53 ROMSIZE在config.bib中CONFIG模块下
liaoxing 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]
wwei_wang 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]
chang_nicolas 2005-01-14 09:50 我的理解 ROMSTART指定的内核镜像的首地址 ROMSIZE 内核镜像的大小 不如生成的nk.nb0的大小和你ROMSIZE设置的大小是一样的
wwei_wang 2005-01-14 10:04 [quote]我的理解 ROMSTART指定的内核镜像的首地址 ROMSIZE 内核镜像的大小 不如生成的nk.nb0的大小和你ROMSIZE设置的大小是一样的 [/quote] chang_nicolas不好意思 ,我没明白你最好一句话的意思 ?另外,ROMSIZE的大小在编译之前是怎么确定的?还是尽量多分配一些? [编辑 - 1/14/05 by wwei_wang]
chang_nicolas 2005-01-14 10:32 写错了,应该是“例如” 我觉得是这个意思 了,NK.bin的大小应该是实际的大小,没有给它分配任何多余的空间,而ROMSIZE是分配了比实际上大的空间,如果分配小的话,NK.nb0会被分成两个部分,究竟编译前根据什么 计算ROMSIZE大小,我不清楚,不过我认为根据nk.bin文件的大小可以得出ROMSIZE的大小,这是你自己定的
wwei_wang 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]
chang_nicolas 2005-01-14 11:09 越来越复杂了,我的理解,不知对否了,请高手们指教吧 RAMIMAGE的大小不是跟ROMSIZE的大小有直接关系的 ROMSIZE只是规定了生成的NK.NB0的大小 RAMIMAGE分配的大小是指运行系统需要的空间, 如果你是吧NAND Flash上的image全部拷到RAM里的话,那么RAMIMAGE的大小应该和ROMSIZE一样,如果只是将image里的内核拷过去的话,那么RAMIMAGE的大小就没有必要分得跟ROMSIZE一样大了,所以RAMIMAGE的大小和ROMSIZE的大小的关系还依赖你所选用何种方式运行你的系统
joyfly 2005-01-14 11:16 你们应该先弄清楚你们要编译的IMAGE类型和要运行的目标设备的环境,再来分别讨论每种的设定. Monolithic还是MultiXIP NandFlash还是Norflash
wwei_wang 2005-01-14 12:05 [quote]你们应该先弄清楚你们要编译的IMAGE类型和要运行的目标设备的环境,再来分别讨论每种的设定. Monolithic还是MultiXIP NandFlash还是Norflash [/quote] To chang_nicolas:谢谢你的指点。 To joyfly:请joyfly兄弟说说你的高见: (1)Monolithic和MultiXIP有什么 不同? (2)我目标机的外存是CF或DOC,在这种情况下RAMIMAGE的大小如何设定?和nk.bin的大小有什么 关系?
wxl_50685330 2005-01-14 17:06 [quote]写错了,应该是“例如” 我觉得是这个意思 了,NK.bin的大小应该是实际的大小,没有给它分配任何多余的空间,而ROMSIZE是分配了比实际上大的空间,如果分配小的话,NK.nb0会被分成两个部分,究竟编译前根据什么 计算ROMSIZE大小,我不清楚,不过我认为根据nk.bin文件的大小可以得出ROMSIZE的大小,这是你自己定的 [/quote] ROMSIZE是指定NK.NB0大小的,NK.BIN是NK.NB0的RUN LENGTH压缩文件。 WWEI_WANG 试了没?对于.BIN文件,本身包含了自己的大小,AUTOSIZE可能会根据RAMIMAGE和.BIN的大小自动调整OS IMAGE和空闲RAM的边界。
wxl_50685330 2005-01-14 17:11 chang_nicolas 兄弟,接着上次的话题,你了解你们的OS IMAGE跑起来后是在FLASH里还是被搬到了SDRAM里?页表地址怎么给的?
wwei_wang 2005-01-17 14:26 [quote]我又看了一下,好像是这样:如果设了AUTOSIZE=ON系统会自动把大小扩展到合适的地方,要不兄弟试试把这个关掉,如果关掉就不对了那就是这个意思 了 [/quote] 老大不愧是老大,眼力果然狠毒,我测试过了,就是AUTOSIZE这个家伙的问题 :P :P :P :P
wxl_50685330 2005-01-17 15:49 :))你娃又为革命做出了不朽的贡献!记一等功一次哈:))) 那这下就好办了,怪不得有时候可用内存比我指定的大:)))
wwei_wang 2005-01-17 16:12 为了革命,我不入地狱谁入地狱?哈哈哈 :cool: [编辑 - 1/17/05 by wwei_wang]
wxl_50685330 2005-01-17 17:15 我终于找到接班人了!
wwei_wang 2005-01-18 08:02 你是找到下地狱的接班人了吧?呵呵
wxl_50685330 2005-01-18 14:48 你这个人就是这点不好,老爱说实话...
wwei_wang 2005-01-18 16:07 看样子你的马儿已经好了 :D
wxl_50685330 2005-01-18 16:11 喂,哥哥问你话,没得反应喃!在那两个帖子里面
wwei_wang 2005-01-18 16:27 大哥问话,就算兄弟不知道也得有所反应,呵呵,刚才在干别的呢。
wxl_50685330 2005-01-18 16:30 :)
wwei_wang 2005-01-18 19:08 大哥,你为兄弟们费心了 ;)
qindl 2007-01-30 17:37 我是新手 我的疑问可能更多 别笑话 1/我的扳子是9315A flash只16M 型号(E28F16**J3A150A0404**)小弟不懂是NOR FLASH 还是 NAND FLASH ? 2/ 因为我的FLASH小 BIB配置和大家也不一样 我编译出的NK.NBO 都15M多 也可以扳子上运行 看下买内的代码 大侠们分析下 IF EDB9301_02 IF IMGFLASH ! IF BSP_EP93XX_COPY_FLASH_TO_RAM ! ;********************************************************************** ; ; Boot from RAM ; ;********************************************************************** MEMORY RESERVED 80000000 00008000 RESERVED DRV_GLB 80008000 00001000 RESERVED CS8950 80010000 00030000 RESERVED EDBG 80040000 00080000 RESERVED ; FRAMEBUF 800C0000 00140000 RESERVED ; NK 80200000 00E00000 RAMIMAGE NK 800C0000 00740000 RAMIMAGE RAM 81000000 00800000 RAM CONFIG COMPRESSION=ON PROFILE=OFF ROMSTART=800C0000 ROMSIZE=00740000 ROMWIDTH=32 ; ; Used for making a copy to RAM 0x80000000 ; ; ; 0x80200000 + 0x80000000 = 0x00200000 ; ROMOFFSET=0x80000000 ; 0x800C0000 + 0x80000000 = 0x000C0000 ROMOFFSET=0x80000000 ROMFLAGS=0 KERNELFIXUPS=ON AUTOSIZE=OFF ENDIF ENDIF IF IMGFLASH ! IF BSP_EP93XX_COPY_FLASH_TO_RAM ;********************************************************************** ; ; Copy Flash to RAM and boot from RAM. ; ;********************************************************************** MEMORY RESERVED 80000000 00008000 RESERVED DRV_GLB 80008000 00001000 RESERVED CS8950 80010000 00030000 RESERVED EDBG 80040000 00080000 RESERVED ; FRAMEBUF 800C0000 00140000 RESERVED ; NK 80200000 00E00000 RAMIMAGE NK 800C0000 00740000 RAMIMAGE RAM 81000000 00800000 RAM ; RAM 80800000 01800000 RAM CONFIG COMPRESSION=ON PROFILE=OFF ; ROMSTART=80200000 ; ROMSIZE=00E00000 ROMSTART=800C0000 ROMSIZE=00740000 ROMWIDTH=32 ; ; NKStart + ROMOFFSET = Physical Memory Location. ; ; 0x80200000 + 0xDFE00000 = 0x60000000 ; ROMOFFSET=DFE00000 ; 0x800C0000 + 0xDFF40000 = 0x60000000 ROMOFFSET=DFF40000 ROMFLAGS=0 KERNELFIXUPS=ON AUTOSIZE=OFF ENDIF ENDIF IF IMGFLASH ;********************************************************************** ; ; Boot from FLASH ; ;********************************************************************** MEMORY RESERVED 80000000 00008000 RESERVED DRV_GLB 80008000 00001000 RESERVED CS8950 80010000 00030000 RESERVED EDBG 80040000 00080000 RESERVED ; FRAMEBUF 800C0000 00140000 RESERVED ; RAM 80200000 00600000 RAM RAM 800C0000 00740000 RAM NK 88000000 00800000 RAMIMAGE CONFIG COMPRESSION=OFF PROFILE=OFF ROMSTART=88000000 ROMSIZE=00800000 ROMWIDTH=32 ; ; Used for making a copy to RAM 0x80000000 ; ; 0x88000000 + 0xD8000000 = 0x60000000 ROMOFFSET=0xD8000000 ROMFLAGS=1 KERNELFIXUPS=ON AUTOSIZE=OFF ENDIF ENDIF