いくつかのソースコードを読んで、それがどのように調和しているのか理解しようとしていますが、どこから始めるべきかわかりません。 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_64
arch/x86/kernel/head_*.S
32ビットカーネルか64ビットカーネルかによって異なります。もう少し組み立てた後、i386_start_kernel
存在するhead32.c
またはx86_64_start_kernel
存在するhead64.c
呼び出されます。最後に、アーキテクチャ独立start_kernel
機能するinit/main.c
呼び出されます。
start_kernel
カーネルが現実世界を準備し始める場所です。起動すると、1 つの CPU と一部のメモリしかありません(仮想メモリの場合、MMU はこの時点ですでにオンになっています)。ここにあるコードは、メモリマップを設定し、すべてのサブシステムを初期化し、割り込みハンドラを設定し、スレッドが生成されるようにスケジューラを起動し、周辺機器との対話を開始するなどのタスクを実行します。
ブートローダに加えて、カーネルにはマルチコアCPUでカーネルを有効にするときのエントリポイント、割り込みハンドラ、システムコールハンドラ、エラーハンドラなどの他のエントリポイントがあります。
答え2
start_kernel()
見ようとする/init/main.c
。メモリページングなど、一部の基本機能を設定した後にブートローダから呼び出す機能です。
詳細な背景情報については、以下を参照してください。WikipediaLinux起動プロセス。