milkyway的窝

最初想法的诞生地

 

OEMAddressTable,config.bib详解

OEMAddressTable只存在于X86和ARM架构的平台下,用来定义从4GB的虚拟地址到物理512MB存储空间的静态映射关系,它实质是一个结构变量。
typedef struct
{
ULONG ulVirtualAddress;
ULONG ulPhysicalAddress;
ULONG ulSizeInMegs;
} AddressTableStruct;

#define MEG(A) (((A - 1)>>20) + 1)

const AddressTableStruct OEMAddressTable[] =
{
{ SDRAM_VIRTUAL_MEMORY, //虚拟地址
PHYSICAL_ADDR_SDRAM_MAIN, //物理地址
MEG(SDRAM_MAIN_BLOCK_SIZE) //这段空间的大小,以M计
},
………………………
{
0,
0,
0
}
};
如例子所示,OEMAddressTable为一个结构数组,每项的第一个成员为虚拟地址,第二个成员为对应的物理地址,最后一个成员为该段空间的大小。这个数组的最后一项必须全部为0,以示整个数组的结束。内核启动时会读取这个数组的内容以初始化MMU页表。启用MMU以后OS内核段程序(如ISR)可以用这里的虚拟地址来访问设备。当然,OEMAddressTable中所用到的每个物理地址及虚拟地址都需要在头文件中定义。
     

比如X86的OEMAddressTable (platform\common\src\x86\common\startup\startup.asm):

_OEMAddressTable:

        dd  80000000h,     0,      04000000h  //格式为:虚拟地址,物理地址,大小

注意(1)这里的大小,X86下为4MB的倍数,ARM下为1MB的倍数。
         (2)这里的映射是静态的cached,虚拟地址范围是0x8000000-0x9FFFFFFF,系统会自动添加uncached段的映射,从0xA000000-0xBFFFFFFF.

       CONFIG.BIB文件分两个部分,我们且称之为段,MEMORY段和CONFIG段。MEMORY段定义虚拟内存的分片方法,CONFIG段定义它的一些属性。以下是一个CONFIG.BIB文件MEMORY段的例子:
     来自platform\CEPC\files\config.bib:

 

MEMORY

;   Name     Start     Size      Type

;   -------  --------  --------  ----

; 64 MB of RAM (note: AUTOSIZE will adjust boundary)

    NK       80220000  009E0000  RAMIMAGE     //系统镜像

    RAM      80C00000  03400000  RAM                // 应用程序与文件系统区域

    DMA      80100000  00030000  RESERVED   ; Native DMA reserved.

    BOOTARGS 801FFF00  00000100  RESERVED   ; Boot arguments

    EDBG_DMA 80200000  00020000  RESERVED   ; EDBG DMA buffer





posted on 2007-04-19 11:24 milkyway 阅读(3962) 评论(4)  编辑 收藏 引用 所属分类: Wince学习小结

评论

# re: OEMAddressTable,config.bib详解 2007-05-12 15:04 杨锐

请问一下楼主:
Wince中的中断向量表保存在什么位置呢?由于使能了MMU,这个位置是物理地址,还是虚拟地址呢?
我有个过程没有搞清楚,但外部中断发生时,ARM的PC指针应该自动跳转到0x0,或者0xffff0000这个地址,但当使能了MMU以后,PC会跳转到物理地址的0x0呢?还是虚拟地址0x0?
本来我认为是要跳转到虚拟地址的0x0,通过MMU映射以后,可以把它映射到物理地址的SDRAM空间,这样访问速度就会快很多,但是在OEMAddressTable中,看不到把虚拟地址0x0映射的物理地址。
通过看config.bib,发现内核是从80001000这个虚拟地址开始,在OEMAddressTable将他映射到了SDRAM的物理地址空间。
我上述的理解肯定有问题,请您给我解释一下,好吗?谢谢!!  回复  更多评论   

# re: OEMAddressTable,config.bib详解 2007-05-13 18:23 milkyway

在wince启动后,MMU就被使能了,所以这时你访问的只能是虚拟地址,不是物理地址。
中断向量表的位置和处理器有关,ARM要求中断向量表放置从0地址开始。你说的中断跳转地址实际是物理地址的0x,但是由于启用了MMU,所以CPU只能认虚拟地址。至于这个虚实映射的对应关系就在OEMAddressTable中。你看对应物理地址是0x的虚拟地址是多少。
你说的内核从80001000这个虚拟地址开始,这个是可以在config.bib中设置的。实际的物理地址参考OEMAddressTable。
希望对你有点作用。
  回复  更多评论   

# re: OEMAddressTable,config.bib详解 2007-05-18 20:15 杨锐

谢谢你啊!!  回复  更多评论   

# re: OEMAddressTable,config.bib详解 2008-01-15 09:59 abby

请教一下搂主:
在使用XIPKERNEL时,之前我定义CONFIG。BIB为
XIPKERNEL 80040000 001C0000 RAMIMAGE
NK 80200000 01C00000 RAMIMAGE
CHAIN $(CHAIN_ADDRESS) 00004000 RESERVED

RESERVE 8df00000 00080000
RAM 8c200000 03C00000 RAM
现在我想改变一下RAM的起始地址,在各个相关的文件中都把RAM的起始地址改为了94200000,映射表也为94000000 300000000 64

但我发现一个问题就是,从各种实验结果看好像是系统找不到94000000这个虚拟地址对30000000的映射,系统起不来。我想问一下,在使用XIP功能时对于RAM 的起始位置有什么规定吗?还是有其他一些说法。我用的是三星的2443,ARM核。
对这个的理解我还有些不是特别透彻,请您给我讲解一下,好吗? 谢谢!  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

公告

随笔皆原创,文章乃转载. 欢迎留言!

常用链接

留言簿(37)

随笔分类(104)

随笔档案(101)

文章分类(51)

文章档案(53)

wince牛人

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜