关于的OEMAddressTable/g_oalAddressTable和config.bib的全解析--一堆弱弱的问题,送分咯!

时间:2021-08-31 17:56:41
现在用S3C2440,对OEMAddressTable和config.bib一起理解时,还是有点不太链得通。
关于OEMAddressTable(CE 5.0以前的提法)路径一般为:%WINCEROOT%\PLATFORM\<BSP>\KERNEL\HAL\ARM中的map.a文件中;
g_oalAddressTable(CE 5.0以后的提法)路径一般为:%WINCEROOT5.0%\PLATFORM\<BSP>\Src\Inc中的oemaddrtab_cfg.inc文件中;
config.bib的路径一般在平台的FILES文件夹中。

下面引用一下友善的:

OEMAddressTable
    ;;;-------------------------------------------------------------
    ;;; Virt Addr   Phys Addr   MB
    ;;;-------------------------------------------------------------
    DCD 0x80000000, 0x02000000, 30  ; 30 MB SRAM(SRAM/ROM) BANK 0
    DCD 0x82000000, 0x08000000, 32  ; 32 MB SROM(SRAM/ROM) BANK 1
    DCD 0x84000000, 0x10000000, 32  ; 32 MB SROM(SRAM/ROM) BANK 2
    DCD 0x86000000, 0x18000000, 32  ; 32 MB SROM(SRAM/ROM) BANK 3
    DCD 0x88000000, 0x20000000, 32  ; 32 MB SROM(SRAM/ROM) BANK 4
    DCD 0x8A000000, 0x28000000, 32  ; 32 MB SROM(SRAM/ROM) BANK 5
    DCD 0x8C000000, 0x30000000, 64  ; 64 MB DRAM BANK 0,1
    DCD 0x90800000, 0x48000000,  1  ; Memory control register
    DCD 0x90900000, 0x49000000,  1  ; USB Host register
    DCD 0x90A00000, 0x4A000000,  1  ; Interrupt Control register
    DCD 0x90B00000, 0x4B000000,  1  ; DMA control register
    DCD 0x90C00000, 0x4C000000,  1  ; Clock & Power register
    DCD 0x90D00000, 0x4D000000,  1  ; LCD control register
    DCD 0x90E00000, 0x4E000000,  1  ; NAND flash control register
    DCD 0x90F00000, 0x4F000000,  1  ; Camera control register 
    DCD 0x91000000, 0x50000000,  1  ; UART control register
    DCD 0x91100000, 0x51000000,  1  ; PWM timer register
    DCD 0x91200000, 0x52000000,  1  ; USB device register
    DCD 0x91300000, 0x53000000,  1  ; Watchdog Timer register
    DCD 0x91400000, 0x54000000,  1  ; IIC control register
    DCD 0x91500000, 0x55000000,  1  ; IIS control register
    DCD 0x91600000, 0x56000000,  1  ; I/O Port register
    DCD 0x91700000, 0x57000000,  1  ; RTC control register
    DCD 0x91800000, 0x58000000,  1  ; A/D convert register
    DCD 0x91900000, 0x59000000,  1  ; SPI register
    DCD 0x91A00000, 0x5A000000,  1  ; SD Interface register
    DCD 0x91B00000, 0x5B000000,  1  ; AC97 Interface register
    ;DCD 0x92000000, 0x00000000, 32  ; 32 MB SROM(SRAM/ROM) BANK 0,change by Rn 20081205
    ;note by Rn 20081205
    ;这里的Bank 0值,启动模式设置为从Nor Flash启动时,系统的起始物理地址就是0;系统启动后,在操作系统中访问NorFlash的虚拟地址为0x92000000。
    DCD 0x92000000, 0x00000000,  2  ; 2 MB SROM(SRAM/ROM) BANK 0,change by Rn 20081205
    DCD 0x00000000, 0x00000000,  0  ; End of Table (MB MUST BE ZERO!)

    END


问题1:其中的每一个SRAM(SRAM/ROM) BANK为啥都是32M?是不是有板子的地址线决定的,如果这样,那推算过来地址线应该是25根。但是查看友善提供的原理图,只有13根地址线链接SDRAM啊?

问题2:64 MB DRAM BANK 0,1的,是不是对应Bank6和7,就是说每一片32M的SDRAM分别接到Bank6和Bank7上?还是两片32M的SDRAM都对应Bank6?(通过查看原理图,发现这两片的片选信号nSCS都是接到nGCS6上,两片的地址线都是LADDR[2-14]一片的数据线是LDATA[0-15],另一片是LDATA[16-31],好像这两片SDRAM是组成32M×32bit的存储阵列,对不?)

问题3:对于
     DCD 0x90800000, 0x48000000,  1  ; Memory control register
    .....
    DCD 0x91B00000, 0x5B000000,  1  ; AC97 Interface register
这20个各是1M的空间,是拿来做相关的DMA区域么?

问题4:这样从SRAM(SRAM/ROM) BANK 0到2 MB SROM(SRAM/ROM) BANK 0的写法,是不是有啥可以依据的规则?
问题5:"DCD 0x8C000000, 0x30000000, 64  ; 64 MB DRAM BANK 0,1",这个64M的SDRAM一定要映射到0x8c00 0000地址么?
问题6:这个内存的静态映射表,需要驱动开发人员完全编写么?还是一般参照提供的BSP适当修改?

24 个解决方案

#1


问题7:对于想要从Nor Flash启动的系统,上边提到的内存映射表是这样写:
    ;这里的Bank 0值,启动模式设置为从Nor Flash启动时,系统的起始物理地址就是0;系统启动后,在操作系统中访问      NorFlash的虚拟地址为0x92000000。
    DCD 0x92000000, 0x00000000,  2  ; 2 MB SROM(SRAM/ROM) BANK 0
那如果不需要从Nor Flash启动时,那就这个2M的空间就不用单独列出来,对不?

#2


以下是摘自三星S3C2440的CE5.0BSP中的内存静态映射表:

g_oalAddressTable

        DCD     0x80000000, 0x30000000, 64      ; 64 MB DRAM BANK 6
        DCD     0x84000000, 0x10000000, 32      ; nGCS2: PCMCIA/PCCARD
        DCD     0x86000000, 0x18000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 3
        DCD     0x88000000, 0x20000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 4
        DCD     0x8A000000, 0x28000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 5
        DCD     0x8C000000, 0x08000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 1
        DCD     0x90800000, 0x48000000,  1      ; Memory control register
        DCD     0x90900000, 0x49000000,  1      ; USB Host register
        DCD     0x90A00000, 0x4A000000,  1      ; Interrupt Control register
        DCD     0x90B00000, 0x4B000000,  1      ; DMA control register
        DCD     0x90C00000, 0x4C000000,  1      ; Clock & Power register
        DCD     0x90D00000, 0x4D000000,  1      ; LCD control register
        DCD     0x90E00000, 0x4E000000,  1      ; NAND flash control register
        DCD     0x90F00000, 0x4F000000,  1      ; Camera control register
DCD     0x91000000, 0x50000000,  1      ; UART control register
        DCD     0x91100000, 0x51000000,  1      ; PWM timer register
        DCD     0x91200000, 0x52000000,  1      ; USB device register
        DCD     0x91300000, 0x53000000,  1      ; Watchdog Timer register
        DCD     0x91400000, 0x54000000,  1      ; IIC control register
        DCD     0x91500000, 0x55000000,  1      ; IIS control register
        DCD     0x91600000, 0x56000000,  1      ; I/O Port register
        DCD     0x91700000, 0x57000000,  1      ; RTC control register
        DCD     0x91800000, 0x58000000,  1      ; A/D convert register
        DCD     0x91900000, 0x59000000,  1      ; SPI register
        DCD     0x91A00000, 0x5A000000,  1      ; SD Interface register
        DCD     0x92000000, 0x00000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 0
        DCD     0x00000000, 0x00000000,  0      ; end of table

;------------------------------------------------------------------------------
        END


这里应该是从Nand Flash启动系统的吧?而且吧64M的SDRAM映射的了0x80000000起始的虚拟内存空间。而且在Bank2区域有个“nGCS2: PCMCIA/PCCARD”,是不是预留给PCMCIA/PCCARD设备的DMA区,还是别的用途?请高手为俺们这些半桶水的人指点一下。

#3


修整:
以上的:
DCD     0x80000000, 0x30000000, 64      ; 64 MB DRAM BANK 6
        DCD     0x84000000, 0x10000000, 32      ; nGCS2: PCMCIA/PCCARD
        DCD     0x86000000, 0x18000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 3
应为
         DCD     0x80000000, 0x30000000, 64      ; 64 MB DRAM BANK 6
        DCD     0x84000000, 0x10000000, 32      ; nGCS2: PCMCIA/PCCARD
        DCD     0x86000000, 0x18000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 3

#4


好基础的出问题啊,问题一:SDRAM地址线行列线复用的

#5


问题2:两片都接到bank6——楼主在论坛搜索一下。这些东西很多人都问过了。没有必要发帖的。。
关于内存为什么这么接,我发了一个帖子,并给出了答案。我博客也做了备份,去看看吧。

#6


第二部分:关于config.bib文件对OEMAddressTable/g_oalAddressTable所作内存静态映射的具体功能区域划分的理解
   “在虚实地址映射文件[例如ARM下的map.a的OEMAddressTable]中建立虚实地址的静态映射关系,包括RAM,FLASH各部分存储空间,OS启动后所能够识别的物理内存。接着在config.bib的MEMORY段把RAM映射后的虚拟地址进行分段,比如NK的大小,各种外设缓冲区的保留等.(注意这里是虚拟地址的划分,必须建立在映射基础上) ”
    不知道以上这个理解完全对不?
如果是这样,那么对于上边楼主列出的内存映射表,那么在config.bib的MEMORY段只能从0x8C00 0000这一虚拟地址开始,根据功能分段;而对于2楼的内存映射表,那么在config.bib的MEMORY段只能从0x8000 0000这一虚拟地址开始,根据功能分段咯。
    而且在实际的设计和移植系统时,只要按照BSP指定的具体内存静态映射的思路去做,不用强求config.bib的MEMORY段非要从某个虚拟地址开始[比如0x8000 0000],只要保证分段的内存在4G的CE地址空间的0x8000 0000-0x9fff ffff这一带缓存的地址就行了。
    这样分析,对么?
   还有就是,在做内存静态映射时,物理地址可以是不连续的;而虚拟地址上的安排上,一定要保证是连续的,这样说是正确的吧?


   以上讨论的都是SDRAM内存的静态映射和分配问题,有人可能就会问了:那2440和Nand Flash的硬件连线,是不是也是由nGCSX(X=0~7)控制的,挂靠在哪个BANK?
   其实Nand Flash不在地址空间里,只是类似硬盘的外设。2440和Nand Flash的硬件连线是有专门的引脚的nFCE ,不是nGCSX(X=0~7)。这两段取自gooogleman的帖子"对OEMAddressTable以及2440一些硬件连接的疑惑",特此表示感谢!
   

#7


引用 4 楼 fan227 的回复:
好基础的出问题啊,问题一:SDRAM地址线行列线复用的


这样回答,像没有点到实质啊?

#8


引用 5 楼 gooogleman 的回复:
问题2:两片都接到bank6——楼主在论坛搜索一下。这些东西很多人都问过了。没有必要发帖的。。 
关于内存为什么这么接,我发了一个帖子,并给出了答案。我博客也做了备份,去看看吧。

好,贴出了
问个内存电路接口以及访问问题
http://topic.csdn.net/u/20081113/09/7d480bb0-5485-4884-a620-495265f06d61.html?seed=581578907
S3C2410 SDRAM 和处理器相连接的注意点
http://blog.ednchina.com/thinkker/157652/message.aspx#
BIOS之内存控制器设置以及内存电路接口分析
http://blog.csdn.net/gooogleman/archive/2008/11/12/3283075.aspx

看来 gooogleman 果然是桂电的精英啊,看这种趋势,我看不出半年,可以做版主;不出1年可以去申请微软MVP咯!
顶!

#9


本想直接等着你送分,但想想一个问题也不回答直接拿分也不太好意思,回答一个吧:
问题3:对于 
    DCD 0x90800000, 0x48000000,  1  ; Memory control register 
    ..... 
    DCD 0x91B00000, 0x5B000000,  1  ; AC97 Interface register 
这20个各是1M的空间,是拿来做相关的DMA区域么? 
这映射的1M地址空间是给CPU相关的控制寄存器操作用的,你需要读写Memory 或AC97的控制寄存器,需要用到这段地址空间
相关的DMA空间必须在RAM中分配或者是在Config.bib中Reserve使用

#10


问题3:对于 
    DCD 0x90800000, 0x48000000,  1  ; Memory control register 
    ..... 
    DCD 0x91B00000, 0x5B000000,  1  ; AC97 Interface register 
这20个各是1M的空间,是拿来做相关的DMA区域么? 

这,看来是寄存器空间,在CE4.2版的%WINCE500%\PLATFORM\smdk2440\INC的s2440.h找到了对应值,比如:
在map.a中:
DCD 0x90800000, 0x48000000,  1  ; Memory control register
在S2440.H中:
#define MEMCTRL_BASE    0xB0800000
所有S2440.h的虚拟地址在MAP.a的虚拟地址基础上加了0X20000000。

   同时,如果操作内存SDRAM物理地址空间而不是寄存器空间。如S2440的0x2800 0000地址应该怎么操作? 
在一般的应用程序中访问I/O是访问它的缓存段虚拟地址,而驱动程序中必须访问无缓存段虚拟地址。
在楼主给的内存映射表上,SDRAM物理地址映射如下: 
DCD 0x8C000000, 0x30000000, 64  ; 64 MB DRAM BANK 0
那么,想操作SDRAM的地址空间,就从0x8C000000开始的64MB可以操作
    
   这样来说,如果在内存映射表中表明的寄存器空间,那么在S2440.h应该都可以找的到对应值。
    那么,各个寄存器空间的物理地址是如何得到的?答案是:在S3C2440的芯片手册上Table 1-4. S3C2440A Special Registers能查到相关定义!按照S3C2410/S3C2440芯片的内存控制器的设计,从0x4800 0000-0x5fff fff范围内的系统物理地址空间被命名为SFR(特殊功能寄存器)的片内外设寄存器(包括控制寄存器、状态寄存器以及数据缓冲区等)占用,这部分物理地址空间不可再用来其它用途。顺便提一下,SFR本来占用了共384MB的物理地址空间,但是其对应的虚拟内存则只占有0x9080 000 - 0x91bf ffff范围的19MB的虚拟地址空间,这里也看出虚拟存储的一个好处。
  S2440.h和map.a是怎样的关系呢?答案是:用S2440.h来作为参照点,在map.a中来确定具体每个寄存器对应的非缓存虚拟地址?

#11


引用 8 楼 iwillbeback008 的回复:
看来 gooogleman 果然是桂电的精英啊,看这种趋势,我看不出半年,可以做版主;不出1年可以去申请微软MVP咯! 
顶!


太抬举我了,你过一段时间你就知道这些东西有多么基础了!MVP?你去博客园的wince组的博客看看,你就知道什么叫做MVP了。——我感觉我就是一个混混。
我建议你看看hzdysymbol,gsymichael等回答的问题,
非常深入,他们回答的都是比较高级的。
剩下那个半吊子的问题就是我来瞎弄一下。

很想快点进步,但是越着急呢,问题越多。现在碰上了一些内存管理的问题,一窍不通呢。

估计离走入wince驱动大门还要一段时间

#12


引用 9 楼 hzdysymbol 的回复:
本想直接等着你送分,但想想一个问题也不回答直接拿分也不太好意思,回答一个吧: 
问题3:对于 
    DCD 0x90800000, 0x48000000,  1  ; Memory control register 
    ..... 
    DCD 0x91B00000, 0x5B000000,  1  ; AC97 Interface register 
这20个各是1M的空间,是拿来做相关的DMA区域么? 
这映射的1M地址空间是给CPU相关的控制寄存器操作用的,你需要读写Memory 或AC97的控制寄存器,需要用到这段地址空间 
相关的DMA空间…

按照你的意思,如果我是要对LCD分配1M的显示缓存区(应该也可成为DMA区吧),那我在Config.bib文件中的Memory节就可以这样写:
MEMORYRA
DISPLAY 8c100000  00100000  RESERVED ;320*240~1Mb的显示缓存

对不?
   
   那在Config.bib文件中的Memory节中,虚拟内存分段的顺序上,是不是NK段都要保证在最前面,接着是供CE执行程序和存放RAM文件系统的RAM段,最后是一些保留段,比如下面的例子:
MEMORY
; Tarzan Debug mode 
NK 8C200000  02000000  RAMIMAGE ;32MB 
RAM     8E000000  01F00000  RAM ;31MB

; Common RAM areas
AUD_DMA      8c002000  00002000  RESERVED 
DRV_GLB 8c010000  00010000  RESERVED
DBGSER_DMA 8c022000  00002000  RESERVED
SER_DMA 8c024000  00002000  RESERVED
DISPLAY 8c100000  00100000  RESERVED ;320*240~1Mb的显示缓

#13


引用 10 楼 iwillbeback008 的回复:
问题3:对于 
    DCD 0x90800000, 0x48000000,  1  ; Memory control register 
    ..... 
    DCD 0x91B00000, 0x5B000000,  1  ; AC97 Interface register 
这20个各是1M的空间,是拿来做相关的DMA区域么? 

这,看来是寄存器空间,在CE4.2版的%WINCE500%\PLATFORM\smdk2440\INC的s2440.h找到了对应值,比如: 
在map.a中: 
DCD 0x90800000, 0x48000000,  1  ; Memory control register 
在S2440.H中: 
#define M…

你在自问自答呢?

#14


那在Config.bib文件中的Memory节中,虚拟内存分段的顺序上,是不是NK段都要保证在最前面,接着是供CE执行程序和存放RAM文件系统的RAM段,最后是一些保留段,
没有规定说NK一定要在最前面,我看到的只有一点要求就是RAM区中间不断被Reserve,这两点是可以确定的,
别的可能还要仔细查阅相关文档

#15


引用 13 楼 hzdysymbol 的回复:
引用 10 楼 iwillbeback008 的回复:
问题3:对于 
    DCD 0x90800000, 0x48000000,  1  ; Memory control register 
    ..... 
    DCD 0x91B00000, 0x5B000000,  1  ; AC97 Interface register 
这20个各是1M的空间,是拿来做相关的DMA区域么? 

这,看来是寄存器空间,在CE4.2版的%WINCE500%\PLATFORM\smdk2440\INC的s2440.h找到了对应值,比如: 
在map.a中: 
DCD 0x90800000, 0x48000000,  1  ; Memory control r…

没有人看到或是不想说,恰好自己又找到些资料,放上来一起探讨一下了!

#16


问题1:其中的每一个SRAM(SRAM/ROM) BANK为啥都是32M?是不是有板子的地址线决定的,如果这样,那推算过来地址线应该是25根。但是查看友善提供的原理图,只有13根地址线链接SDRAM啊? 
-->每个BANK是32MB,是由CPU规定的该BANK可寻址的地址空间决定的,而不是由地址线决定的。这个可以看CPU的spec中给出的Memory Controller的物理地址列表。
你的问题有个概念混淆SRAM和DRAM是不一样的。SRAM必须是连续可寻址,而DRAM是行列地址交叉复用的。这是两者架构决定的差异,有兴趣可以google一下。
正是由于DRAM的行列地址复用,由RAS和CAS来区分行列(Row,Column),所以DRAM需要的地址线比以其容量计算出来的连续地址线要少的多。


问题2:64 MB DRAM BANK 0,1的,是不是对应Bank6和7,就是说每一片32M的SDRAM分别接到Bank6和Bank7上?还是两片32M的SDRAM都对应Bank6?(通过查看原理图,发现这两片的片选信号nSCS都是接到nGCS6上,两片的地址线都是LADDR[2-14]一片的数据线是LDATA[0-15],另一片是LDATA[16-31],好像这两片SDRAM是组成32M×32bit的存储阵列,对不?) 
-->64MB是指Bank6或者Bank7都可以达到(事实上,都可以达到128MB)。你对原理图的理解很正确,的确是2片32MBx16bit的SDRAM组成了32MBx32bit的SDRAM。但根据CPU接口设计,也可以2片32MBx16bit的SDRAM分别接在bank6和bank7上的。


问题3:对于 
    DCD 0x90800000, 0x48000000,  1  ; Memory control register 
    ..... 
    DCD 0x91B00000, 0x5B000000,  1  ; AC97 Interface register 
这20个各是1M的空间,是拿来做相关的DMA区域么? 
--> 是的,专门预先划分出“连续的”空间,而不是在程序里用Alloc之类的去申请,方便了驱动的设计,也提供了驱动和应用共同访问一个区域的手段。


问题4:这样从SRAM(SRAM/ROM) BANK 0到2 MB SROM(SRAM/ROM) BANK 0的写法,是不是有啥可以依据的规则? 
-->依据一:该物理地址对应的地址空间(CPU中规定多少就分配多少,多了没用)
依据二:实际需要的虚拟地址空间(即使CPU规定了可以达到1GB空间,但实际只需要使用1MB,那就只定义1MB足矣,多了浪费)


问题5:"DCD 0x8C000000, 0x30000000, 64  ; 64 MB DRAM BANK 0,1",这个64M的SDRAM一定要映射到0x8c00 0000地址么? 
-->从操作系统开发原理上讲:不是。你看linux,看Vxworks,这个0x300000000映射的都不是0x8c000000。
从CE开发来说:是。因为这是微软在几个版本里都定义好的,从底层到系统层都建立在此基础上。你可以改,但后果自负。


问题6:这个内存的静态映射表,需要驱动开发人员完全编写么?还是一般参照提供的BSP适当修改? 
-->一般不建议全部修改,适当修改即可。

  
问题7:对于想要从Nor Flash启动的系统,上边提到的内存映射表是这样写: 
    ;这里的Bank 0值,启动模式设置为从Nor Flash启动时,系统的起始物理地址就是0;系统启动后,在操作系统中访问      NorFlash的虚拟地址为0x92000000。 
    DCD 0x92000000, 0x00000000,  2  ; 2 MB SROM(SRAM/ROM) BANK 0 
那如果不需要从Nor Flash启动时,那就这个2M的空间就不用单独列出来,对不?  
-->这个2MB是划分给BANK0的,而不仅仅是划分给NOR的。所以,还是留着吧,即使实际可能不用这个bank0。

#17


这贴子有精华的潜力,MARK一下:)照这势头发展,明天给加下精:)

#18


16楼shuiyan正解。受益了。
建议楼主看一下2440的datasheet的memory controller一章,会比较清楚点。

#19


引用 17 楼 BEYONDMA 的回复:
这贴子有精华的潜力,MARK一下:)照这势头发展,明天给加下精:)


我觉得给shuiyan加分才对

这些问题不是我们不懂,而是我们觉得繁琐不想回答。
这个帖子可以推荐,因为很多初学者都会都这个东西迷迷糊糊的

#20


谢谢大家的帮助!
这里有个问题:

    关于“64M的SDRAM一定要映射到0x8c00 0000地址”,按照shuiyan 牛人说的“从CE开发来说:是。因为这是微软在几个版本里都定义好的,从底层到系统层都建立在此基础上。”

   那我现在使用的是三星官方的S3C2440的CE5.0BSP([WinCE50]SMDK2440A_Rev1.1)包,里头对于64M的SDRAM是映射到0x8000 0000的(该BSP包的其它地方也是按照这个地址去在config.bin中定义/分配内存段和在eboot.bib中定义Eboot等地址的)。这样的话,如果按照BSP提供商的预定义的去定制系统,这样应该可行吧?

#21


引用 20 楼 iwillbeback008 的回复:
谢谢大家的帮助! 
这里有个问题: 

    关于“64M的SDRAM一定要映射到0x8c00 0000地址”,按照shuiyan 牛人说的“从CE开发来说:是。因为这是微软在几个版本里都定义好的,从底层到系统层都建立在此基础上。” 

  那我现在使用的是三星官方的S3C2440的CE5.0BSP([WinCE50]SMDK2440A_Rev1.1)包,里头对于64M的SDRAM是映射到0x8000 0000的(该BSP包的其它地方也是按照这个地址去在config.bin中定义/分配内存段和在eboot.bib中…


这个可以改的。这个是内存起始的物理地址映射的虚拟地址
我改过。但是后面的地址也跟着偏移一些。

没有关系,这个只是个表,当然可以修改了
我把物理内存映射分成两段都可以。

只要修改合理没有问题。

楼主你只要知道是这么回事就可以了。

#22


谢谢大家的指点!
由于使用了“三星的官方的S3C2440CE5.0的BSP”,这么BSP是很干净的BSP,本身都没有被编译过。而且日子有点久远了,所以以上在静态内存的映射上有点不同,不过结果实践表明,是可以编译出系统的。
关于在使用"干净"的BSP开发时,首先遇到的问题,请参见以下这篇帖子:

PB编译中,在sysgen过程中无法复制文件的问题
http://topic.csdn.net/u/20081208/16/c3dbbae9-e977-4a3b-a776-3f4e45422296.html?558260523

#23


make

#24


顶起!

#1


问题7:对于想要从Nor Flash启动的系统,上边提到的内存映射表是这样写:
    ;这里的Bank 0值,启动模式设置为从Nor Flash启动时,系统的起始物理地址就是0;系统启动后,在操作系统中访问      NorFlash的虚拟地址为0x92000000。
    DCD 0x92000000, 0x00000000,  2  ; 2 MB SROM(SRAM/ROM) BANK 0
那如果不需要从Nor Flash启动时,那就这个2M的空间就不用单独列出来,对不?

#2


以下是摘自三星S3C2440的CE5.0BSP中的内存静态映射表:

g_oalAddressTable

        DCD     0x80000000, 0x30000000, 64      ; 64 MB DRAM BANK 6
        DCD     0x84000000, 0x10000000, 32      ; nGCS2: PCMCIA/PCCARD
        DCD     0x86000000, 0x18000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 3
        DCD     0x88000000, 0x20000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 4
        DCD     0x8A000000, 0x28000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 5
        DCD     0x8C000000, 0x08000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 1
        DCD     0x90800000, 0x48000000,  1      ; Memory control register
        DCD     0x90900000, 0x49000000,  1      ; USB Host register
        DCD     0x90A00000, 0x4A000000,  1      ; Interrupt Control register
        DCD     0x90B00000, 0x4B000000,  1      ; DMA control register
        DCD     0x90C00000, 0x4C000000,  1      ; Clock & Power register
        DCD     0x90D00000, 0x4D000000,  1      ; LCD control register
        DCD     0x90E00000, 0x4E000000,  1      ; NAND flash control register
        DCD     0x90F00000, 0x4F000000,  1      ; Camera control register
DCD     0x91000000, 0x50000000,  1      ; UART control register
        DCD     0x91100000, 0x51000000,  1      ; PWM timer register
        DCD     0x91200000, 0x52000000,  1      ; USB device register
        DCD     0x91300000, 0x53000000,  1      ; Watchdog Timer register
        DCD     0x91400000, 0x54000000,  1      ; IIC control register
        DCD     0x91500000, 0x55000000,  1      ; IIS control register
        DCD     0x91600000, 0x56000000,  1      ; I/O Port register
        DCD     0x91700000, 0x57000000,  1      ; RTC control register
        DCD     0x91800000, 0x58000000,  1      ; A/D convert register
        DCD     0x91900000, 0x59000000,  1      ; SPI register
        DCD     0x91A00000, 0x5A000000,  1      ; SD Interface register
        DCD     0x92000000, 0x00000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 0
        DCD     0x00000000, 0x00000000,  0      ; end of table

;------------------------------------------------------------------------------
        END


这里应该是从Nand Flash启动系统的吧?而且吧64M的SDRAM映射的了0x80000000起始的虚拟内存空间。而且在Bank2区域有个“nGCS2: PCMCIA/PCCARD”,是不是预留给PCMCIA/PCCARD设备的DMA区,还是别的用途?请高手为俺们这些半桶水的人指点一下。

#3


修整:
以上的:
DCD     0x80000000, 0x30000000, 64      ; 64 MB DRAM BANK 6
        DCD     0x84000000, 0x10000000, 32      ; nGCS2: PCMCIA/PCCARD
        DCD     0x86000000, 0x18000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 3
应为
         DCD     0x80000000, 0x30000000, 64      ; 64 MB DRAM BANK 6
        DCD     0x84000000, 0x10000000, 32      ; nGCS2: PCMCIA/PCCARD
        DCD     0x86000000, 0x18000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 3

#4


好基础的出问题啊,问题一:SDRAM地址线行列线复用的

#5


问题2:两片都接到bank6——楼主在论坛搜索一下。这些东西很多人都问过了。没有必要发帖的。。
关于内存为什么这么接,我发了一个帖子,并给出了答案。我博客也做了备份,去看看吧。

#6


第二部分:关于config.bib文件对OEMAddressTable/g_oalAddressTable所作内存静态映射的具体功能区域划分的理解
   “在虚实地址映射文件[例如ARM下的map.a的OEMAddressTable]中建立虚实地址的静态映射关系,包括RAM,FLASH各部分存储空间,OS启动后所能够识别的物理内存。接着在config.bib的MEMORY段把RAM映射后的虚拟地址进行分段,比如NK的大小,各种外设缓冲区的保留等.(注意这里是虚拟地址的划分,必须建立在映射基础上) ”
    不知道以上这个理解完全对不?
如果是这样,那么对于上边楼主列出的内存映射表,那么在config.bib的MEMORY段只能从0x8C00 0000这一虚拟地址开始,根据功能分段;而对于2楼的内存映射表,那么在config.bib的MEMORY段只能从0x8000 0000这一虚拟地址开始,根据功能分段咯。
    而且在实际的设计和移植系统时,只要按照BSP指定的具体内存静态映射的思路去做,不用强求config.bib的MEMORY段非要从某个虚拟地址开始[比如0x8000 0000],只要保证分段的内存在4G的CE地址空间的0x8000 0000-0x9fff ffff这一带缓存的地址就行了。
    这样分析,对么?
   还有就是,在做内存静态映射时,物理地址可以是不连续的;而虚拟地址上的安排上,一定要保证是连续的,这样说是正确的吧?


   以上讨论的都是SDRAM内存的静态映射和分配问题,有人可能就会问了:那2440和Nand Flash的硬件连线,是不是也是由nGCSX(X=0~7)控制的,挂靠在哪个BANK?
   其实Nand Flash不在地址空间里,只是类似硬盘的外设。2440和Nand Flash的硬件连线是有专门的引脚的nFCE ,不是nGCSX(X=0~7)。这两段取自gooogleman的帖子"对OEMAddressTable以及2440一些硬件连接的疑惑",特此表示感谢!
   

#7


引用 4 楼 fan227 的回复:
好基础的出问题啊,问题一:SDRAM地址线行列线复用的


这样回答,像没有点到实质啊?

#8


引用 5 楼 gooogleman 的回复:
问题2:两片都接到bank6——楼主在论坛搜索一下。这些东西很多人都问过了。没有必要发帖的。。 
关于内存为什么这么接,我发了一个帖子,并给出了答案。我博客也做了备份,去看看吧。

好,贴出了
问个内存电路接口以及访问问题
http://topic.csdn.net/u/20081113/09/7d480bb0-5485-4884-a620-495265f06d61.html?seed=581578907
S3C2410 SDRAM 和处理器相连接的注意点
http://blog.ednchina.com/thinkker/157652/message.aspx#
BIOS之内存控制器设置以及内存电路接口分析
http://blog.csdn.net/gooogleman/archive/2008/11/12/3283075.aspx

看来 gooogleman 果然是桂电的精英啊,看这种趋势,我看不出半年,可以做版主;不出1年可以去申请微软MVP咯!
顶!

#9


本想直接等着你送分,但想想一个问题也不回答直接拿分也不太好意思,回答一个吧:
问题3:对于 
    DCD 0x90800000, 0x48000000,  1  ; Memory control register 
    ..... 
    DCD 0x91B00000, 0x5B000000,  1  ; AC97 Interface register 
这20个各是1M的空间,是拿来做相关的DMA区域么? 
这映射的1M地址空间是给CPU相关的控制寄存器操作用的,你需要读写Memory 或AC97的控制寄存器,需要用到这段地址空间
相关的DMA空间必须在RAM中分配或者是在Config.bib中Reserve使用

#10


问题3:对于 
    DCD 0x90800000, 0x48000000,  1  ; Memory control register 
    ..... 
    DCD 0x91B00000, 0x5B000000,  1  ; AC97 Interface register 
这20个各是1M的空间,是拿来做相关的DMA区域么? 

这,看来是寄存器空间,在CE4.2版的%WINCE500%\PLATFORM\smdk2440\INC的s2440.h找到了对应值,比如:
在map.a中:
DCD 0x90800000, 0x48000000,  1  ; Memory control register
在S2440.H中:
#define MEMCTRL_BASE    0xB0800000
所有S2440.h的虚拟地址在MAP.a的虚拟地址基础上加了0X20000000。

   同时,如果操作内存SDRAM物理地址空间而不是寄存器空间。如S2440的0x2800 0000地址应该怎么操作? 
在一般的应用程序中访问I/O是访问它的缓存段虚拟地址,而驱动程序中必须访问无缓存段虚拟地址。
在楼主给的内存映射表上,SDRAM物理地址映射如下: 
DCD 0x8C000000, 0x30000000, 64  ; 64 MB DRAM BANK 0
那么,想操作SDRAM的地址空间,就从0x8C000000开始的64MB可以操作
    
   这样来说,如果在内存映射表中表明的寄存器空间,那么在S2440.h应该都可以找的到对应值。
    那么,各个寄存器空间的物理地址是如何得到的?答案是:在S3C2440的芯片手册上Table 1-4. S3C2440A Special Registers能查到相关定义!按照S3C2410/S3C2440芯片的内存控制器的设计,从0x4800 0000-0x5fff fff范围内的系统物理地址空间被命名为SFR(特殊功能寄存器)的片内外设寄存器(包括控制寄存器、状态寄存器以及数据缓冲区等)占用,这部分物理地址空间不可再用来其它用途。顺便提一下,SFR本来占用了共384MB的物理地址空间,但是其对应的虚拟内存则只占有0x9080 000 - 0x91bf ffff范围的19MB的虚拟地址空间,这里也看出虚拟存储的一个好处。
  S2440.h和map.a是怎样的关系呢?答案是:用S2440.h来作为参照点,在map.a中来确定具体每个寄存器对应的非缓存虚拟地址?

#11


引用 8 楼 iwillbeback008 的回复:
看来 gooogleman 果然是桂电的精英啊,看这种趋势,我看不出半年,可以做版主;不出1年可以去申请微软MVP咯! 
顶!


太抬举我了,你过一段时间你就知道这些东西有多么基础了!MVP?你去博客园的wince组的博客看看,你就知道什么叫做MVP了。——我感觉我就是一个混混。
我建议你看看hzdysymbol,gsymichael等回答的问题,
非常深入,他们回答的都是比较高级的。
剩下那个半吊子的问题就是我来瞎弄一下。

很想快点进步,但是越着急呢,问题越多。现在碰上了一些内存管理的问题,一窍不通呢。

估计离走入wince驱动大门还要一段时间

#12


引用 9 楼 hzdysymbol 的回复:
本想直接等着你送分,但想想一个问题也不回答直接拿分也不太好意思,回答一个吧: 
问题3:对于 
    DCD 0x90800000, 0x48000000,  1  ; Memory control register 
    ..... 
    DCD 0x91B00000, 0x5B000000,  1  ; AC97 Interface register 
这20个各是1M的空间,是拿来做相关的DMA区域么? 
这映射的1M地址空间是给CPU相关的控制寄存器操作用的,你需要读写Memory 或AC97的控制寄存器,需要用到这段地址空间 
相关的DMA空间…

按照你的意思,如果我是要对LCD分配1M的显示缓存区(应该也可成为DMA区吧),那我在Config.bib文件中的Memory节就可以这样写:
MEMORYRA
DISPLAY 8c100000  00100000  RESERVED ;320*240~1Mb的显示缓存

对不?
   
   那在Config.bib文件中的Memory节中,虚拟内存分段的顺序上,是不是NK段都要保证在最前面,接着是供CE执行程序和存放RAM文件系统的RAM段,最后是一些保留段,比如下面的例子:
MEMORY
; Tarzan Debug mode 
NK 8C200000  02000000  RAMIMAGE ;32MB 
RAM     8E000000  01F00000  RAM ;31MB

; Common RAM areas
AUD_DMA      8c002000  00002000  RESERVED 
DRV_GLB 8c010000  00010000  RESERVED
DBGSER_DMA 8c022000  00002000  RESERVED
SER_DMA 8c024000  00002000  RESERVED
DISPLAY 8c100000  00100000  RESERVED ;320*240~1Mb的显示缓

#13


引用 10 楼 iwillbeback008 的回复:
问题3:对于 
    DCD 0x90800000, 0x48000000,  1  ; Memory control register 
    ..... 
    DCD 0x91B00000, 0x5B000000,  1  ; AC97 Interface register 
这20个各是1M的空间,是拿来做相关的DMA区域么? 

这,看来是寄存器空间,在CE4.2版的%WINCE500%\PLATFORM\smdk2440\INC的s2440.h找到了对应值,比如: 
在map.a中: 
DCD 0x90800000, 0x48000000,  1  ; Memory control register 
在S2440.H中: 
#define M…

你在自问自答呢?

#14


那在Config.bib文件中的Memory节中,虚拟内存分段的顺序上,是不是NK段都要保证在最前面,接着是供CE执行程序和存放RAM文件系统的RAM段,最后是一些保留段,
没有规定说NK一定要在最前面,我看到的只有一点要求就是RAM区中间不断被Reserve,这两点是可以确定的,
别的可能还要仔细查阅相关文档

#15


引用 13 楼 hzdysymbol 的回复:
引用 10 楼 iwillbeback008 的回复:
问题3:对于 
    DCD 0x90800000, 0x48000000,  1  ; Memory control register 
    ..... 
    DCD 0x91B00000, 0x5B000000,  1  ; AC97 Interface register 
这20个各是1M的空间,是拿来做相关的DMA区域么? 

这,看来是寄存器空间,在CE4.2版的%WINCE500%\PLATFORM\smdk2440\INC的s2440.h找到了对应值,比如: 
在map.a中: 
DCD 0x90800000, 0x48000000,  1  ; Memory control r…

没有人看到或是不想说,恰好自己又找到些资料,放上来一起探讨一下了!

#16


问题1:其中的每一个SRAM(SRAM/ROM) BANK为啥都是32M?是不是有板子的地址线决定的,如果这样,那推算过来地址线应该是25根。但是查看友善提供的原理图,只有13根地址线链接SDRAM啊? 
-->每个BANK是32MB,是由CPU规定的该BANK可寻址的地址空间决定的,而不是由地址线决定的。这个可以看CPU的spec中给出的Memory Controller的物理地址列表。
你的问题有个概念混淆SRAM和DRAM是不一样的。SRAM必须是连续可寻址,而DRAM是行列地址交叉复用的。这是两者架构决定的差异,有兴趣可以google一下。
正是由于DRAM的行列地址复用,由RAS和CAS来区分行列(Row,Column),所以DRAM需要的地址线比以其容量计算出来的连续地址线要少的多。


问题2:64 MB DRAM BANK 0,1的,是不是对应Bank6和7,就是说每一片32M的SDRAM分别接到Bank6和Bank7上?还是两片32M的SDRAM都对应Bank6?(通过查看原理图,发现这两片的片选信号nSCS都是接到nGCS6上,两片的地址线都是LADDR[2-14]一片的数据线是LDATA[0-15],另一片是LDATA[16-31],好像这两片SDRAM是组成32M×32bit的存储阵列,对不?) 
-->64MB是指Bank6或者Bank7都可以达到(事实上,都可以达到128MB)。你对原理图的理解很正确,的确是2片32MBx16bit的SDRAM组成了32MBx32bit的SDRAM。但根据CPU接口设计,也可以2片32MBx16bit的SDRAM分别接在bank6和bank7上的。


问题3:对于 
    DCD 0x90800000, 0x48000000,  1  ; Memory control register 
    ..... 
    DCD 0x91B00000, 0x5B000000,  1  ; AC97 Interface register 
这20个各是1M的空间,是拿来做相关的DMA区域么? 
--> 是的,专门预先划分出“连续的”空间,而不是在程序里用Alloc之类的去申请,方便了驱动的设计,也提供了驱动和应用共同访问一个区域的手段。


问题4:这样从SRAM(SRAM/ROM) BANK 0到2 MB SROM(SRAM/ROM) BANK 0的写法,是不是有啥可以依据的规则? 
-->依据一:该物理地址对应的地址空间(CPU中规定多少就分配多少,多了没用)
依据二:实际需要的虚拟地址空间(即使CPU规定了可以达到1GB空间,但实际只需要使用1MB,那就只定义1MB足矣,多了浪费)


问题5:"DCD 0x8C000000, 0x30000000, 64  ; 64 MB DRAM BANK 0,1",这个64M的SDRAM一定要映射到0x8c00 0000地址么? 
-->从操作系统开发原理上讲:不是。你看linux,看Vxworks,这个0x300000000映射的都不是0x8c000000。
从CE开发来说:是。因为这是微软在几个版本里都定义好的,从底层到系统层都建立在此基础上。你可以改,但后果自负。


问题6:这个内存的静态映射表,需要驱动开发人员完全编写么?还是一般参照提供的BSP适当修改? 
-->一般不建议全部修改,适当修改即可。

  
问题7:对于想要从Nor Flash启动的系统,上边提到的内存映射表是这样写: 
    ;这里的Bank 0值,启动模式设置为从Nor Flash启动时,系统的起始物理地址就是0;系统启动后,在操作系统中访问      NorFlash的虚拟地址为0x92000000。 
    DCD 0x92000000, 0x00000000,  2  ; 2 MB SROM(SRAM/ROM) BANK 0 
那如果不需要从Nor Flash启动时,那就这个2M的空间就不用单独列出来,对不?  
-->这个2MB是划分给BANK0的,而不仅仅是划分给NOR的。所以,还是留着吧,即使实际可能不用这个bank0。

#17


这贴子有精华的潜力,MARK一下:)照这势头发展,明天给加下精:)

#18


16楼shuiyan正解。受益了。
建议楼主看一下2440的datasheet的memory controller一章,会比较清楚点。

#19


引用 17 楼 BEYONDMA 的回复:
这贴子有精华的潜力,MARK一下:)照这势头发展,明天给加下精:)


我觉得给shuiyan加分才对

这些问题不是我们不懂,而是我们觉得繁琐不想回答。
这个帖子可以推荐,因为很多初学者都会都这个东西迷迷糊糊的

#20


谢谢大家的帮助!
这里有个问题:

    关于“64M的SDRAM一定要映射到0x8c00 0000地址”,按照shuiyan 牛人说的“从CE开发来说:是。因为这是微软在几个版本里都定义好的,从底层到系统层都建立在此基础上。”

   那我现在使用的是三星官方的S3C2440的CE5.0BSP([WinCE50]SMDK2440A_Rev1.1)包,里头对于64M的SDRAM是映射到0x8000 0000的(该BSP包的其它地方也是按照这个地址去在config.bin中定义/分配内存段和在eboot.bib中定义Eboot等地址的)。这样的话,如果按照BSP提供商的预定义的去定制系统,这样应该可行吧?

#21


引用 20 楼 iwillbeback008 的回复:
谢谢大家的帮助! 
这里有个问题: 

    关于“64M的SDRAM一定要映射到0x8c00 0000地址”,按照shuiyan 牛人说的“从CE开发来说:是。因为这是微软在几个版本里都定义好的,从底层到系统层都建立在此基础上。” 

  那我现在使用的是三星官方的S3C2440的CE5.0BSP([WinCE50]SMDK2440A_Rev1.1)包,里头对于64M的SDRAM是映射到0x8000 0000的(该BSP包的其它地方也是按照这个地址去在config.bin中定义/分配内存段和在eboot.bib中…


这个可以改的。这个是内存起始的物理地址映射的虚拟地址
我改过。但是后面的地址也跟着偏移一些。

没有关系,这个只是个表,当然可以修改了
我把物理内存映射分成两段都可以。

只要修改合理没有问题。

楼主你只要知道是这么回事就可以了。

#22


谢谢大家的指点!
由于使用了“三星的官方的S3C2440CE5.0的BSP”,这么BSP是很干净的BSP,本身都没有被编译过。而且日子有点久远了,所以以上在静态内存的映射上有点不同,不过结果实践表明,是可以编译出系统的。
关于在使用"干净"的BSP开发时,首先遇到的问题,请参见以下这篇帖子:

PB编译中,在sysgen过程中无法复制文件的问题
http://topic.csdn.net/u/20081208/16/c3dbbae9-e977-4a3b-a776-3f4e45422296.html?558260523

#23


make

#24


顶起!