¿Cómo se puede escribir el código de arranque de Linux en C?

Soy un novato en el aprendizaje del desarrollo del sistema operativo. Del libro que leí, decía que el gestor de arranque copiará el primer MBR en 0x7c00, y comienza desde allí en modo real.

Y, el ejemplo comienza con un código de ensamblaje de 16 bits. Pero, cuando miré el kernel de Linux de hoy,arch / x86 / boot tiene 'header.S' y 'boot.h', pero el código real se implementa en main.c.

Esto parece ser útil al "no escribir ensamblado". Pero, ¿cómo se hace esto específicamente en Linux? Puedo imaginar que podría haber algo especialgcc opciones y estrategia de enlace, pero no puedo ver los detalles.