私の意見は、そうです、外部の世界(非特権プロセッサモード)へのすべての有用な露出は、最初に外部の世界で実行されているプロセスを必要とするためです。それには、一時的なRAM内のファイルシステムでさえ、ファイルシステムが必要です。
別のエンジニアは私に反対しますが、すべての(私には知られていない)ケースを超えてこれを証明することはできないようです。
この質問に対する答えは、「実行中」の定義に依存しますか?
init
(最初のユーザー空間プロセス)まで正常に初期化され、失敗します。
私の意見は、そうです、外部の世界(非特権プロセッサモード)へのすべての有用な露出は、最初に外部の世界で実行されているプロセスを必要とするためです。それには、一時的なRAM内のファイルシステムでさえ、ファイルシステムが必要です。
別のエンジニアは私に反対しますが、すべての(私には知られていない)ケースを超えてこれを証明することはできないようです。
この質問に対する答えは、「実行中」の定義に依存しますか?
init
(最初のユーザー空間プロセス)まで正常に初期化され、失敗します。
回答:
プログラムを実行するようにカーネルを実行するわけではないので、それは奇妙な質問です。カーネルは、プログラムを実行するプラットフォームです。もちろん、セットアップとシャットダウンのコードはありますが、カーネルを単独で実行することはできません。必ずメインの「init」プロセスが必要です。そして、カーネルがなければパニックに陥ります。initがカーネルを終了しようとすると、パニックも発生します。
最近では、initプロセスはsystemdのようなものです。特に指定がない場合、カーネルはで始まる場所のリストからプログラムを実行しようとします/sbin/init
。ここでinit Paramを参照してくださいhttp://man7.org/linux/man-pages/man7/bootparam.7.html緊急時にLinuxを起動できますinit=/bin/bash
。ただし、実行するファイルシステム上のファイルを常に指定する方法に注意してください。
そのため、起動しないとカーネルにパニックが発生します。これがないと、initをロードする方法がないためです。
カーネルがそのファイルシステムにアクセスするためにドライバーをロードする必要があるという鶏と卵の状況のために、いくらかの混乱が生じるかもしれません。これを回避するために、重要なドライバーとセットアップスクリプトを含むディスク上のイメージから初期RAMディスクがロードされます。これらは、ファイルシステムがロードされる前に実行されます。ただし、最初のRAMディスク自体がファイルシステムであることに間違いはありません。初期ramdisk /init
が呼び出されます(初期ramdiskに保存されます)。多くのディストリビューションでは、最終的にを呼び出すのはこれ/sbin/init
です。再びファイルシステムがなければ、これは不可能です。
init.$DEV.rc
スクリプト。
答えは、あなたが文字通りファイルシステムなしで意味するかどうか、または質問が実際に述べられている方法とは少し異なるように解釈されることを意図しているかどうかに依存するでしょう。質問の解釈方法のわずかなバリエーションに対する回答は次のとおりです。
カーネルコードの一部を書き換えて、ファイルシステムなしで動作するシステムを作成する必要がある理由は次のとおりです。
execve
、ファイルシステムからの実行可能ファイルを必要とするシステムコールによって開始されます。プログラムの使用開始後 execve
しの実行可能ファイルをマップ解除することができますが、すぐにクラッシュすることなくそれを行うには、ファイルに裏付けされていない実行可能メモリマッピングを作成する必要がありますが、そして、ジャンプして実行可能ファイルのマッピングを解除する前に、いくつかの有用なコードでそれを初期化する必要があります。
したがって、実行中のユーザーモードプログラムは、ファイルに関連付けられたメモリマッピングがなく、ファイルに関連付けられたすべてのファイル記述子を閉じることができる状態で存在できます。ルートディレクトリと現在の作業ディレクトリを持つことを止めることはできませんが、それらを控えることはできます。
そのため、この状態でカーネルコードを実装して、プログラムの下からファイルシステムをリッピングして実行し続けることはできますが、有用であるとは思えません。そして、ファイルシステムを使用する中間状態を経ずにその最終状態に到達することは、有益な利益がないためにさらに多くの作業を行うことになります。
いくつかの特殊なユースケースに役立つセットアップ
ブロックデバイスの使用を避けることは有用です。ブート中に、カーネルはメモリファイルシステムを作成します。また、cpio
実行する前に、そのファイルシステムにアーカイブの内容を取り込むことができますinit
。そうすれば、システムを完全にメモリベースのファイルシステムから実行することができ、システムをバックアップするブロックデバイスはありません。
これは、状態を保持したくないシステムや、再起動時にシステムがクリーンな状態から起動するようにしたい場合に役立ちます。
もちろん、カーネルとcpioアーカイブは、カーネルに制御が与えられる前に、何らかの形でメモリ内に存在する必要があります。彼らがどうやってそこに着いたかは、ブートローダーの仕事です。最終的な実行中のシステムがブロックデバイスを使用しない場合でも、ブートローダーはブロックデバイスからそれらをロードできた可能性があります。ただし、ブートローダーは、ネットワーク経由でブートするなど、ブロックデバイスを使用せずにカーネルとcpioアーカイブを取得することもできます。
Linuxでは、ほぼすべてのデバイスがファイルであるため、それを実行するにはファイルシステムが必要です。
eth0
、ネットワークインターフェイス(wlan0
など)はありません。
カーネルは他のプログラムと同様にプログラムです。デフォルトでは、Linuxカーネルはファイルシステムへのアクセスを試みますが、この動作は、カーネルの変更(実際には「arch_call_rest_init()」関数の追加)によって簡単に排除できます。「有用な作業」を実行するには、開発者がカスタムドライバーにカーネルスレッド(kthreads)、perhaposを含めて、必要な初期化とアプリケーションタイプのワークロードを実行することを期待します。Linuxカーネルにはすでに多くのkthreadが含まれていますが、主にカーネルまたはドライバーに付随する作業を実行するためのものです。カーネルコンテキスト内で使用可能なAPIは、Linuxユーザー空間で使用可能なAPIとはまったく異なります。ファイルシステムが存在しないシナリオでは、システムコール機能の大部分は役に立たなくなります。
はい、Linuxはデフォルトでファイルシステムへのアクセスを想定しています。いいえ、変更されたカーネルは、ファイルシステムなしで有用な作業を実行するように作成できます。Linux w / oファイルシステムの実際の使用はIMOにかなり制限されていますが、ゼロではありません。FWIWは、これまで多くのリアルタイムカーネルがRTアプリケーションと同じネームスペースとバイナリに組み込まれていました。
useful exposure to the outside world