Linuxカーネルのブートプロセスのフォローアップ分析
まず、実験
start_kernelから開始するGDBデバッグカーネルのinitプロセスを用いた実験の内容を追跡
方法によれば1は、実験的なガイダンスに従って実験棟の環境でシェルを開きます。
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
helpコマンドを入力します。
2. GDBトレースデバッグカーネル:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
3.シェルは、別のウィンドウを開いてコマンドをGDBを入力します。
# 打开 GDB 调试器
$ gdb
# 在 GDB 中输入以下命令:
# 在gdb界面中targe remote之前加载符号表
(gdb)file linux-3.18.6/vmlinux
# 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
(gdb)target remote:1234
# 断点的设置可以在target remote之前,也可以在之后
(gdb)break start_kernel
ブレークポイントの設定:
コマンドリストを入力します:
第二に、分析プロセス実行機能start_kernel
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のブートプロセス」の理解。
また、初期化プロセスとして知られている1つの1プロセスは、0 start_kernelはinitプロセスPID 1を作成rest_initプロセスによって呼び出されたすべてのユーザー・プロセスの祖先、スケジューラは、initプロセスを選択する際に、initプロセスは、関数initが一般的である)(kernel_init開始されますUNIXカーネルの初期化接合ユーザーモードで初期化されたユーザーモードプロセスは、それはすべてのユーザー・プロセスの祖先です。initは、初期化する前に、カーネルモードで実行されている、プロセス(カーネルの初期化)最後のアクションは、全体的に実行可能/ sbinに/ initを実行するために、これはほとんど、様々なサブシステムの土地の誕生です。
2.idleプロセス、タイトルが言うような、重要なサブシステムの初期化の完了は、あなたは後部座席を取ります。0番処理プロセスフォークから1番アウトユーザーが対話を開始できるように、次に、ユーザ・モードに変換するためにユーザ・モード、コアからの状態の完全な制御に切り替えます。