ソースファイルを見てください。 Linuxはどこで実行を開始しますか?

ソースファイルを見てください。 Linuxはどこで実行を開始しますか?

いくつかのソースコードを読んで、それがどのように調和しているのか理解しようとしていますが、どこから始めるべきかわかりません。 Linuxソースコードでカーネルをコンパイルするための主なファイルは何ですか?

もともと一つ探したかったのですが、kernel/main.c下にファイルが多すぎてkernel/どんなのがメインなのかわかりませんか?うんkernel/sys.c

ベストアンサー1

ブートローダからカーネルに切り替えるには、メモリアドレスやレジスタの使用など、いくつかのアーキテクチャに関する考慮事項が必要です。したがって、見つけるべき場所はアーキテクチャ固有のディレクトリ(arch/*)です。さらに、ブートローダから切り替えるには、アセンブラで実装できる正確なレジスタ使用プロトコルが必要です。一部のアーキテクチャでは、カーネルにはさまざまなブートローダに対して異なるエントリポイントがあります。

たとえば、x86では、エントリポイントは次のようになります。arch/x86/boot/header.S(他のエントリポイントはわかりませんが、存在するかどうかはわかりません。)実際のエントリポイントは_startバイナリファイルのオフセット512にタグを追加する。最初の512バイトは作成に使用できます。マスターブートレコードIBM PC互換BIOSの場合(これまでカーネルをこの方法で起動できましたが、今はこの部分にエラーメッセージのみが表示されます)。タグは_startやや長い処理を開始します。リアルモード、まず組み立ててそれから存在するmain.c。特定の時点でコードを初期化する保護モードに切り替える。カーネルがこれであれば、ここが解凍が起こる点だと思います。圧縮;これはコントロールに到達します。startup_32またはstartup_64arch/x86/kernel/head_*.S32ビットカーネルか64ビットカーネルかによって異なります。もう少し組み立てた後、i386_start_kernel存在するhead32.cまたはx86_64_start_kernel存在するhead64.c呼び出されます。最後に、アーキテクチャ独立start_kernel機能するinit/main.c呼び出されます。

start_kernelカーネルが現実世界を準備し始める場所です。起動すると、1 つの CPU と一部のメモリしかありません(仮想メモリの場合、MMU はこの時点ですでにオンになっています)。ここにあるコードは、メモリマップを設定し、すべてのサブシステムを初期化し、割り込みハンドラを設定し、スレッドが生成されるようにスケジューラを起動し、周辺機器との対話を開始するなどのタスクを実行します。

ブートローダに加えて、カーネルにはマルチコアCPUでカーネルを有効にするときのエントリポイント、割り込みハンドラ、システムコールハンドラ、エラーハンドラなどの他のエントリポイントがあります。

おすすめ記事