Ci sono davvero parti per imparare la programmazione del kernel, e si può prendere o:
1) Imparare come funziona il kernel esistente (e potenzialmente fare modifiche a, o il debug di, funzionalità esistenti.La risposta di Joseph Gunn copre più o meno questo - il primo passo è quello di familiarizzare con menuconfig (o uno degli altri strumenti di configurazione) e iniziare a costruire i propri kernel.
Il modo più semplice (IMO) per farlo è su una macchina virtuale, o potenzialmente anche su un emulatore completo come bochs.
2) Imparare ad estenderlo con nuove funzionalità. Conoscere #1 aiuta molto, ma c'è molta profondità lì, e per la maggior parte dei tipi di funzionalità che potreste voler aggiungere (driver, ecc.), la "superficie esposta" in realtà NON è così grande rispetto a molte delle funzionalità interne.
Ci sono un sacco di tutorial "costruire un modulo hello world" là fuori, che vi darebbero una certa esposizione alle API in questione, e ci sono anche tutorial di scrittura di driver di dispositivi. Scrivere un semplice file system in-memory (o qualche finta strumentazione sotto /sys) è un buon modo per imparare il VFS.