網(wǎng)易云課堂《Linux內核分析》作業(yè)
實驗目的:
使用gdb跟蹤分析一個schedule()函數(shù)荒叼,理解Linux系統(tǒng)中進程調度的時機踪古。
實驗過程:
登陸實驗樓虛擬機http://www.shiyanlou.com/courses/195
打開shell終端菱蔬,執(zhí)行以下命令:
cd LinuxKernel
rm -rf menu
git clone https://github.com/mengning/menu.git
cd menu
mv test_exec.c test.c
make rootfs
可以看到編譯出來的系統(tǒng)已經(jīng)有了exec命令
可以通過增加-s -S啟動參數(shù)打開調試模式
qemu -kernel ../linux-3.18.6/arch/x86/boot/bzImage -initrd ../rootfs.img -s -S
打開gdb進行遠程調試
gdb
file ../linux-3.18.6/vmlinux
target remote:1234
設置斷點
b schedule
b context_switch
b switch_to
b pick_next_task
實驗分析:
通過實驗可知schedule()函數(shù)用來選擇一個新的進程來運行凶硅,并調用context_switch()進行上下文的切換唱星,這個宏調用switch_to()來進行關鍵上下文切換铛只,其中pick_next_task()函數(shù)封裝了進程調度算法。
實驗總結:
進程調度時機有三:
1定罢、中斷處理過程(包括時鐘中斷笤虫、I/O中斷、系統(tǒng)調用和異常)中祖凫,直接調用schedule()琼蚯,或者返回用戶態(tài)時根據(jù)need_resched標記調用schedule();
2惠况、內核線程可以直接調用schedule()進行進程切換遭庶,也可以在中斷處理過程中進行調度,也就是說內核線程作為一類的特殊的進程可以主動調度稠屠,也可以被動調度罚拟;
3、用戶態(tài)進程無法實現(xiàn)主動調度完箩,僅能通過陷入內核態(tài)后的某個時機點進行調度赐俗,即在中斷處理過程中進行調度。
進程切換:為了控制進程的執(zhí)行弊知,內核必須有能力掛起正在CPU上運行的進程阻逮,并恢復以前掛起的某個進程的執(zhí)行。這種行為被稱為進程切換(process switch)秩彤、任務切換(task switch)或上下文切換(context switch)叔扼。
掛起正在CPU上執(zhí)行的進程,與中斷時保存現(xiàn)場是不同的漫雷,中斷前后是在同一個進程上下文中瓜富,只是由用戶態(tài)轉向內核態(tài)執(zhí)行。
進程上下文包含了進程執(zhí)行需要的所有信息降盹,包括:
1与柑、用戶地址空間:?包括程序代碼,數(shù)據(jù),用戶堆棧等
2价捧、控制信息?:進程描述符丑念,內核堆棧等
3、硬件上下文(與中斷保存硬件上下文的方法不同)
Linux系統(tǒng)的一般執(zhí)行過程
最一般的情況:
正在運行的用戶態(tài)進程X切換到運行用戶態(tài)進程Y的過程
1结蟋、正在運行的用戶態(tài)進程X
2脯倚、發(fā)生中斷——save cs:eip/esp/eflags(current) to kernel stack,then load cs:eip(entry of a specific ISR) and ss:esp(point to kernel stack).
3、SAVE_ALL //保存現(xiàn)場
4嵌屎、中斷處理過程中或中斷返回前調用了schedule()推正,其中的switch_to做了關鍵的進程上下文切換
5、標號1之后開始運行用戶態(tài)進程Y(這里Y曾經(jīng)通過以上步驟被切換出去過因此可以從標號1繼續(xù)執(zhí)行)
6宝惰、restore_all //恢復現(xiàn)場
7植榕、iret - pop cs:eip/ss:esp/eflags from kernel stack
8、繼續(xù)運行用戶態(tài)進程Y
幾種特殊情況:
1掌测、通過中斷處理過程中的調度時機内贮,用戶態(tài)進程與內核線程之間互相切換和內核線程之間互相切換产园,與最一般的情況非常類似汞斧,只是內核線程運行過程中發(fā)生中斷沒有進程用戶態(tài)和內核態(tài)的轉換;
2什燕、內核線程主動調用schedule()粘勒,只有進程上下文的切換,沒有發(fā)生中斷上下文的切換屎即,與最一般的情況略簡略庙睡;
3、創(chuàng)建子進程的系統(tǒng)調用在子進程中的執(zhí)行起點及返回用戶態(tài)技俐,如fork乘陪;
4、加載一個新的可執(zhí)行程序后返回到用戶態(tài)的情況雕擂,如execve啡邑;
aapu原創(chuàng)作品轉載請注明出處《Linux內核分析》MOOC課