シンプルなLinuxシステムのMenuOSを構築
GDBデバッグカーネルのトレースを使用して
- シェルを開きます
コード分析:
QEMU:すでにシステムにインストールスタートは、このプログラムはカーネルコンテキストの開始を提供し、仮想マシンのプログラムQEMUに対応しています。
-kernelファイル名+パス:打ち上げカーネル、カーネルは初期化という名前のファイルをコンパイルした後に形成され、それがファイルディレクトリにrootfsをコピーする必要があります前に、とcpioを経由して屋根の下にrootfsという名前のファイルにパッケージ化されています。 IMGイメージファイル。
-initrd rootfs.img:起動時にドライブのハードウェアとして指定さにrootfs。
- GDBデバッグカーネルのトレースを使用して
- さらに、シェル開いているウィンドウは、Ctrl +は+ Oカーネルがロードされ、GDBを起動し、セグメンテーションレベルを達成シフト、接続を確立します。
- start_kerenlとrest_initブレークポイントを設定します
*/
static __initdata DECLARE_COMPLETION(kthreadd_done);
static noinline void __init_refok rest_init(void)
{
int pid;
rcu_scheduler_starting();
/*
シンプルな分析start_kernel
- start_kernel()関数のコード部分
asmlinkage __visible void __init start_kernel(void)
{
char *command_line;
char *after_dashes;
/*
* Need to run as early as possible, to initialize the
* lockdep hash:
*/
lockdep_init();
set_task_stack_end_magic(&init_task);
smp_setup_processor_id();
debug_objects_early_init();
.............
/* Do the rest non-__init'ed, we're now alive */
rest_init();
}
- 分析
start_kernel()関数は、Linuxカーネルの初期化を完了します。各コア部材は、この関数で初期化されます。
1.コールsched_init()関数は、スケジューラを初期化します
両方のメモリ管理を初期化する2.コールbuild_all_zonelists()関数
バディシステム・アロケータを初期化する。3.コールpage_alloc_init()関数
4. trap_init()関数とinit_IRQ()関数は、IDTを初期化する呼び出し
5.コールsofting_init()関数は、初期化TASKLET_SOFTIRQとHI_SOFTIRQ(ソフト割り込み)
6.コールtime_init()システムの日付と時刻を初期化します
7.コールkmem_cache_init()関数は、スラブアロケータ(通常、キャッシュ)を初期化
CPUクロック(遅延関数)を決定する8.コールするcalibrate_delay()関数
9.呼び出しは一つのスレッド内のプロセスを作成するには()関数をkernel_thread、カーネルスレッドは、追加のカーネルスレッドを作成し、/ sbin / initプログラムを実行します
10. start_kernel()はLinuxバージョンの実装の開始後に表示され、加えて、最終的な位相は、initプログラムの実装となり、カーネルスレッドは、他の多くの情報を示します。最後に、コンソール上でおなじみのログインプロンプトがあるだろう、Linuxカーネルを実行しているユーザーに通知するために開始されています。
概要
Linuxカーネルのブートプロセスは次のとおりです。
最初に0プロセスinit_task行われるプロセスは、それが手動でゼロから作成start_kernel()関数、1号0カーネルスレッドkernel_init後に作成されたプロセスによって、システムの初期化フェーズで、カーネル・スレッドであり、アイドルになる)(cpu_idleを呼び出しますプロセス、およびシステムは、プロセスが使用するスケジュールに実行する必要がないアイドルプロセスがある場合。
カーネルの初期化及びシステム構成部品を実装するための責任を、次いでkernel_thread(kernel_init、NULL、CLONE_FS)関数(すなわち、フォークモード)が成立PID = 1、工程1を使用する、とも呼ばれるinitプロセス番号1のカーネル・プロセス(ユーザ・モード号1工程)スケジューラがinitプロセスを選択する場合、システムは、他のすべてのプロセスの祖先となった、initプロセスは、初期化の残りを続行します。その後、kernel_thread実行kthreaddを呼び出すPIDカーネルスレッド2を作成し、このプロセスは常にカーネル空間で実行されている、それはスケジューリングと、すべてのカーネルスレッドを管理する責任があります。