Isn't it a chicken and egg problem?
В некотором смысле, конечно.
How does the kernel loads these files
Нет. (Полностью модульное )ядро действительно не способно на это, по сути, вообще не может получить доступ к какому-либо диску, пока вы не загрузите соответствующие модули (ahci, scsi и т. д.)
Вы также можете спросить, как ядро загружает ядро... это невозможно, поэтому должно быть что-то еще.
Подобно загрузчику, который загружает за вас и ядро, и initrd/initramfs (, если применимо, -их можно поместить в один файл.)