- 論壇徽章:
- 15
|
entry_32.S
問(wèn)題是:
testl $X86_EFLAGS_IF,PT_EFLAGS(%esp) # interrupts off (exception path) ?
這句,看注釋的意思應(yīng)該是:當(dāng)檢測(cè)到EFLAGS中IF標(biāo)記清零時(shí)(即表示關(guān)中斷時(shí)),表示是exception path,按我的理解:中斷走中斷門,進(jìn)入中斷時(shí)會(huì)自動(dòng)關(guān)中斷(清IF標(biāo)記);而異常應(yīng)該走陷阱門,應(yīng)不會(huì)自動(dòng)關(guān)中斷,所以,這里好像說(shuō)反了?求解。。。
ENTRY(resume_kernel)
/*
* 前面已經(jīng)關(guān)了中斷了,這次再關(guān)的原因是,還有其它流程會(huì)自己跳轉(zhuǎn)
* 到這里,比如system_call
*/
DISABLE_INTERRUPTS(CLBR_ANY)
/*判斷是否可以搶占*/
cmpl $0,TI_preempt_count(%ebp) # non-zero preempt_count ?
/*搶占計(jì)數(shù)非0,不能搶占,則不產(chǎn)生調(diào)度,直接恢復(fù)上下文*/
jnz restore_all
/*可以搶占,則需要調(diào)度*/
need_resched:
/*判斷need_resched是否被設(shè)置*/
movl TI_flags(%ebp), %ecx # need_resched set ?
testb $_TIF_NEED_RESCHED, %cl
/*沒(méi)設(shè)置need_resched,則不需要調(diào)度,直接恢復(fù)上下文*/
jz restore_all
/*
*判斷發(fā)生中斷時(shí)(因?yàn)镻T_EFLAGS(%esp)中保存的是進(jìn)入中斷時(shí)的EFLAGS值,這是由CPU硬件自動(dòng)壓棧的,中斷走中斷門,會(huì)自動(dòng)關(guān)中斷,異常走陷阱門,不自動(dòng)關(guān)中斷)是否關(guān)中斷了,如果關(guān)了,表示是異常上下文?(應(yīng)該是中斷吧),則直接恢復(fù)上下文。
*/
testl $X86_EFLAGS_IF,PT_EFLAGS(%esp) # interrupts off (exception path) ?
jz restore_all
/*如果沒(méi)關(guān)中斷,表示為中斷上下文?則調(diào)用preempt_schedule_irq,進(jìn)行調(diào)度*/
call preempt_schedule_irq
jmp need_resched
END(resume_kernel) |
|