CeSetMemoryAttributes
9/8/2008
Essa função fornece dispositivo drivers e aplicativos com uma maneira de usar atributos memória com suporte em algumas plataformas hardware que o kernel não suporte Por padrão.
Syntax
BOOL CeSetMemoryAttributes(
LPVOID pVirtualAddr,
LPVOID pShiftedPhysAddr,
DWORD cbSize,
DWORD dwAttributes
);
Parameters
pVirtualAddr
[no] Iniciando endereço memória virtual.Endereço de memória deve ser alinhado-Página.
pShiftedPhysAddr
[no] Físico correspondente endereço memória deslocadas por 8 bits ou PHYSICAL_ADDRESS_UNKNOWN.Se o valor deste parâmetro não for definida para PHYSICAL_ADDRESS_UNKNOWN, um físico endereço que tenha esse parâmetro definido como 8 Less than deve ser Page-alinhado.
O intervalo especificado deve estar fisicamente contíguo, o que significa que a (intervalopVirtualAddr Para pVirtualAddr sinal de mais cbSize) deve ser mapeada para (pPhysAddr Para pPhysAddr sinal de mais cbSize).
cbSize
[no] Tamanho, em bytes, da memória a ser alterada.Este parâmetro deve ser um múltiplo de páginas.
dwAttributes
[no] Atributo memória a ser definido.É apenas PAGE_WRITECOMBINE com suporte. Gravação-combinando Permite transferências de gravação barramento a ser combinadas em um maior transferir antes de serem gravadas.
Return Value
Nonzero indica sucesso. Zero indica falha. Para informações de erro estendidas get, chamar GetLastError.
Remarks
O atual não requer suporte para atributos memória na função de VirtualSetAttributes #ifdef
As marcas e consultas para a OAL para drivers ou aplicativos para usar esses atributos.
CeSetMemoryAttributes é independente de plataforma.
Essa função é unidirecional, o que significa que após o atributo é definido, ele não pode ser remover.
Alguns x 86 CPUs, tais como x 86 com suporte PAT, não exigem o físico endereço para combinar gravação suporte. Outros CPUs exigem contíguo físico endereço, such as x 86 com suporte Memory Type Range Registers (MTRR). Chamar CeSetMemoryAttributes Com um válido pShiftedPhysAddr Se o intervalo de físico endereço é conhecido para que ele funcione em x 86 CPUs.
O seguinte exemplo de código mostra uma implementação de CeSetMemoryAttributes Na típica exibir driver codificar.
#define FRAMEBUFFER_PHYSADDR 0xdc000000 // Physical address of the frame buffer
#define FRAMEBUFFER_SIZE 0x00400000 // 4M of frame buffer
LPVOID InitFrameBuffer ()
{
// Allocate and set up the frame buffer.
LPVOID pVirtualAddr = VirtualAlloc (NULL, FRAMEBUFFER_SIZE, MEM_RESERVE, PAGE_NOACCESS);
if (!pVirtualAddr)
{
return NULL;
}
if (!VirtualCopy (pVirtualAddr, (LPVOID) (FRAMEBUFFER_PHYSADDR >> 8), FRAMEBUFFER_SIZE, PAGE_NOCACHE|PAGE_READWRITE))
{
// Error
VirtualFree (pVirtualAddr, 0, MEM_RELEASE);
return NULL;
}
// Try to set 'Write-Combine' attribute on the frame buffer.
// It does not matter if it succeeds or not.
CeSetMemoryAttributes (pVirtualAddr, (LPVOID) (FRAMEBUFFER_PHYSADDR >> 8), FRAMEBUFFER_SIZE, PAGE_WRITECOMBINE);
return pVirtualAddr;
}
Requirements
Header | pkfuncs.h |
Library | coredll.lib |
Windows Embedded CE | Windows CE 5.0 and later |
See Also
Reference
Kernel Functions
VirtualSetAttributes