Guia de rastreamento dinâmico Solaris

Ponteiros e espaços de endereço

Um ponteiro é um endereço que fornece uma translação em algum espaço de endereço virtual para um pedaço de memória física. O DTrace executa os seus programas em D no espaço de endereço do próprio kernel do sistema operacional. O sistema Solaris inteiro gerencia muitos espaços de endereço: um para o kernel do sistema operacional e outro para cada processo do usuário. Já que cada espaço de endereço dá a ilusão de que pode acessar toda a memória do sistema, o mesmo valor do ponteiro do endereço virtual pode ser reutilizado entre espaços de endereço, mas é transladado para uma memória física diferente. Portanto, ao escrever programas em D que usam ponteiros, você deve estar ciente do espaço de endereço correspondente para os ponteiros que deseja usar.

Por exemplo, se você usar o provedor syscall para instrumentar a entrada para uma chamada ao sistema que usa um ponteiro para um inteiro ou uma matriz de inteiros como um argumento (por exemplo, pipe(2)), não seria válido cancelar a referência desse ponteiro ou matriz usando os operadores * ou [] porque o endereço em questão é de um espaço de endereço do processo do usuário que realizou a chamada ao sistema. Aplicar os operadores * ou [] a esse endereço em D resultaria no acesso ao espaço de endereço do kernel, que resultaria em um erro de endereço inválido ou no retorno de dados inesperados para o seu programa em D, dependendo se o endereço coincidiu com um endereço de kernel válido.

Para acessar a memória do processo do usuário de um teste do DTrace, aplique uma das funções copyin(), copyinstr() ou copyinto() descrita no Capítulo 10Ações e sub-rotinas para o ponteiro do espaço de endereço do usuário. Tome cuidado ao escrever seus programas em D para nomear e comentar as variáveis que armazenam endereços do usuário de modo a evitar confusão. Você também pode armazenar endereços do usuário como uintptr_t, para que não compile acidentalmente o código de D que cancela a referência deles. As técnicas para usar o DTrace em processos do usuário são descritas no Capítulo 33Rastreio de processo do usuário.