第III章MenuOs建設
A.前例レビュー
コンピュータ3つの魔法の武器:
-存储程序计算机
-函数调用堆栈
-中断
2本の刀オペレーティングシステム:
-中断上下文的切换(保存现场和恢复现场)
-进程上下文的切换
二.3.1 Linuxカーネルのソースコードの紹介
A、B、Cに従い、Linuxカーネルのバージョン番号の名前は次のとおりです。
-A代表大幅度转变的内核
-B代表重大修改的内核
-C指轻微修改的内核(C是内核的真实版本)
-D是安全补丁和bug修复
Linuxカーネルのソースコードのルートディレクトリ:
Linuxカーネルのブートプロセス追跡のIII。分析
実験
1.次のコードが完成した後、カーネルプログラムメニューを開始。
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
(ポート1234にGDBサーバーを作成し、別のウィンドウを開く-sを追加カーネルをデバッグ2. GDBトレースは、画像とGDBカーネルシンボルテーブルを使用することができるでロードされ、その後、接続セットは、カーネルGDBのsreverトラッキングブレークポイント)および-S(CPU彼は)2つのパラメータをフリーズし始めたの前に。
$ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
# 关于-s和-S选项的说明:
# 1. -S
# -S freeze CPU at startup (use ’c’ to start execution)
# 2. -s
# -s shorthand for -gdb tcp::1234
# 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
カーネルが凍結されています。
3.別のウィンドウを開き、GDBを起動し、カーネルが接続を確立するために、ロードされます。
GDBで次のコマンドを入力します。
file linux-3.18.6/vmlinux
target remote:1234
break start_kernel
c //按c让qemu上的Linux继续运行
実験問題
シンボルテーブルにロードされたときタージェがリモート問題がある前に、GDB、GDBインタフェースを起動するときに、ウィンドウを開くとき:システムは、「そのようなファイルやディレクトリのlinux-3.18.6 /のvmlinux」促し
ソリューション: -
-最初のビューを学生は、そのようなヤン・レイと同様の問題、そこに新しい学生がこのような問題となっている解決策を見つけるためにブログを公開カーネルのブートQEMUウィンドウの最後のステップはリードを閉じたとき、理由があります。(このような操作のない原因、チェック)
-反射に、それは間違いが、その後、Linuxカーネルのディレクトリを入力しても問題が解決しないことが判明しました。
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);// 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和其他的一些服务进程
}