私の意見はそうです。外部世界(無許可のプロセッサモード)へのすべての有用な露出は、最初に外部世界で実行されるプロセスが必要なためです。これには、ファイルシステム、さらには一時的なRAM内のファイルシステムも必要です。
他のエンジニアは私の意見に同意しませんが、すべての(私が知らない)状況でそれを証明することはできないようです。
この質問に対する答えは、「実行」の定義によって異なりますか?
答え1
カーネルをプログラムのように実行しないので、これはかなり奇妙な問題です。カーネルはプログラムが実行されるプラットフォームです。もちろん、設定と終了コードがありますが、カーネルだけを単独で実行することは不可能です。常にデフォルトの「init」プロセスが必要です。存在しない場合、カーネルパニックが発生します。 init がカーネルを終了しようとするとパニックが発生します。
今日、initプロセスはsystemdに似ています。特に指定しないと、カーネルは、で始まる場所のリストからプログラムを実行しようとします/sbin/init
。ここで初期化パラメータを参照してください。http://man7.org/linux/man-pages/man7/bootparam.7.html緊急の場合は、を使用してLinuxを起動できますinit=/bin/bash
。ただし、実行するファイルシステムで常にファイルを指定する方法に注意してください。
したがって、ファイルシステムなしでカーネルが起動すると、ファイルシステムなしではinitをロードできないため、パニックが発生します。
カーネルの初期化段階により、多少の混乱が発生する可能性があります。初期のRAMディスクはディスクのイメージからロードされ、重要なドライバとインストールスクリプトが含まれています。これはファイルシステムがロードされる前に実行されます。しかし、初期のRAMディスク自体がファイルシステムであることには疑いの余地はありません。初期RAMディスクを呼び出します/init
(初期RAMディスクに保存されています)。多くのディストリビューションでは、最終呼び出しはthisです/sbin/init
。繰り返しますが、これはファイルシステムがなければ不可能です。
答え2
答えは、文字通りファイルシステムがないことを意味するのか、それとも実際に言及された方法とは少し違うように解釈されるのかによって異なります。質問に対する少し異なる解釈の答えは次のとおりです。
- プログラムなしでLinuxを実行するブロックデバイスいくつかの特別なユースケースは完全に実行可能で便利です。
- プログラムなしでLinuxを実行するファイルシステムカーネルコードの一部を書き直す必要があり、これは役に立つ作業ではない可能性があります。
- プログラムを使用せずにLinuxを実行するファイル記述子多くの努力が必要です。私はそれが努力する価値がないと確信しています。
ファイルシステムなしで動作するシステムを作成するためにカーネルコードの一部を書き換える必要がある理由は次のとおりです。
- 各スレッドには、ルートディレクトリといくつかのファイルシステムを指す必要がある現在の作業ディレクトリがあります。
execve
プログラムは、ファイルシステムに実行可能ファイルを必要とするシステムコールによって開始されます。- カーネルは、ブートプロセス中にメモリベースのファイルシステムを生成します。
プログラムの起動後にexecve
起動した実行可能ファイルのマッピングを解除することはできますが、すぐに競合せずにこれを行うには、まずファイルがサポートしていない実行可能メモリマップを作成し、そのファイルにジャンプしてマッピングを解除する必要があります。ファイルが生成されたら、便利なコードで初期化する必要があります。
したがって、実行中のユーザーモードプログラムは、ファイルサポートメモリマッピングなしで存在する可能性があり、ファイルがサポートするすべてのファイル記述子を閉じることができます。ルートディレクトリと現在の作業ディレクトリを持つことを止めることはできませんが、これを避けることはできます。
したがって、この状態ではカーネルコードを実装してプログラムからファイルシステムを削除して実行し続けることができますが、これは役に立ちません。ファイルシステムを使用する中間状態を経ずに最終状態に達するには、より多くの作業が必要であり、何の利点も得られません。
いくつかの特別なユースケースに役立つ設定
ブロックデバイスを使用しないと便利です。起動中に、カーネルはメモリ内ファイルシステムを作成し、cpio
実行前にそのファイルシステムをアーカイブの内容で埋めることもできますinit
。これにより、ブロックデバイスをサポートせずにメモリベースのファイルシステムでシステムを完全に実行できます。
これは、状態を維持せずに再起動時にシステムを最初から起動したいシステムに役立ちます。
もちろん、カーネルが制御できるようにするには、カーネルとcpioアーカイブがメモリに何らかの方法で存在する必要があります。彼らがそこに到達する方法はブートローダの使命です。最終実行システムがブロックデバイスを使用しなくても、ブートローダはブロックデバイスからこれらのコンテンツをロードできます。ただし、ブートローダは、ネットワーク経由のブートなどのブロックデバイスを使用せずに、カーネルとcpioアーカイブを取得することもできます。
答え3
Linuxではほとんど各デバイスはファイルですしたがって、これを実行するにはファイルシステムが必要です。
答え4
カーネルは他のプログラムと同様にプログラムです。デフォルトでは、Linuxカーネルはファイルシステムにアクセスしようとしますが、この動作はカーネルを変更することで簡単に削除できます(実際には「arch_call_rest_init()」関数を追加するだけです)。 「有用なタスク」を実行するために、開発者はカスタムドライバにカーネルスレッド(kthread)を含め、いくつかの必要な初期化とアプリケーションタイプのワークロードを実行できると期待しています。 Linux カーネルにはすでに多くの kthread が含まれていますが、主にカーネルやドライバーの補助操作を実行します。カーネルコンテキストで使用できるAPIは、Linuxユーザースペースで使用できるAPIとは大きく異なります。ファイルシステムがないシナリオでは、システムコール機能の大部分が役に立ちません。
はい、Linuxはデフォルトでファイルシステムへのアクセスを期待しています。いいえ、変更されたカーネルはファイルシステムなしで便利な操作を実行できます。私の考えでは、ファイルシステムを持たないLinuxの実際の使用はかなり制限されていますが、ゼロではありません。 FWIW、過去には多くのリアルタイムカーネルがRTアプリケーションと同じ名前空間とバイナリに構築されました。