たとえば、FedoraのLinuxカーネルをFreeBSDのカーネルに置き換えるなど、カーネルを変更できるかどうかを知りたいです。
今存在しますDebian GNU/kFreeBSD。 BSDカーネルを含むようにLinuxディストリビューションをカスタマイズできますか?
答え1
いいえ、各コアは独自の方法で独自の機能を実装します。 POSIXの互換性はたくさんありますが、その互換性を削除したら、すでに存在するカーネルメカニズムを使用して実行可能ファイルをコンパイルする必要があります。多くのプロジェクトには、FreeBSDまたはLinux用に明示的にコンパイルする場合にのみコンパイルされるソースコードが含まれています。これが本質的にkFreeBSDが行うことです。これらのツールはFreeBSDカーネルをサポートしますが、それに合わせてコンパイルする必要があります。
epoll_create
たとえば、FreeBSDで使用しようとすると、期待どおりに機能しません。
もちろん、BSDシステムLFSスタイルでこれらのツールをクロスコンパイルできますが、時間がかかることがあります。新しいカーネルをコンパイルするほど単純ではありません。
答え2
FreeBSDはLinuxカーネルを使用しません。名前が示すように、BSDカーネルを使用します。
Linuxカーネルを他のLinuxカーネル(直接ビルドしたカーネルまたはディストリビューションから抽出したカーネル)に置き換えることができます。ディストリビューションのユーザー空間プログラムは、コンパイルする特定のカーネル機能に依存する可能性があり、これらの機能を持たないカーネルで実行すると正しく機能しない可能性があります。たとえば、systemdベースのディストリビューションでは、カーネルにcgroupが必要です。
あなたが言及した例ではそうです。 LinuxカーネルまたはBSDカーネル用のGNUディストリビューションを構築することが可能です。#ifdef
カーネルが同じABIを宣伝していても、2つのプログラム(たとえば)に対してコンパイルされたプログラム間にコンパイル時間の違いがあることがよくあります。少なくとも、低レベルライブラリ(Cランタイムライブラリなど)は、さまざまなカーネルABIに適応する必要があります。
答え3
カーネルは、オペレーティングシステムの更新中に定期的に交換される独立した部分です。一部の独自ドライバ(NVIDIAなど)には、ドライバをカーネルソースコードにパッチし、そのカーネルをビルドしてから現在のカーネルを置き換えるインストールスクリプトがあります。したがって、必要なすべての機能を実行する独自のカーネルバージョンを開発する場合は、それを実装してオペレーティングシステムの残りの部分をそのままにすることは大きな問題ではありません。しかし、ほとんどの場合、これらの「新しいカーネル」は最新の公式リリースから来ています。
Solarisカーネルはある程度この方法で移植され、OpenSolarisが動作するGnome環境が生まれました。
ただし、まったく異なるカーネルをインストールするにはインターフェイスをブリッジする必要があるため、かなりの労力が必要です。これには、スクリプトの作成だけでなく、多くのCプログラミングが必要になる場合があります。