3. Was ändert sich beim Kompilieren (Linkerdatei, spezielle gcc-flags usw)
Meine g++ flags unter x86-64: -fuse-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exceptions -Wall -fno-omit-frame-pointer -m64 -mno-red-zone -mno-sse -mcmodel=kernel
Am besten baust du dir einen Crosscompiler. Im osdev.org wiki steht wie man das für x86-64 macht.
Am Linkerscript hat sich bei mir nur das OUTPUT_FORMAT und die Adresse des Kernelbeginns geändert.
Generell ist zu sagen, dass sich der Aufbau der GDT (Kapitel 4.2.1 & 4.4.1 -> brauchst nur Codesegmentdeskriptoren, alles andere kann 0 sein) /IDT (Kapitel 4.8.3.1), des TSS (jo, das gibt es schon noch), der Register geändert hat. Zu beachten ist auch noch, dass eigentlich nur weniger Instruktionen als immediate Wert einen 64bit Integer haben können (darunter natürlich mov). Außerdem iretq explizit verwenden in den Interrupthandlern (sonst will die Saubacke von Assembler immer das normale 32bit iret nehmen).
edit: Paging geht über 4Level, damit man sinnvoll zu einer 48bit Adresse kommt.Standardspeicherseitengröße ist trotzdem weiterhin 4kb. Syscall/Sysret für syscalls nutzen anstatt Interrupt (auch mal die neue Instruktion swapgs dazu anschauen, Intel Manuals 2B). Es verspricht schneller zu sein.
Mir fällts grad auf: Meine Kapitelnummern beziehen sich auf die Manuals von Intel (nicht AMD).