起動プロセス後にLinuxカーネルイメージがRAMにロードされた後に発生するアクティビティの流れを知りたいです。
ベストアンサー1
Linux 2.6以降:
コア
RAMにロードされた後、カーネルは次の機能を実行します。
setup()
:
- 物理メモリのレイアウトを説明するために、RAMにテーブルを作成します。
- キーボードの繰り返し遅延と速度を設定します。
- ビデオアダプタカードを初期化します。
- ハードディスクパラメータを使用してディスクコントローラを初期化します。
- IBM マイクロチャネル・バスを確認してください。
- PS / 2ポインティングデバイス(バスマウス)を確認してください。
- 高度な電源管理(APM)サポートを確認してください。
- サポートされている場合は、使用可能なハードディスクを説明するテーブルをRAMに書き込みます。
- カーネルイメージがRAMの下の位置にロードされたら、より高い位置に移動します。
- A20ピンを設定します(古代8088マイクロプロセッサの互換性を修正)。
- 一時割り込み記述子テーブル(IDT)と一時グローバル記述子テーブル(GDT)を設定します。
- 浮動小数点単位(FPU)をリセットします。
- プログラム可能な割り込みコントローラ(PIC)を再プログラムしてください。
- リアルモードから保護モードに切り替えます。
startup_32()
:
- 分割レジスタと一時スタックを初期化します。
eflags
レジスタのすべてのビットをクリアします。- 初期化されていないデータ領域をゼロで埋めます。
decompress_kernel()
カーネルイメージを解凍するために呼び出されます。
startup_32()
(同じ名前、異なる機能):
- 最終分割レジスタを初期化します。
bss
セグメントをゼロで埋めます。- 一時カーネルページテーブルを初期化します。
- ページングを有効にします。
- プロセス0のカーネルモードスタックを設定します。
eflags
レジスタのすべてのビットを再びクリアします。- IDTを空の割り込みハンドラで埋めます。
- システムパラメータを使用して最初のページフレームを初期化します。
- プロセッサモデルを決定します。
- GDTとIDTのアドレスを使用してレジスタを初期化します。
start_kernel()
:ほとんどすべてのカーネルコンポーネントはこの関数によって初期化されています。これはほんのわずかです。
- スケジューラ
- メモリ領域
- 友達システムアロケータ
- イオン交換技術
- ソフトIRQ
- 日時
- スラブディスペンサー
- プロセス1の作成(
/sbin/init
)
完全な「リスト」は以下で確認できます。Linux/init/main.c
内部に
Init は、システムを必要な状態にするために必要なすべてのユーザー・プロセスを開始します。このルーチンは、呼び出される実行レベルと割り当てに大きく依存します。
runlevel
コンソールに何かを入力すると、システムの現在のランレベルが表示されます。
ビュー/etc/rcX.d/
(または/etc/rc.d/rcX.d/
)でXをランレベルに置き換えます。
実行優先順位に従ってソートされたシンボリックリンク。S01....
つまり、スクリプトは起動プロセスの初期に開始され、S99....
起動プロセスの最後に実行されます。シンボリックKXX....
リンクは同じことを行いますが、終了シーケンスに対するものです。
通常、これらのスクリプトは、ディスク、ネットワーク、ロギング、デバイス制御、特殊ドライバ、環境、およびその他のいくつかの必須シーケンスを処理します。