none
VirtualCopy() in giisr.c , unresolved external symbol RRS feed

  • 问题

  • 我调用了VirtualCopy()在giisr.c中,包含windows.h and winbase.h etc,但 SYSGEN提示 "error lnk2019: unresolved external symbol Virtualcopy...." ,可能我需要一个支持的lib在SOURCE文件中, 但我没有找到.有人说是Coredll.lib. 但我查了它被用做TARGETLIBS而不时SOURCELIB, PS:PUBLIC\COMMON\OAK\DRIVERS\GIISR\giisr.c, 此文件是系统底层文件,不是上层应用文件,否则就很容易连接由系统提供的Coredll.lib,底层如何解决?

    2010年8月3日 1:39

答案

  • TARGETLIBS ?  是SOURCELIBS吧?

    我同样把问题提到美国那边,答复如下,

    KMOS: Installable ISR (GIISR) is a special case; due to it runs in part of ISR call flow, so it can't use many system API. Therefore, it is only linked to static C runtime library (fulllibc.lib) and never coredll.lib.
    For what you intend to do, you can call VirtualCopy in a kernel mode driver then use KernelLibIoControl to pass the pointer to ISR. But a more sophisticated method is to use BusTransBusAddrToStatic + KernelLibIoControl. The EHCI driver in COMMON\oak\drivers\usb\hcd\usb20\ehcipdd\system.c just procide a sample.

    我私下认为有道理,你的意见如何?

    • 已标记为答案 wenbbo 2010年8月6日 12:55
    2010年8月6日 12:47

全部回复

  • 现在一般用MmMapIoSpace函数。

    http://msdn.microsoft.com/en-us/library/aa447863.aspx

    2010年8月3日 3:55
    版主
  • gryen,您提到的MmMapIoSpace和virtualcopy一样啊,都是在应用中调用没问题的,因为微软做了内核支持应用啊,但底层是另外一回事,我是在做底层的,无论如何,还是谢谢你的热心了。
    2010年8月3日 12:40
  • MmMapIoSpace和virtualcopy一般来说是在driver layer调用的。WinCE 5.0允许应用程序调用这两个函数,但是6.0里只有kernel mode的程序(通常是驱动程序)才能调用这两个函数来访问physical memory space。

    当然如果你说的底层是指OAL层的话,那也不能调用这两个函数。而是直接访问物理地址所对应的non-cacheable的virual address就可以了。

    2010年8月3日 12:57
    版主
  • 我没说清楚底层,但您可查看此文件PUBLIC\COMMON\OAK\DRIVERS\GIISR\giisr.c,它不是oal层文件,但是算微软系统文件,不是驱动层文件。同样有PUBLIC\COMMON\OAK\DRIVERS\CEDDK\map_io.c就可以调用virtualcopy,但为何giisr.c中就不行呢?应该如何引用支持库呢?等待您的回复,谢谢。

    2010年8月4日 3:04
  • 再sources文件里面有没有添加ceddk.lib ?
    2010年8月5日 9:37
    版主
  • !if 0
    Copyright (c) Microsoft Corporation.  All rights reserved.
    !endif
    !if 0
    Use of this source code is subject to the terms of the Microsoft end-user
    license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
    If you did not accept the terms of the EULA, you are not authorized to use
    this source code. For a copy of the EULA, please see the LICENSE.RTF on your
    install media.
    !endif
    !IF 0
    Note on DOSYSGEN: the sysgen process runs "build" on this sources file to
    produce a LIB file, even though the end target will be a DLL or an EXE.  This
    is because COREDLL, which is linked implicitly to all such targets, can be
    componentized and we want to avoid invoking COREDLL APIs that may not be
    available after sysgen.  If you want to build and link this target AFTER the sysgen
    is complete, comment out the following line -- otherwise you will get a LIB
    file.
    !ENDIF
    DOSYSGEN=1

    SYNCHRONIZE_DRAIN=1

    !IFDEF DOSYSGEN

    TARGETNAME=giisr_lib
    TARGETTYPE=LIBRARY
    TARGETDEFNAME=giisr

    DEFFILE=giisr.def
    WINCETARGETFILE0=$(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\$(TARGETDEFNAME).def
    PREPROCESSDEFFILE=1

    !ELSE

    TARGETNAME=giisr
    TARGETTYPE=DYNLINK
    DLLENTRY=DllEntry

    !ENDIF

    SOURCELIBS= \
            $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\ddk_io.lib      \
            $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\fulllibc.lib
           
    WINCEOEM=1
    NOLIBC=1
    NOMIPS16CODE=1

    SOURCES=giisr.c

    没有ceddk.lib ,但我查了D:\WINCE500\PUBLIC\COMMON\OAK\INC\ceddk.def,其中并无virtualcopy输出啊。郁闷,还有无其他可能呢?

     

    2010年8月5日 11:26
  • 那你有没有试过在TARGETLIBS下面加上$(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\ceddk.lib呢
    2010年8月6日 6:30
    版主
  • TARGETLIBS ?  是SOURCELIBS吧?

    我同样把问题提到美国那边,答复如下,

    KMOS: Installable ISR (GIISR) is a special case; due to it runs in part of ISR call flow, so it can't use many system API. Therefore, it is only linked to static C runtime library (fulllibc.lib) and never coredll.lib.
    For what you intend to do, you can call VirtualCopy in a kernel mode driver then use KernelLibIoControl to pass the pointer to ISR. But a more sophisticated method is to use BusTransBusAddrToStatic + KernelLibIoControl. The EHCI driver in COMMON\oak\drivers\usb\hcd\usb20\ehcipdd\system.c just procide a sample.

    我私下认为有道理,你的意见如何?

    • 已标记为答案 wenbbo 2010年8月6日 12:55
    2010年8月6日 12:47
  • 噢,GIISR原来是ISR chain的一部分啊。这我倒是没有用过,不知道它的地址空间是不是和ISR(OEMInterruptHandler)一样,如果一样的话,到可以直接用A打头的固定虚地址访问。

    2010年8月7日 1:01
    版主
  • "不知道它的地址空间是不是和ISR(OEMInterruptHandler)一样"---???“如果一样的话,到可以直接用A打头的固定虚地址访问。”---??能说的更详细点吗?

    2010年8月9日 13:18
  • 在ISR里面,可以直接通过TLB中的虚地址映射访问相应的实地址。一般你的BSP里面会有一个*.inc的文件,它里面会定义这样一个地址映射表。里面0x8XXXXXXX就是虚地址。不过这个是cacheable的,相应的虚地址0x8XXXXXXX+0x20000000就是non-cacheable的虚地址,也就是0xAXXXXXXX。
    2010年8月10日 13:51
    版主