Naja, mit Windows oder Linux hat das eigentlich nicht viel zu tun. Eher damit, wie der gcc konfiguriert wurde. Am besten hängst du bei deinen CFLAGS ein -fno-leading-underscore an, dann kannst du davon ausgehen, dass keine Unterstriche benutzt werden.
Und ja, das 0x4 ist die Adresse Instruktion, die für den Fehler verantwortlich ist. Ich glaube eher nicht, dass das die main() ist, sondern eher die Stelle im Assemblercode, wo die main angesprungen werden soll.
Am besten Zeigst du mal den C und den ASM-Code her und sagst uns, welche Flags du zum kompilieren benutzt.
Zum Windows-Bootloader kann ich keine Auskunft geben. Ich befürchte aber, der ist nicht dafür gemacht, flache Binärdateien zu laden.
Ich würde dir, dazu raten, einen Multiboot-Header in deinen Assemblercode zu packen, ELF als Ausgabeformat zu benutzen und danach GRUB als Bootloader hernehmen. Damit können wir dir hier am Besten helfen.
Wie das zusammenhängt kannst du eigentlich grösstenteils selbst bestimmen. Klar, die GUI hängt vom Kernel ab, aber da gibt es verschiedene Ansätze wie man die GUI ins System integrieren kann. Der erste wäre der, der von Windows benutzt wird, also die GUI als Teil des Kernels. Die andere Möglichkeit sieht man bei Linux. Der Grafikserver X ist ein eigenständiges Programm und braucht den Kernel nur, um mit der Hardware zu kommunizieren.
Ob eine GUI die Konsole ersetzen kann, hängt von deinen Zielen ab. Aber prinzipiell ist das möglich.