2019-2020-1 20199309仕事の4週目の「Linuxカーネルの原理と分析」

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番アウトユーザーが対話を開始できるように、次に、ユーザ・モードに変換するためにユーザ・モード、コアからの状態の完全な制御に切り替えます。

おすすめ

転載: www.cnblogs.com/fungi/p/11617705.html
おすすめ