Ir para conteúdo

Endereçamento


Will

Posts Recomendados

Olá, pessoal!

Eu já estou na aula 09 do CEB e percebi que deixei algo muito importante pra trás (lá na aula 05).

Bom, na verdade, eu não entendi o começo da aula 05 que ele fala o porquê da arquitetura de 64 bits utilizar somente os 6 bytes para endereçamento. 

Alguém poderia explicar?

Link para o comentário
Compartilhar em outros sites

PS: Essa limitação é das arquiteturas atuais (Nehalem, Ivy Bridge, Sandy Bridge, Haswell, Skylake, etc), isso não significa que em versões futuras o espaço de endereçamento não possa aumentar. Ainda mais... esse é o tamanho máximo no espaço de endereçamento linear, não o físico... Para obter os dois, num processador Intel ou AMD, podemos usar CPUID:
 

/* getbits.c */
#include <stdio.h>

int main( void )
{
  unsigned int a;

  __asm__ __volatile__ (
      "cpuid"
      : "=a" (a) 
      : "0" ( 0x80000008U )
      : "%rbx", "%rcx", "%rdx"
  );

  /* Aviso: Processadores AMD também fornecem GuestAddrSize,
     que é o tamanho do endereço para guests (em virtualização)
     usando "nested paging" (nos bits 23 até 16). Ignore isso por
     enquanto! */
  printf( "Physical address size (in bits): %u\n"
          "Linear address size (in bits): %u\n",
          a & 0xff, (a >> 8) & 0xff );
}

Executando:
 

$ cc -o getbits getbits.c
$ ./getbits
Physical address size (in bits): 39
Linear address size (in bits): 48

Note que o meu processador tem apenas 39 bits no barramento de endereços... Mas o linear address space tem 48.
Consulte a instrução CPUID no manual nº 2 dos guias de desenvolvimento da Intel e o manual "CPUID Specification" da AMD...

Link para o comentário
Compartilhar em outros sites

A pergunta que pode seguir é: O que fazer com os 16 bits superiores dos 64 bits do endereço? Eles serão sempre zero? E se não forem?
No caso do modo x86-64 eles devem ser uma cópia do bit 48º bit (bit 47). Isso se chama "endereço canônico"... Se o endereço não for "canônico" e for usado para referenciar memória, você obterá um "general protection fault" (um segmentation fault, no Unix)...

Assim, o endereço for 0x0000800000000000 é inválido (bit 47=1). ele deve ser 0xffff800000000000.

É bom notar que todos os processos no userspace (linux) são alocados no endereçamento linar abaixo dos 128 TiB (47 bits de endereço), onde a pilha é mapeada na região mais alta. Isso pode ser visto assim:

#include <stdio.h>

int main( void )
{
  // x alocado na pilha (porque tomarei o endereço dele)!
  int x = 1;

  printf( "x=%d; &x=%p\n", x, &x );
}

Na minha maquina obtenho:

$ cc -o test test.c
$ ./test
x=1, &x=0x7ffd93bc8854

Note que o endereço, na pilha, tem 47 bits de tamanho (o 48º bit é zero).
 

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...