wangxin_china
驱动中牛
驱动中牛
  • 注册日期2003-03-28
  • 最后登录2008-09-30
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望18点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3976回复:23

WINCE的MMU初始化的疑问

楼主#
更多 发布于:2008-06-30 14:37
我看了2410为WINCE进行MMU初始化的代码,对其中的做法不是太清楚。哪位前辈对这个有所研究是否可以指点一下。

1. PTs     EQU 0x31E00000
WINCE的镜像文件从0x30200000开始装载,共32M。
但是0x30200000到0x31E00000只有28M,说明镜像文件大小为32M,其实后面都是无用的数据?

2.将同一物理地址映射为不同的虚地址,但是一个是cachable bufferable另一个是uncachable unbufferable
是为了访问方便?

3.MMU是如何进行从0x31E00000开始的这个表单查询的,这部分源代码在哪里?
为什么PTs + 0x2000~0x27FC开始cachable bufferable的映射
为什么PTs + 0x2800~0x2FFC开始uncachable unbufferable的映射
为什么PTs + 0x0000对0x30000000地址进行cachable bufferable的映射
为什么PTs + 0x0800对0x30000000地址进行uncachable unbufferable的映射
为什么PTs + 0x0C00~0x0CFC对64M的RAM空间进行映射?算最开始的2次,已经是第三次了
这些映射关系WINCE是如何使用的?

我找了很久都没有这方面的说明,哪位大侠给我解释一下,万分感谢.

harktrip
驱动小牛
驱动小牛
  • 注册日期2003-11-30
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望457点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分2分
沙发#
发布于:2008-06-30 16:16
终于有人关注到这问题了,我之前提出来这方面的,只有”自认是专家”的踢馆,
却提不出为何WINCE4.2 DRAM的效率比市售PPC的效率低很多.
相同的软件在WINCE4.2跑和PPC上跑,速度差了三四倍以上.
(同样2440+64M DRAM)
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
板凳#
发布于:2008-06-30 16:58
to harktrip:
搜索了一下你的帖子,发现你说的
只有”自认是专家”的踢馆
指得是我,
其实有些测试软件可以测试性能的,比如说tcpmp,它的设置里,如果显示时钟频率是400MHz左右跟你的CPU主频相当,则说明CACHE肯定是打开的,因为那个时钟频率是测算出来的,执行n条指令,除以用掉的时间,得出时钟频率。这样有测试数据比较能说明问题,我用tcpmp的这个功能得知我的主频是400MHz左右,所以我知道icache/dcache肯定是打开的。
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
地板#
发布于:2008-06-30 18:37
楼主看的不是CE内核的MMU页表映射,而是eboot的MMU映射的代码,内核的KernelStart要看private/winceos/coreos/nk/kernel/arm/armtrap.s中的实现。private目录下的代码是微软内核开放源码部分,可以看到是怎么实现的,但是不支持修改编译到你自己的平台中。由armtrap.s中的KernelStart的函数功能描述得知,分两级页表,PTs是第一级页表,HighPT是第二级页表,映射0xFFF00000最高1M的内存,最高1M内存存放PTs,HighPT和异常向量,KernelData等,PTs里存放OEMAddressTable的映射,512M虚拟内存空间映射4G的物理内存空间。
; The page tables and exception vectors are setup. Initialize the MMU and turn it on.
由此可见,MMU设置映射表是微软提供的,I/D CACHE的使能也是内核armtrap.s做的,不是OEM做的,这样的结论就是只要内核版本是一样的,它的MMU页表映射和CACHE打开都是由内核完成,即微软提供的,而不是第三方OEM做的,我认为CE 跑起来之后CACHE总是使能的结论就能成立。而不像harktrip网友说的“踢馆”,还是建议你多看源码。
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
地下室#
发布于:2008-07-01 10:06
也是wince5.0,安装的时候把shared source codes也选上。wince4.2里也一样的。
wangxin_china
驱动中牛
驱动中牛
  • 注册日期2003-03-28
  • 最后登录2008-09-30
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望18点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-07-01 10:22
你的意思是说看private目录下的代码可以知道是怎么实现的,但是即使修改也不会对编译文件有影响?

我看到有些人说可以, 改了後要重build 那些 code 然後再 SYSGEN 才會有用。他们说的不对么?
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
6楼#
发布于:2008-07-01 12:45
我们看一下nk.lib的内容,和它是怎么生成的。在nk.lib里可以看到D:\macallan\private\winceos\COREOS\nk\kernel\nknormal\obj\ARMV4I\retail\armtrap.obj而这个根本不是我的wince安装目录,所以可以得知它不是编译private下的源码生成的。再看wince500/public/common/cesysgen/makefile
nkcompr nknocomp nkmapfile nknomapfile::
        set NKLIBS=%%NKLIBS%% $(SG_INPUT_LIB)\$@.lib

# OEM can specify where to place their replaced components
!IF "$(NK_REPLACE_ROOT)" == ""
NK_REPLACE_ROOT=$(_PROJECTROOT)
!ENDIF

!IF "$(NK_REPLACE_COMPONENTS)" != ""
$(NK_REPLACE_COMPONENTS)::
        set NKLIBS=%%NKLIBS%% $(NK_REPLACE_ROOT)\oak\lib\$(_CPUINDPATH)\$@.lib
!ENDIF

nk::
        set NKLIBS=

nk::$(NK_COMPONENTS) $(NK_REPLACE_COMPONENTS)
        set TARGETTYPE=LIBRARY
        set TARGETNAME=$@
        set RELEASETYPE=OAK
        set TARGETLIBS=
        set SOURCELIBS=%%NKLIBS%% $(SG_INPUT_LIB)\nkmain.lib
        $(MAKECMD) /NOLOGO $(SG_OUTPUT_OAKLIB)\$@.lib
知道nk.lib是由nkmain.lib nkcompr nknocomp nkmapfile nknomapfile打包而成。而这些库都是微软事先编译好放在wince500/public/common/oak/lib/armv4i/retail/目录下。由此可以确认private目录下的源码在PB里不会被编译。我想那些人说法不成立。
wangxin_china
驱动中牛
驱动中牛
  • 注册日期2003-03-28
  • 最后登录2008-09-30
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望18点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-07-02 08:51
zhengshijie大侠:
我看了帮助,上面说eboot的startup在
%_WINCEROOT%\Platform\MyPlatform\Src\Bootloader\Eboot目录下
OAL的startup在
%_WINCEROOT%\Platform\<Hardware Platform Name>\Src\Kernel\OAL目录下

而我在我的开发板BSP的%_WINCEROOT%\Platform\MyPlatform\KERNEL\HAL\ARM下看到一个fw.s文件,在里面也有一个startup函数,我在里面加了代码可以控制LED。

请问NK.nb0这个文件的入口函数和内存地址从那个文件可以看出?非常感谢。
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
8楼#
发布于:2008-07-02 09:24
这个帮助是针对5.0BSP目录结构来说的,而你的BSP看得出来是4.2的目录结构,所以是kernel/hal/arm/fw.s,所以你的BSP里NK.NB0的入口函数是fw.s中的StartUp,内存地址是由config.bib的NK的起始地址决定的,比如说
NK            8C200000  01e00000  RAMIMAGE,就是从0x8C200000开始,至于StartUp的地址一般来说会偏移0x1000,只要StartUp前面有    STARTUPTEXT声明,具体可以通过kern.map看出来, 0001:00000000       StartUp                    00011000     oal:startup.obj。
wangxin_china
驱动中牛
驱动中牛
  • 注册日期2003-03-28
  • 最后登录2008-09-30
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望18点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2008-07-02 09:53
对,我的MAP文件是这样的:
0001:00000000       StartUp                    8c581000     hal:fw.obj
之后是KernelStart是
0001:00029440       KernelStart                8c5aa440     nk:armtrap.obj
就是说明link的是下面的文件?
C:\WINCE500\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\armtrap.s
xyj8303
驱动小牛
驱动小牛
  • 注册日期2007-05-28
  • 最后登录2009-04-01
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望137点
  • 贡献值0点
  • 好评度103点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2008-07-02 14:11
帮顶一下
high
论坛版主
论坛版主
  • 注册日期2002-08-10
  • 最后登录2010-07-26
  • 粉丝4
  • 关注0
  • 积分60分
  • 威望655点
  • 贡献值0点
  • 好评度56点
  • 原创分0分
  • 专家分60分
11楼#
发布于:2008-07-03 04:03
关注harktrip的说法. 我最近也被这个困扰.

cache和uncache的目的很简单, 提供2个访问方式, 一个是通过cache, 一个是不通过cache. 比如对io和寄存器这样的访问, (在arm中, io和寄存器都被映射到地址访问) ,就不希望从cache中访问

cache有这些特性, 对同一目标单元连续读取操作将得到相同的结果. 比如你的按键io,要是使用cache地址, 我想, 无论你怎么按, cpu都是从cache读到相同的值了还有个特性, 对同一地址连续写只是把后一次写操作的值写入, 第一次的没有意义. 再加上write buffer的存在, 只在必定条件下才写, ,这个更惨
high
论坛版主
论坛版主
  • 注册日期2002-08-10
  • 最后登录2010-07-26
  • 粉丝4
  • 关注0
  • 积分60分
  • 威望655点
  • 贡献值0点
  • 好评度56点
  • 原创分0分
  • 专家分60分
12楼#
发布于:2008-07-03 04:30
zhengshijie兄, 我想, nk.lib是可以编译出来的. 再次编译private下的源码替换nkmain.lib nkcompr nknocomp nkmapfile nknomapfile这些库或者局部替换. 此后交由pb来sysgen.这样可以重新编译新的nk.lib. 我之前为了trace启动挂死原因,  曾做过这样的事情.
wangxin_china
驱动中牛
驱动中牛
  • 注册日期2003-03-28
  • 最后登录2008-09-30
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望18点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2008-07-03 12:35
high 老大,我看到 \WINCE500\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ 下写的 excluded from build

是不是就是这个部分不能被编译进入NK.nb0里面?
high
论坛版主
论坛版主
  • 注册日期2002-08-10
  • 最后登录2010-07-26
  • 粉丝4
  • 关注0
  • 积分60分
  • 威望655点
  • 贡献值0点
  • 好评度56点
  • 原创分0分
  • 专家分60分
14楼#
发布于:2008-07-03 13:42
excluded from build
是的.private下的都是, 但,出现这个的逻辑仅仅只是因为dir文件没有包含该目录.所以,你可以手动build或加入dir. 最后生成的nk.bin, pb的调试窗口会warning警告你,编译过了哪个私有代码.
wangxin_china
驱动中牛
驱动中牛
  • 注册日期2003-03-28
  • 最后登录2008-09-30
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望18点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2008-07-03 16:37
还是不太懂,你能给一个编译PRIVATE\WINCEOS\COREOS\NK这个目录并将目标文件替换系统默认的库文件的步骤么?
换句话说就是,我怎么才能把
\WINCE500\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\armtrap.s编译到NK.nb0里面,我直接编译KERNEL这个文件夹是报错的。谢谢了。
high
论坛版主
论坛版主
  • 注册日期2002-08-10
  • 最后登录2010-07-26
  • 粉丝4
  • 关注0
  • 积分60分
  • 威望655点
  • 贡献值0点
  • 好评度56点
  • 原创分0分
  • 专家分60分
16楼#
发布于:2008-07-03 17:13
查看armtrap.s文件:

        mfc15   r1, c1
        orr     r1, r1, #0x007F                 ; changed to read-mod-write for ARM920 Enable: MMU, Align, DCache, WriteBuffer
        orr     r1, r1, #0x3200                 ; vector adjust, ICache, ROM protection
        ldr     r0, VirtualStart
        cmp     r0, #0                          ; make sure no stall on "mov pc,r0" below
        mtc15   r1, c1                          ; enable the MMU & Caches
        mov     pc, r0                          ;  & jump to new virtual address
        nop
-------------------------------------------------------
的确, 内核kernlestart里面自己会打开icache. 那么还有什么情况造成tcpmp的频率测试没有400M呢?
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
17楼#
发布于:2008-07-03 19:57
在startup.s中要设置一下主频,原因我也不清楚,我相同的代码,重新设了主频的,跑起来用tcpmp测是400MHz左右,没有设置的跑起来约为我的总线频率135MHz。
wangxin_china
驱动中牛
驱动中牛
  • 注册日期2003-03-28
  • 最后登录2008-09-30
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望18点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2008-07-03 23:43
我在\WINCE500\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\里的DIR文件添加了ARM目录,然后又根据编译错误提示,在source添加了TARGETNAME和TARGETTYPE的定义
TARGETNAME=nkkernel    -------------------  这个输出的文件应该叫什么名字??请大侠帮忙。
TARGETTYPE=LIBRARY

然后又根据编译器的提示修改了一些定义,总算可以把COREOS编译通过,但是重新连接,并没有任务作用

请问这里应该把哪几个输出文件复制到哪个文件夹下,在重新连接才会生效??求求各位高手提示一下,实在没有找到头绪,谢谢了。
shuiii
驱动牛犊
驱动牛犊
  • 注册日期2005-08-26
  • 最后登录2011-05-30
  • 粉丝1
  • 关注0
  • 积分605分
  • 威望173点
  • 贡献值0点
  • 好评度57点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2008-08-22 12:52
顶起来,请教各位大侠?
EBOOT的MMU和KERNEL的MMU是不一样的吗?
EBOOT的MMU启动之后中断向表映射到哪了呢?
http://www.esdevelop.cn
上一页
游客

返回顶部