阅读:3976回复:23
WINCE的MMU初始化的疑问
我看了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是如何使用的? 我找了很久都没有这方面的说明,哪位大侠给我解释一下,万分感谢. |
|
沙发#
发布于:2008-06-30 16:16
终于有人关注到这问题了,我之前提出来这方面的,只有”自认是专家”的踢馆,
却提不出为何WINCE4.2 DRAM的效率比市售PPC的效率低很多. 相同的软件在WINCE4.2跑和PPC上跑,速度差了三四倍以上. (同样2440+64M DRAM) |
|
板凳#
发布于:2008-06-30 16:58
to harktrip:
搜索了一下你的帖子,发现你说的 只有”自认是专家”的踢馆 指得是我, 其实有些测试软件可以测试性能的,比如说tcpmp,它的设置里,如果显示时钟频率是400MHz左右跟你的CPU主频相当,则说明CACHE肯定是打开的,因为那个时钟频率是测算出来的,执行n条指令,除以用掉的时间,得出时钟频率。这样有测试数据比较能说明问题,我用tcpmp的这个功能得知我的主频是400MHz左右,所以我知道icache/dcache肯定是打开的。 |
|
地板#
发布于: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网友说的“踢馆”,还是建议你多看源码。 |
|
地下室#
发布于:2008-07-01 10:06
也是wince5.0,安装的时候把shared source codes也选上。wince4.2里也一样的。
|
|
5楼#
发布于:2008-07-01 10:22
你的意思是说看private目录下的代码可以知道是怎么实现的,但是即使修改也不会对编译文件有影响?
我看到有些人说可以, 改了後要重build 那些 code 然後再 SYSGEN 才會有用。他们说的不对么? |
|
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里不会被编译。我想那些人说法不成立。 |
|
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这个文件的入口函数和内存地址从那个文件可以看出?非常感谢。 |
|
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。 |
|
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 |
|
10楼#
发布于:2008-07-02 14:11
帮顶一下
|
|
11楼#
发布于:2008-07-03 04:03
关注harktrip的说法. 我最近也被这个困扰.
cache和uncache的目的很简单, 提供2个访问方式, 一个是通过cache, 一个是不通过cache. 比如对io和寄存器这样的访问, (在arm中, io和寄存器都被映射到地址访问) ,就不希望从cache中访问 cache有这些特性, 对同一目标单元连续读取操作将得到相同的结果. 比如你的按键io,要是使用cache地址, 我想, 无论你怎么按, cpu都是从cache读到相同的值了还有个特性, 对同一地址连续写只是把后一次写操作的值写入, 第一次的没有意义. 再加上write buffer的存在, 只在必定条件下才写, ,这个更惨 |
|
12楼#
发布于:2008-07-03 04:30
zhengshijie兄, 我想, nk.lib是可以编译出来的. 再次编译private下的源码替换nkmain.lib nkcompr nknocomp nkmapfile nknomapfile这些库或者局部替换. 此后交由pb来sysgen.这样可以重新编译新的nk.lib. 我之前为了trace启动挂死原因, 曾做过这样的事情.
|
|
13楼#
发布于:2008-07-03 12:35
high 老大,我看到 \WINCE500\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ 下写的 excluded from build
是不是就是这个部分不能被编译进入NK.nb0里面? |
|
14楼#
发布于:2008-07-03 13:42
excluded from build
是的.private下的都是, 但,出现这个的逻辑仅仅只是因为dir文件没有包含该目录.所以,你可以手动build或加入dir. 最后生成的nk.bin, pb的调试窗口会warning警告你,编译过了哪个私有代码. |
|
15楼#
发布于:2008-07-03 16:37
还是不太懂,你能给一个编译PRIVATE\WINCEOS\COREOS\NK这个目录并将目标文件替换系统默认的库文件的步骤么?
换句话说就是,我怎么才能把 \WINCE500\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\armtrap.s编译到NK.nb0里面,我直接编译KERNEL这个文件夹是报错的。谢谢了。 |
|
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呢? |
|
17楼#
发布于:2008-07-03 19:57
在startup.s中要设置一下主频,原因我也不清楚,我相同的代码,重新设了主频的,跑起来用tcpmp测是400MHz左右,没有设置的跑起来约为我的总线频率135MHz。
|
|
18楼#
发布于:2008-07-03 23:43
我在\WINCE500\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\里的DIR文件添加了ARM目录,然后又根据编译错误提示,在source添加了TARGETNAME和TARGETTYPE的定义
TARGETNAME=nkkernel ------------------- 这个输出的文件应该叫什么名字??请大侠帮忙。 TARGETTYPE=LIBRARY 然后又根据编译器的提示修改了一些定义,总算可以把COREOS编译通过,但是重新连接,并没有任务作用 请问这里应该把哪几个输出文件复制到哪个文件夹下,在重新连接才会生效??求求各位高手提示一下,实在没有找到头绪,谢谢了。 |
|
19楼#
发布于:2008-08-22 12:52
顶起来,请教各位大侠?
EBOOT的MMU和KERNEL的MMU是不一样的吗? EBOOT的MMU启动之后中断向表映射到哪了呢? |
|
|
上一页
下一页