Also das erste Problem ist, dass du das struct für die Multibootinformationen nicht korrekt angelegt hast. Das syms-Feld ist eigentlich 16 Bytes groß, aber bei dir warens nur 8 Bytes. Dadurch waren die Felder für die Memory-Info verschoben, was zur Folge hatte, dass deine physische Speicherverwaltung nicht korrekt initialisiert wurde. Das hatte wiederrum zur Folge, dass die immer 0 zurückgegeben hat, und weil du das nicht abgefangen hast, waren alle deine Tasks an dieser Adresse, und die Überprüfung ob current_task = NULL ist, war immer wahr. Der erste Fix ist also pmm.h zu korrigieren:
...
uint32_t mbs_mods_addr;
uint32_t mbs_syms1;
uint32_t mbs_syms2;
uint32_t mbs_syms3;
uint32_t mbs_syms4;
uint32_t mbs_mmap_length;
uint32_t mbs_mmap_addr;
...
Dann sind immerhin schon mal die meisten Pointer ungleich 0, aber es tritt immer noch derselbe Fehler auf. Die Ursache dafür ist, dass in init_task die Variablen user_stack und stack nicht groß genug sind. Es sollten Pointer sein.
So muss es aussehen:
uint8_t *user_stack = pmm_alloc();
uint8_t *stack = pmm_alloc();
Das hätten dir deine Warnungen sogar sagen können, aber vermutlich hast du die ignoriert, weil es soviele sind. Die meisten Warnungen wirst du übrigens los, wenn du den Code als C99 kompilierst (it dem GCC-Parameter -std=c99 bzw. -std=gnu99, weil du asm statt __asm__ benutzt.).