Hay realmente partes para aprender a programar el kernel, y puedes tomar cualquiera de ellas:
1) Aprender cómo funciona el kernel existente (y potencialmente hacer cambios o depurar la funcionalidad existente.) La respuesta de Joseph Gunn cubre más o menos eso - el primer paso es familiarizarse con menuconfig (o una de las otras herramientas de configuración) y empezar a construir tus propios kernels.
La forma más fácil (IMO) de hacerlo es en una máquina virtual, o potencialmente incluso un emulador completo como bochs.
2) Aprender a extenderlo con nuevas funcionalidades. Saber #1 ayuda mucho, pero hay mucha profundidad allí, y para la mayoría de los tipos de funcionalidad que usted podría querer agregar (controladores, etc), la "superficie expuesta" no es realmente tan grande en comparación con una gran cantidad de la funcionalidad interna.
Hay un montón de tutoriales "construir un módulo de hola mundo" por ahí, lo que le daría una cierta exposición a las APIs en cuestión, y hay tutoriales de escritura de controladores de dispositivos también. Escribir un simple sistema de archivos en memoria (o alguna instrumentación falsa bajo /sys) es una buena manera de aprender el VFS.