Guest User

Untitled

a guest
Nov 17th, 2018
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.35 KB | None | 0 0
  1. void *CreatePageDirectory (){
  2.  
  3. int i;
  4.  
  5. unsigned long destAddressVA; //virtual.
  6.  
  7. //alocaremos uma página apenas, pois tem 4KB.
  8.  
  9. destAddressVA = (unsigned long) newPage ();
  10. if ( destAddressVA == 0 )
  11. {
  12. return NULL;
  13. }
  14.  
  15. //o endereço do diretório de páginas clone.
  16. //precisamos uar o endereço virtual para manipularmos os dados,
  17. //pois estamos no esquema de memória do kernel base.
  18. unsigned long *dest = (unsigned long *) destAddressVA;
  19.  
  20. //o endereço do diretório de páginas do kernel.
  21. unsigned long *src = (unsigned long *) gKernelPageDirectoryAddress;
  22.  
  23. //Nesse momento já temos o endereço da origem e do destino.
  24. //O endereço lógico e físico do diretório de páginas do kernel
  25. //são iguais, porém os endereços físico e virtual do diretório
  26. //de páginas clone são diferentes.
  27. //#importante: A rotina de cópia do conteúdo entre os buffers precisa usar
  28. //endereços lógicos, pois estamos usando o kernel base e sua
  29. //configuração de memória.
  30.  
  31. //
  32. // ## Copiar ##
  33. //
  34.  
  35. // Agora vamos apenas copiar o diretório de páginas do kernel
  36. // para o diretório de páginas clone.
  37. // São 1024 dwords.
  38.  
  39. // Criamos um diretório vazio com páginas não presentes.
  40. // 0010 em binário.
  41. for ( i=0; i < 1024; i++ )
  42. {
  43. dest[i] = (unsigned long) src[i];
  44. };
  45.  
  46. return (void *) destAddressVA;
  47. };
Add Comment
Please, Sign In to add comment