Ciao Carlo!

Compilare un kernel è una cosa abbastanza istruttiva, e consiste nel prendere i sorgenti, configurare tutte le numerose opzioni del kernel e per l'appunto "compilarlo" ovvero trasformare quell'insieme di files .c e .h in un unico file eseguibile che verrà lanciato all'avvio del sistema.

Questo lo si fa o sul kernel che si ha già (per ampliarne le possibilità o aumentarne le prestazioni) o su un nuovo kernel.
In ogni caso ricordati che per oigni kernel esistono sul disco numerosi files, che dipendono dal kernel stesso.
Cosa vuol dire? Vuol dire che se hai un kernel ad esmpio 2.6.22 e lo ricompili, modificherai TUTTI i files (e i drivers e i moduli) per QUEL kernel.
Se invece parti da zero col kernel 2.6.20 il 2.6.22 rimarrà FUNZIONANTE, e non rischi di fare casini.

Allora, le basi sono avere sul sistema il compilatore (GCC), la catena di compilazione (le varie glibc, glibcpp e bash).
Servono anche i sorgenti del kernel :D
Da Ubuntu credo tu trovi i sorgenti del kernel già ottimizzato per Ubuntu nei repositories e installandoli ti installi già tutto l'occorrente ;)
Ricorda che più kernel possono convivere sulla stessa macchina e che i kernel "ufficiali" si chiamano Vanilla-sources, mentre poi quasi tutte le distro li patchano per migliorarli ed adattarli ai loro scopi.

I sorgenti risiedono solitamente in /usr/src/$kernel e per compilare un kernel basta andare in tale locazione e dare (come root)

Codice:
make menuconfig
Così facendo accederai a un pratico menu grafico per configurare le opzioni e i driver come preferisci.
Molte features possono essere compilate come Moduli, ovvero "pezzi di codice che vengono caricati su richiesta dal kernel stesso" premendo M, altri direttamente nel kernel premendo Y.

Ricorda che è NECESSARIO che nel kernel sia presente il supporto al tuo controller del disco principale (ad esempio dell'ICH su Intel) compilato NEL KERNEL e non come modulo, perchè altrimenti capiterai nel famoso Kernel panic!

Una volta finito dai sempre come root

Codice:
make && make modules_install
e il tuo kernel sarà compilato.
Finito il processo, dovrai copiare il kernel da /usr/src/$kernel/arch/$architettura/bzImage in /boot e aggiungerlo a /boot/grub/grub.conf
Se ti serve una mano anche qui posso dirti come fare :)

Se prima di eseguire menuconfig vuoi che siano caricate le impostazioni del kernel in uso puoi dare sempre da root

Codice:
make oldconfig
e poi

Codice:
make menuconfig
E vedrai in menuconfig tutte le impostazioni già sistemate come nel kernel attualmente caricato ;)

La cosa sembra difficile ma se usi un kernel differente da quello che hai installato non corri alcun rischio, e magari una votla fatto riuscirai a avere un kernel molto più snello e veloce ;)

Se ti posso essere d'aiuto più specificatamente fammi sapere ;)

P.S: Ti consiglio di scaricare un kernel maggiore del 2.6.20 tipo 2.6.22 (ultimo "stabile" :D: ) e poi campilarlo usando prima oldconfig e poi menuconfig, in modo da avere già una guida sulle cose da includere.
Inizia a escludere cose che sai per certo non servirti (come il bus PCMCIA su un desktop) e poi piano piano a levare sempre più roba ;)