zoukankan      html  css  js  c++  java
  • VirtualCopy()操作I/O口 物理地址为什么要移8位

    (1)IO接口是XSCale处理器的外部设备,对于一般的单片机,可以直接操作硬件,即通过直接读写IO端口来访问硬件.而对于WICNE操作系统,它屏蔽了用户应用程序对硬件访问的权限,只有内核应用程序才可以访问硬件资源.如果要直接访问某一址的物理内存(对于ARM核的MCU,IO端口地址通常被映射到物理内存中,内存和IO统一编址)可以采用内存映射方法,将该硬件寄存器映射到普通的内存空间,像操作内存地址一样操作硬件寄存器.WINCE提供了VirtualAlloc()和VirtualCopy()函数, VirtualAlloc()负责在虚拟内存空间内保留一段虚拟内存,而VirtualCopy()负责把一段物理内存和虚拟内在绑定,这样最终对物理内存的访问就可以通过虚拟地址来进行了.

    (2)首先使用VirtualAlloc 分配出一个虚拟的地址空间,代码如下:

    pLightReg=(char*)VirtualAlloc(0,0x400,MEM_RESERVE,PAGE_READWRITE)

    这样就分配出一个MEM_RESERVE类型的存储器空间,但它并没有占用实际内存空间,而是虚拟的地址空间.

    接着将实际的硬件地址(例如LED的片选控制信号地址)映射到前面分配的虚拟地址空间,使用VirtualCopy函数建立起两个地址间的映射关系.代码如下:

    VirtualCopy((PVOID)pLightReg,(PVOID)(pLightIoBaseAddress>>8),0x400,PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL)

    这里pLightReg是前面分配的虚拟地址空间,而pLightIoBaseAddress为实际的硬件地址,需要将它右移8位,因为在函数中存储器分配是以256位为单位的.而后面的选项则是指定了映射地址的属性—可读.不缓冲以及硬件物理地址.

    现在就可以使用虚拟地址访问原来不能直接访问的硬件地址了.

    转自:http://blog.csdn.net/lan120576664/archive/2009/12/04/4942009.aspx

  • 相关阅读:
    洛咕 P4131 [WC2005]友好的生物
    P3354 [IOI2005]Riv 河流
    洛咕 P3645 [APIO2015]雅加达的摩天楼
    洛咕 P4528 [CTSC2008]图腾
    CSDN不登录阅读全文(最新更新
    #6472. 「ICPC World Finals 2017」难以置信的任务 Mission Improbable
    #6435. 「PKUSC2018」星际穿越
    #2009. 「SCOI2015」小凸玩密室
    #2007. 「SCOI2015」国旗计划
    PKUWC2018题解
  • 原文地址:https://www.cnblogs.com/wenziqi/p/1806687.html
Copyright © 2011-2022 走看看