第III章MenuOs建設
A.サポート技術情報の概要
- コンピュータ3つの魔法の武器:
- プログラム内蔵方式
- 関数呼び出しスタック
- 割り込み
- 2本の刀オペレーティングシステム:
- 割り込みコンテキストスイッチング(サイトとサイトの復元を保存)
- プロセスのコンテキストスイッチ
彼らは両方のアセンブリ言語と密接にリンクされています
- より重要なのLinuxカーネルの分析は以下のとおりです。
- アーチのディレクトリの下のディレクトリにあるX86のソースファイル
- (INITディレクトリ内のmain.c Linuxカーネルのブートを初期化するためにstart_kernel機能の出発点です)
- カーネルディレクトリとプロセスのスケジューリング関連のコードの下で
Linuxカーネルのブートプロセス追跡のII。分析
1.実験手順
Linuxシステムに、次のコマンドと、単純なファイルシステム稼働により、
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
ポート1234上のgdb-サーバーを作成する(GDBトレースデバッグカーネルを使用して、(彼はCPUを凍結し始めた前)-Sを追加し、-s、あなたは、シンボルテーブルとGDBのカーネルイメージと別のウィンドウを開くことができますロードされていますで、その後のGDB sreverトラッキングカーネル接続されたブレークポイントを設定)は、2つのパラメータ。次の図は、あなたはカーネルがアップ凍結されて見ることができます。
その後、ウィンドウを開くにgdbを起動し、カーネルのロードが入ってくるとの接続を確立します。
GDBで次のコマンドを入力します。
file linux-3.18.6/vmlinux
target remote:1234
break start_kernel
c //按c让qemu上的Linux继续运行
我々は、結果を参照することができ
、コードの入力がstart_kernel上下のリストを表示することができます
その後、ブレークポイントrest_initは継続設定
私はrest_initがstart_kernelの最後に呼び出され見ることができます。
2.問題が発生しました
私は、GDBインターフェイスタージェは、リモートの学生の助けを借りた問題がある前に、シンボルテーブルをロードするとき、GDBを起動するための時間のウィンドウを開くだろうというとき、カーネルのブートQEMUウィンドウの最後のステップはリードを閉じたときです。
実装プロセスのstart_kernel機能の3分析
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);// init_task即手工创建的PCB,0号进程即最终的idle进程
smp_setup_processor_id();
debug_objects_early_init();
// ...
trap_init(); // 中断向量的初始化
mm_init(); // 内存模块的初始化
sched_init(); // 调度模块的初始化
// ...
rest_init(); // rest_init是0号进程(是使用宏初始化的),它创建1号进程init和其他的一些服务进程
}
4.Linuxシステムの起動プロセス
メインカーネル初期化モジュールはstart_kernel機能で呼ばれています。
アイドルプロセスは来る方法です:init_task()(PID = 0 ) initプロセスを作成した後、cpu_idle()を呼び出すと、スケジューラ、initプロセスが実行されるの後、アイドルプロセスへと進化。
1番処理が来る方法である:カーネルおよびシステム構成の実装を担当する第1のカーネル・スレッドの初期化、最後の呼び出しは、initプロセスをロードdo_execve、initプロセス(ユーザモード1工程)へと進化し、初期化プロセスは、第一のカーネルブートありますユーザーモードプロセス。
常にカーネル空間で実行中のプロセス番号0、によって作成されたkthreadd(PID = 2)プロセスは、スケジューリングとすべてのカーネルスレッドを管理する責任があります。
カーネルが起動が完了した後、システムは、つまり、プロセスがアイドルプロセスと呼ばれる実行する必要はありませんcall_cpu_idle、そこにある「0プロセスが。」開始からシステムアイドルプロセスが存在していた後にシステムが起動するように、それは、1番initプロセスといくつかの他のサービスプロセスを作成します。