Der Unterschied zwischen amd64 und i386 ist , dass Amd64 ist 64 Bit , während i386 ist 32 Bit . Dies ist die Breite (in Bit) der im Kern verfügbaren Register.
Grundsätzlich ist die größte Zahl, die ein 32-Bit-CPU-Kern auf einmal verarbeiten kann, etwas mehr als 4,29 Milliarden, während ein 64-Bit-Kern eine Zahl von etwas mehr als 18,44 Milliarden, Milliarden verarbeiten kann.
Die Kerne in modernen PCs können sich je nach Version des installierten Betriebssystems entweder als 64-Bit- oder als 32-Bit-Prozessor verhalten.
64-Bit-Code wird in der Regel schneller ausgeführt als 32-Bit-Code, entweder weil er größere Zahlen im laufenden Betrieb verarbeiten kann oder weil die 64-Bit-Kerne mehr Register haben, sodass mehr Dinge gespeichert werden können, ohne dass Dinge in einem externen Speicher abgelegt werden müssen. Es gibt jedoch keine Garantie dafür, dass 64-Bit-Code schneller ausgeführt wird, wenn der Code nicht geschrieben wurde, um die zusätzlichen Funktionen des Prozessors zu nutzen.
Das Kompilieren auf einem 32-Bit-System erzeugt einen anderen Code als ein 64-Bit-System. Sie können dies beweisen, indem Sie den Assemblycode auf beiden Systemen kompilieren. Angenommen, Ihre C-Datei ist myfile.c, versuchen Sie es gcc -S myfile.c
auf beiden Systemen und vergleichen Sie myfile.s
Gut geschriebener Code für ein 32-Bit-System sollte auf einem 64-Bit-System kompiliert und ausgeführt werden, aber nicht der gesamte Code ist gut geschrieben. Viele Programmierer treffen Annahmen über das System, die möglicherweise nicht zutreffen, wie z. B. die Registerbreite oder die Bytereihenfolge.
Ohne Zugriff auf Ihren Quellcode ist das Problem nur schwer zu erkennen, aber a segmenation fault
weist darauf hin, dass versucht wurde, auf Speicher zuzugreifen, der nicht zum Programm gehört. Dies kann beispielsweise darauf hinweisen, dass mem_ptr ein 32-Bit-Zeiger ist, der in einem 32-Bit-System in Ordnung ist, in einem 64-Bit-System jedoch ein 64-Bit-Zeiger sein muss.