Skip to content

Instantly share code, notes, and snippets.

@frednora
Created November 16, 2018 21:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save frednora/0b8272b0fa0c8700e888627c546d1c39 to your computer and use it in GitHub Desktop.
Save frednora/0b8272b0fa0c8700e888627c546d1c39 to your computer and use it in GitHub Desktop.
CreatePageDirectory
void *CreatePageDirectory (){
int i;
unsigned long destAddressVA; //virtual.
//alocaremos uma página apenas, pois tem 4KB.
destAddressVA = (unsigned long) newPage ();
if ( destAddressVA == 0 )
{
return NULL;
}
//o endereço do diretório de páginas clone.
//precisamos uar o endereço virtual para manipularmos os dados,
//pois estamos no esquema de memória do kernel base.
unsigned long *dest = (unsigned long *) destAddressVA;
//o endereço do diretório de páginas do kernel.
unsigned long *src = (unsigned long *) gKernelPageDirectoryAddress;
//Nesse momento já temos o endereço da origem e do destino.
//O endereço lógico e físico do diretório de páginas do kernel
//são iguais, porém os endereços físico e virtual do diretório
//de páginas clone são diferentes.
//#importante: A rotina de cópia do conteúdo entre os buffers precisa usar
//endereços lógicos, pois estamos usando o kernel base e sua
//configuração de memória.
//
// ## Copiar ##
//
// Agora vamos apenas copiar o diretório de páginas do kernel
// para o diretório de páginas clone.
// São 1024 dwords.
// Criamos um diretório vazio com páginas não presentes.
// 0010 em binário.
for ( i=0; i < 1024; i++ )
{
dest[i] = (unsigned long) src[i];
};
return (void *) destAddressVA;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment