Will Postado Maio 12, 2019 em 01:22 Compartilhar Postado Maio 12, 2019 em 01:22 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 More sharing options...
fredericopissarra Postado Maio 12, 2019 em 13:14 Compartilhar Postado Maio 12, 2019 em 13:14 Não acompanho essas aulas, mas na arquitetura x86-64 apenas os 48 bits inferiores, dos 64, de um endereço são válidos. 48/8 = 6 bytes. Link para o comentário Compartilhar em outros sites More sharing options...
fredericopissarra Postado Maio 12, 2019 em 13:57 Compartilhar Postado Maio 12, 2019 em 13:57 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 More sharing options...
fredericopissarra Postado Maio 12, 2019 em 14:13 Compartilhar Postado Maio 12, 2019 em 14:13 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 More sharing options...
fredericopissarra Postado Maio 12, 2019 em 14:20 Compartilhar Postado Maio 12, 2019 em 14:20 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 Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados
Arquivado
Este tópico foi arquivado e está fechado para novas respostas.