Jump to content
Sign in to follow this  
Will

Endereçamento

Recommended Posts

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?

Share this post


Link to post
Share on other sites
Posted (edited)

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...

Edited by fredericopissarra
  • Agradecer 1
  • l33t 1

Share this post


Link to post
Share on other 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).
 

  • Agradecer 1

Share this post


Link to post
Share on other sites

Para maiores informações sobre o mapeamento do linear address space no Linux, consulte:

$ zless /usr/share/doc/linux-doc/x86/x86_64/mm.txt.gz

Instale o pacote linux-doc

  • Agradecer 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...