- 論壇徽章:
- 0
|
假設(shè)你有一段代碼用于休眠
int count = 0x00FFFFFF;
while(count--);
情況一.中斷處理前半段的休眠
1.內(nèi)核在此處是關(guān)中斷執(zhí)行的,所以任何的可屏蔽中斷都得不到響應(yīng).
缺頁異常??CPU一直在你的while里正常執(zhí)行,所以缺頁異常是不存在的,因?yàn)闆]有觸發(fā)的條件
除0異常??CPU一直在你的while里正常執(zhí)行,哪來的除0異常,也是沒有觸發(fā)的條件
調(diào)度??CPU一直在你的while里正常執(zhí)行,怎么能去執(zhí)行其他地址的指令而產(chǎn)生調(diào)度
想想有什么異常可以導(dǎo)致CPU重新跳轉(zhuǎn)到新的指令地址去執(zhí)行??
2.除非有一個(gè)硬件外設(shè)可以突發(fā)產(chǎn)生一個(gè)不可屏蔽中斷,并且優(yōu)先級(jí)比你正在執(zhí)行的中斷高.
假設(shè)這種情況真的產(chǎn)生了,CPU的確跳轉(zhuǎn)到這個(gè)新的中斷處理函數(shù)去執(zhí)行,但因?yàn)檫@次中斷的產(chǎn)生是在內(nèi)核中的,所以堆棧并不發(fā)生切換,使用的仍然是內(nèi)核堆棧.在這個(gè)中斷返回以后,仍然回到你的這段休眠代碼,最終等這個(gè)while循環(huán)結(jié)束以后,你的中斷返回了,才會(huì)繼續(xù)到其他地址執(zhí)行(中斷進(jìn)入前的地址)
3.如果你的休眠是while(1);那除了上述2可以得到CPU執(zhí)行外,內(nèi)存中其他所有指令都得不到執(zhí)行.內(nèi)核掛掉了.
情況二.中斷處理后半段的休眠(bh)
1.內(nèi)核在此處是開中斷執(zhí)行的,所以任何中斷和異常都可以打斷這段代碼的執(zhí)行,但執(zhí)行的情況跟上述情況一的2類似.
2.如果你的休眠是while(1);那除了所有中斷可以得到CPU執(zhí)行外,內(nèi)存中其他所有指令都得不到執(zhí)行.內(nèi)核除中斷和異常處理外都掛掉了,應(yīng)用層也掛掉了.
[ 本帖最后由 readkernel 于 2009-11-30 12:01 編輯 ] |
|