Вы уверены, что вам нужно написать собственный загрузчик?
Вы не вызываете start_kernel. Кстати, вы не вызываете никакой функции. Вам нужно прочитать образ ядра в память, поместить некоторую информацию, такую как командная строка, в память, настроить регистр и перейти к точке входа ядра.
Каждая архитектура (x86, ARM и т. Д.) Может иметь разные требования к загрузке.
Если вы хотите иметь более глубокое понимание, возможно, вы можете взглянуть на исходный код u-boot, например lib_386 / zImage.c