No, i kernel di diverse implementazioni di sistemi operativi in stile Unix non sono intercambiabili, in particolare perché presentano tutti interfacce diverse per il resto del sistema (spazio utente) — le loro chiamate di sistema (incluso ioctl
specifiche), i vari file system virtuali che usano...
Ciò che è intercambiabile in una certa misura, a livello di sorgente, è la combinazione del kernel e della libreria C, o meglio, le API a livello utente che il kernel e le librerie espongono (essenzialmente, la vista a livello descritta da POSIX, senza considerando se lo è in realtà POSIX). Esempi di questo includono Debian GNU/kFreeBSD, che costruisce un sistema Debian sopra un kernel FreeBSD, e Debian GNU/Hurd, che costruisce un sistema Debian sopra Hurd.
Questo non è esattamente al livello dell'intercambiabilità del kernel, ma ci sono stati tentativi di standardizzare un'interfaccia binaria dell'applicazione comune, per consentire l'uso dei binari su vari sistemi senza bisogno di ricompilazione. Un esempio è l'Intel Binary Compatibility Standard, che consente ai binari conformi ad esso di funzionare su qualsiasi sistema Unix che lo implementa, comprese le versioni precedenti di Linux con il livello iBCS 2. L'ho usato alla fine degli anni '90 per eseguire WordPerfect su Linux.
Vedi anche Come costruire un chroot di FreeBSD all'interno di Linux.
Alcuni kernel hanno compatibilità binaria che consente di combinare programmi in spazio utente con diversi ABI (ad es. freebsd può funzionare con i binari di Linux in una certa misura) - tuttavia, i binari principali (ad es. il programma init, il caricatore di moduli, gli strumenti di configurazione dei driver di dispositivo, la libreria C , gli strumenti necessari per configurare i filesystem... ) avranno in pratica troppe informazioni necessarie sulle interfacce a livello di kernel per avviare correttamente un sistema con un kernel esterno.
Inoltre, i filesystem dovrebbero essere compatibili. Inoltre, le opzioni di compatibilità binaria dovrebbero essere compilate "hard" nel kernel - qualsiasi cosa implementata come modulo del kernel fallirebbe perché non potresti eseguire il caricatore di moduli.
Come accennato, gli ambienti utente tendono ad essere in qualche modo portabili se si è disposti a ricompilare - come i sistemi debian basati su freebsd, o l'impostazione del sistema netbsd pkgsrc su linux (assolutamente non banale, ma supportato e possibile!).