A diferença entre amd64 e i386 é que amd64 é de 64 bits enquanto i386 é de 32 bits . Essa é a largura (em bits) dos registros disponíveis no núcleo.
Basicamente, o maior número que um núcleo de CPU de 32 bits pode suportar de uma só vez é pouco mais de 4,29 bilhões, enquanto um núcleo de 64 bits pode lidar com um pouco mais de 18,44 bilhões de bilhões.
Os núcleos nos PCs modernos são capazes de se comportar como um processador de 64 ou 32 bits, dependendo da versão do sistema operacional que você instalou.
O código de 64 bits tende a executar mais rapidamente do que o código de 32 bits, porque pode lidar com números maiores em movimento ou porque os núcleos de 64 bits têm mais registros, para que possam armazenar mais coisas sem precisar colocar coisas na memória externa. Embora não haja garantia de que o código de 64 bits seja executado mais rapidamente se o código não tiver sido gravado para aproveitar os recursos extras do processador.
A compilação em um sistema de 32 bits produzirá um código diferente do sistema de 64 bits. Você pode provar isso compilando o código de montagem nos dois sistemas. Supondo que seu arquivo C seja myfile.c, tente gcc -S myfile.c
nos dois sistemas e compare myfile.s
Um código bem escrito para um sistema de 32 bits deve ser compilado e executado em um sistema de 64 bits, mas nem todo o código está bem escrito. Muitos programadores fazem suposições sobre o sistema que podem não ser verdadeiras: como largura do registro ou ordem de bytes.
Sem acesso ao seu código-fonte, é difícil ver qual é o problema, mas a segmenation fault
indica que foi feita uma tentativa de acessar a memória que não pertence ao programa. Isso pode, por exemplo, indicar que o mem_ptr é um ponteiro de 32 bits que é bom em um sistema de 32 bits, mas precisa ser um ponteiro de 64 bits em um sistema de 64 bits.