Mapping Pointers and Sharing Memory between Processes: Windows CE 5.0 vs. Windows Embedded CE 6.0
9/8/2008
Em Windows CE 5.0, o kernel executada uma 1 trivial-caixa de seleção de acesso byte no ponteiro parâmetros. Em Windows Embedded CE 6.0, o kernel realiza uma verificar completo em parâmetros reserva.
Terminologia ponteiro
O seguinte define alguns relacionado termos para passar os ponteiros:
- A verificação de acesso: Verificando que o processo chamador tem privilégios suficientes para acessar uma reserva.
- Empacotamento: Preparando um ponteiro que um servidor pode usar para acessar reserva de um chamador.
- Seguro-copiar: Tornando um copiar de uma reserva para evitar assíncrono modificação pelo chamador.
- Parâmetro ponteiro: Ponteiro que é passado como um parâmetro para um API.
- Ponteiro incorporado: Ponteiro que é passado para um API, armazenando-la dentro uma reserva ou Inside of ponteiro incorporado outro.
Versões anteriores da OS
Quando um aplicativo chamado uma função em Windows CE 5.0, o kernel realizada uma 1-caixa de seleção de acesso byte no ponteiro parâmetros e empacotado o ponteiro pelo mapeamento-lo. O espaço de endereço OS foi organizados de modo que a espaço de endereço memória - MB virtual - 32 para cada processo foi acessível em todos os momentos. Portanto, mapeamento exigido apenas modificar o ponteiro para apontar para o direito espaço memória do processo de destino. O processo servidor era responsável chamado uma função such as MapCallerPtr para verificar que o processo chamador tivesse privilégios suficientes para acessar a reserva inteira e o processo servidor era responsável Access-checking e empacotamento qualquer incorporado ponteiros. Geralmente, os caixa de seleção de acesso e empacotamento foram abordados por chamado MapCallerPtr. O servidor também foi responsável pela execução um Seguro copiar, se necessário.
Versão atual da OS
In Windows Embedded CE 6.0, when an application calls a function, the kernel performs the full access check on buffer parameters, taking responsibility for that protection away from the server processes. Isso é feito possível fornecendo o kernel obter mais informações sobre tamanhos parâmetro. O kernel ainda controla parâmetros ponteiro, e servidores ainda deverá empacotar incorporado ponteiros. Os servidores devem ainda executar um Seguro copiar, se necessário. A seguinte lista mostra o que foi alterado:
- O kernel tenha assumido acesso completo Verificação do ponteiro parâmetros.
- Os servidores função devem chamar a empacotar parâmetros.
- Opções disponível para os servidores para executar um Seguro copiar.
- A maneira empacotamento deve ser tratado se o servidor precisa acessar uma reserva de forma assíncrona.
Empacotamento mecanismos
Agora há duas maneiras possíveis que uma reserva pode ser empacotado para que o servidor pode utilizá-lo:
- Duplicação: Alocar uma nova reserva para o servidor para uso e copiar dados e out of a reserva conforme necessário. Buffers de somente são copiados apenas do chamador para o servidor. Buffers somente fora são copiados somente a partir de servidor para o chamador. Buffers de/Out são copiados em ambas as direções. O servidor possui a reserva para a duração do chamar. A duplicação não só dá acessar o servidor para a reserva, mas também evita que o chamador de de forma assíncrona modificando a reserva após ele foi validado, o servidor.
- Alias: Mapear a memória do processo de chamador parte no espaço de memória do processo de servidor. Isso é um tipo diferente de mapeamento que foi feito em versões anteriores da OS. Como cada processo tem uma separar espaço de endereço, não é possível acessar memória do processo outro usando um ponteiro. Em vez disso, a parte aliases kernel da memória do chamador para o espaço de endereço do servidor, usando o VirtualCopyEx função. A mesma informação físico memória temporariamente é compartilhada entre os dois processos pelo mapeamento que dois intervalos diferentes endereço virtual dentro de dois processos. Essa forma de mapeamento envolve alocar um novo virtual intervalo do endereço, instead of re-basing apenas um ponteiro e requer o intervalo do endereço para ser liberado quando ele é necessário no longer.
O Empacotamentos automática de parâmetros ponteiro e o auxiliar funções CeOpenCallerBuffer com CeCloseCallerBuffere CeAllocAsynchronousBuffer com CeFreeAsynchronousBuffer, escolher entre a duplicação e serrilhado, com base nas necessidades de segurança e desempenho sistema. Se a reserva for pequena o suficiente, o kernel talvez duplicado a reserva. Copiando pode afetar desempenho, isso se a reserva for muito grande para duplicado, o kernel talvez alias a reserva em vez disso.
O auxiliar função CeAllocDuplicateBuffer CeFreeDuplicateBuffer com é fornecido para tornar um duplicado copiar de uma reserva empacotada somente se ele tem não já foi duplicado pelo empacotamento. Você pode usar outros meios de criar um Seguro copiar Se você desejar. CeAllocDuplicateBuffer e CeFreeDuplicateBuffer são fornecidas apenas para sua conveniência. Você também pode usar buffers pilha ou heap com memcpy Para atingir o mesmo efeito.
Kernel-modo servidores têm somente dois casos empacotamento ponteiro:
Síncrono acessar: Ponteiro parâmetros e incorporado ponteiros podem ser usados sem qualquer empacotamento. No entanto, para incorporado ponteiros, o servidor deve chamar o CeOpenCallerBuffer auxiliar para executar verificação acessar e empacotamento.
Acessar assíncrona: Para assíncrono acessar para um ponteiro, um kernel-modo servidor deve chamar o função de ajuda empacotamento CeAllocAsynchronousBuffer duplicado ou alias a reserva para acessar quando espaço de endereço do chamador não disponível. Uso CeAllocAsynchronousBuffer Com os parâmetros função incorporado ou ponteiros que foram abertos com CeOpenCallerBuffer.
Observação
Trate seu codificar como embora ele estava funcionando em modo de usuário passando parâmetros de forma assíncrona como scalars, como mostrado a seguir para usuário-modo servidores para que seu codificar será trabalho no modo kernel tanto usuário.
Usuário-modo servidores têm mais casos empacotamento ponteiro:
- Síncrono acessar: O kernel sempre controla parâmetros ponteiro automaticamente. O servidor não precisa fazer nada adicional. Para incorporado ponteiros, usuário-modo servidores devem chamar a função auxiliar CeOpenCallerBuffer Para executar o Empacotamentos.
- Ponteiro parâmetros, de forma assíncrona usados: Para assíncrono acessar para um ponteiro, um usuário-modo servidor deve usar os auxiliares empacotamento, não automático empacotamento dos parâmetros ponteiro. Isso significa que qualquer parâmetro que pode ser usado de forma assíncrona deve ser passada como um valor escalar (DWORD) instead of um ponteiro (I_PTR, O_PTR, IO_PTR). A verificação automática de acessar e empacotamento não ocorrer e o servidor devem chamar CeOpenCallerBuffer e, em seguida, CeAllocAsynchronousBuffer Para executar essas tarefas. Não é possível chamar CeAllocAsynchronousBuffer Em um parâmetro ponteiro em codificar modo usuário. Não é possível executar um assíncrono gravar-voltar de valores O_PTR ou IO_PTR.
- Ponteiros incorporados, de forma assíncrona usados: Após chamado CeOpenCallerBuffer, transmitir a reserva para CeAllocAsynchronousBuffer.
Ponteiro de acesso rápido-referência
A seguinte tabela soma até o Que servidores devem fazer para garantir que acessar a verificação, empacotamento e Seguro copiando tiver terminado corretamente.
Usar maiúsculas e minúsculas | Trabalho exigido | O que a implementação deve fazer |
---|---|---|
Parâmetro: sincronicamente usados |
A verificação de acesso |
Nada: kernel verifica durante interceptar. |
Parâmetro: sincronicamente usados |
Empacotamento |
Nenhum, kernel controla durante interceptar. |
Parâmetro: sincronicamente usados |
Seguro de cópia |
Se necessário, fazer um copiar mesmo ou usar CeAllocDuplicateBuffer e CeFreeDuplicateBuffer. |
Parâmetro: de forma assíncrona usadas |
Preparar para assíncrono acessar, que não é possível em modo de usuário. |
CeAllocAsynchronousBuffer Com CeFreeAsynchronousBuffer. |
Ponteiro incorporado: sincronicamente usados |
A verificação de acesso |
Todos é cuidar por CeOpenCallerBuffer Com CeCloseCallerBuffer. |
Ponteiro incorporado: sincronicamente usados |
Empacotamentos |
Todos é cuidar por CeOpenCallerBuffer Com CeCloseCallerBuffer. |
Ponteiro incorporado: sincronicamente usados |
Seguro-copiar |
Todos é cuidar por CeOpenCallerBuffer Com CeCloseCallerBuffer. |
Ponteiro incorporado: de forma assíncrona usadas |
Preparar para assíncrono acessar |
Chamar CeAllocAsynchronousBuffer Depois que você chamar CeOpenCallerBuffer. Você deve chamar CeFreeAsynchronousBuffer Antes de chamar CeCloseCallerBuffer. |
Outros métodos de compartilhamento memória entre processos incluem:
- ReadProcessMemory com WriteProcessMemory. Par de ponteiro com um processo identificador e transmiti-los ao redor juntos.
- Compartilhando um nomeado Memory-mapped arquivo. Ambos os processos devem aberto seus próprios modos de exibição.
- Compartilhada pilhas, que são graváveis para o kernel, mas somente leitura para todas as outras pessoas.
- O Windows Embedded CE 6.0 CeRemoteHeapCreate e habilitar a funções CeRemoteHeapCreate que você crie um heap que é compartilhado somente entre um usuário ou kernel--modo servidor e um cliente. O servidor pode alocar, livre, ler e gravação, enquanto o cliente pode ler e escrever, mas não é possível danificar metadados heap.
- Seção dados DLL-Shared.
- Filas mensagem ponto a ponto. Para obter mais informações, consulte Message Queue Point-to-Point Reference.
- Use o VirtualAllocEx, a VirtualCopyExe as funções VirtualAllocCopyEx para memória alias entre processos.
Arquivos mapeados
Você pode não mais acessar um arquivo mapeado sem criar uma exibição. Antes CE 6.0, você pode transmitir um endereço exibição entre os processos e o outro processo pode acessar a exibição. Não é possível usar funções de memória virtual para exibição mapeamento endereços. Antes CE 6.0, você pôde confirmação e decommit os modos de exibição mapeados com funções de memória virtual.
See Also
Other Resources
Kernel Functionality Modifications: Windows CE 5.0 vs. Windows Embedded CE 6.0
Kernel API Modifications: Windows CE 5.0 vs. Windows Embedded CE 6.0