亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 2288 | 回復(fù): 3
打印 上一主題 下一主題

[FreeBSD] [原創(chuàng)]Freebsd22的中斷處理過(guò)程,有誰(shuí)看匯編嗎? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2005-12-13 11:58 |只看該作者 |倒序?yàn)g覽
這是基于Freebsd2_2版本的中斷處理過(guò)程,到5.x后好象改成線程了,沒(méi)有了這些古老的代碼.寫出來(lái)的原因是因?yàn)椴恢欠窭斫獾恼_,希望大家批評(píng)指正,以后我不會(huì)看代碼了,一方面是太辛苦,另一方面是沒(méi)從這些知識(shí)中看到前(錢)途,雖然不會(huì)沒(méi)飯吃,工作也很穩(wěn)定,很閑 ,但對(duì)家庭來(lái)說(shuō)還是沒(méi)有幫助,興趣將轉(zhuǎn)向厚黑學(xué),哈哈.生活就是這樣.

_cpl 其初值是全'0xFFFFFFFF' ,all off 屏蔽所有的中斷.系統(tǒng)初始化完成后將調(diào)用spl0()從而開(kāi)放所
有中斷,此時(shí)cpl將是"0".一個(gè)中斷進(jìn)入處理之前會(huì)置相應(yīng)的位為'1' ,同時(shí)也要把之前的cpl保存,一般是保存在STACK中到doreti再處理,cpl 中0-15位對(duì)應(yīng)8259A的硬件中斷,16-31是軟中斷用.

_ipending是OS的全局變量是interrupt pending 意思是還沒(méi)處理的中斷,其初值是'0',如果低優(yōu)先級(jí)的中斷在高優(yōu)先級(jí)中斷開(kāi)放中斷(sti)處理時(shí)得到響應(yīng)會(huì)在ipending中相應(yīng)地方置位,不進(jìn)行中斷服務(wù)程序的處理就退回到高優(yōu)先級(jí)中斷處理過(guò)程.

u_int intr_mask[ICU_LEN]  “sets of intrs masked during handling of 1”這是英文注解,對(duì)應(yīng)某一中斷的中斷屏蔽集,這個(gè)變量我是花了不少時(shí)間但是還是看不懂,希望有朋友給說(shuō)說(shuō),我只是猜測(cè)一個(gè)我認(rèn)為合理的解釋.每個(gè)硬件中斷都應(yīng)該在ipl中把比它優(yōu)先級(jí)低的中斷屏蔽,這樣的目的是為了高優(yōu)先級(jí)中斷能在適當(dāng)?shù)臅r(shí)候注意到有低優(yōu)先級(jí)的中斷發(fā)生了,從而能把低優(yōu)先級(jí)中斷掛在ipending中而不至于被低優(yōu)先級(jí)中斷,等到高優(yōu)先級(jí)中斷結(jié)束時(shí)低優(yōu)先級(jí)中斷得到處理.cpl中從0-31位優(yōu)先級(jí)遞增,最高是0,最低是31位對(duì)應(yīng)的中斷,硬中斷比軟中斷優(yōu)先級(jí)高,比如中斷7的是intr_mask[7]
=0xffffff80,0到6位的優(yōu)先級(jí)比7要高所以是不能屏蔽的,8到31位對(duì)應(yīng)的中斷優(yōu)先級(jí)比7低所以會(huì)屏蔽.中斷7本身也屏蔽,由于中斷并不是用完所有的32位,所以為了減少無(wú)用的處理,沒(méi)有和中斷聯(lián)系的位將不會(huì)是’1’而是’0’.

中斷處理(包括TRAP)一般是通過(guò)_doreti退出,在進(jìn)入doreti前都會(huì)在STACK中壓入這次中斷前的cpl和向量號(hào).
static inthand_t *fastintr[ICU_LEN] = {
        &IDTVEC(fastintr0), &IDTVEC(fastintr1),
        . . .
        &IDTVEC(fastintr14), &IDTVEC(fastintr15)
}

static inthand_t *slowintr[ICU_LEN] = {
        &IDTVEC(intr0), &IDTVEC(intr1), &IDTVEC(intr2), &IDTVEC(intr3),
        . . .
        &IDTVEC(intr12), &IDTVEC(intr13), &IDTVEC(intr14), &IDTVEC(intr15)
}

fastintrXX和intrXX在i386isavectors.s 里定義,象時(shí)鐘中斷,硬盤中斷采用FAST_INTR.以下是宏定義和解釋.

#define FAST_INTR(irq_num, vec_name, enable_icus)
        .text  
        SUPERALIGN_TEXT  
IDTVEC(vec_name)  
        pushl   %eax         
        pushl   %ecx  
        pushl   %edx  
        pushl   %ds        保護(hù)現(xiàn)場(chǎng),快速中斷只保護(hù)部分現(xiàn)場(chǎng).
        MAYBE_PUSHL_ES  
        movl    $KDSEL,%eax  
        movl    %ax,%ds     ds選擇符指向系統(tǒng)數(shù)據(jù)段
      MAYBE_MOVW_AX_ES  
        FAKE_MCOUNT((4+ACTUALLY_PUSHED)*4(%esp))  可能是時(shí)間片的統(tǒng)計(jì),沒(méi)細(xì)看
        pushl   _intr_unit + (irq_num) * 4  壓入中斷號(hào)做參數(shù)
        call    *_intr_handler + (irq_num) * 4  * 調(diào)用中斷服務(wù)處理程序 *
        enable_icus  * 使中斷控制器進(jìn)行工作,如選出高優(yōu)先級(jí)中斷,但現(xiàn)在CPU不會(huì)響應(yīng) *
        addl    $4,%esp  恢復(fù)STACK
        incl    _cnt+V_INTR    * 應(yīng)該是系統(tǒng)的中斷統(tǒng)計(jì) *
        movl    _intr_countp + (irq_num) * 4,%eax  *針對(duì)某中斷的統(tǒng)計(jì)*
        incl    (%eax)  
        movl    _cpl,%eax      
        notl    %eax  
        andl    _ipending,%eax  這個(gè)比較的意思是看是否有沒(méi)被處理的中斷
     jne     2f   
1:  
     MEXITCOUNT  
        MAYBE_POPL_ES  
        popl    %ds  
        popl    %edx  
        popl    %ecx  
        popl    %eax  
        iret  

2:   處理掛起的中斷,包括硬中斷和軟中斷
        cmpb    $3,_intr_nesting_level         * 限制中斷嵌套數(shù),防止棧溢出 *
        jae     1b              超過(guò)將中斷返回
        movl    _cpl,%eax  
        movl    $HWI_MASK|SWI_MASK,_cpl
        incb    _intr_nesting_level   
        sti      開(kāi)中斷,前面enable_icus后中斷控制器選出的中斷無(wú)論優(yōu)先級(jí)如何都得到CPU的響應(yīng),但不一定得到處理,可能只是被掛在ipending中.
        MAYBE_POPL_ES         
        popl    %ecx           
        popl    %edx  
        xchgl   %eax,4(%esp)   
        pushal                 
        pushl   %ecx        
        pushl   %es  
        movl    $KDSEL,%eax  
        movl    %ax,%es  
        movl    (2+8+0)*4(%esp),%ecx  
        movl    %ecx,(2+6)*4(%esp)     
        movl    (2+8+1)*4(%esp),%eax   
        pushl   %eax  
        subl    $4,%esp      

       * Sti開(kāi)中斷后到這里的指令是構(gòu)造一個(gè)統(tǒng)一的棧禎(stack frame)以方便進(jìn)入doreti中 *
        MEXITCOUNT  系統(tǒng)的時(shí)間片統(tǒng)計(jì).
        jmp     _doreti

#define INTR(irq_num, vec_name, icu, enable_icus, reg)
  
IDTVEC(vec_name)  
        pushl   $0   
        pushl   $0
        pushal      保存通用寄存器,eax,ebx,ecx,edx,ebp. . .
        pushl   %ds            
        pushl   %es  到這里所有的寄存器都保存在堆棧中了.
        movl    $KDSEL,%eax   
        movl    %ax,%ds        
        movl    %ax,%es  
以下的四條匯編是為了在8259中把當(dāng)前中斷的中斷位 置位以屏蔽當(dāng)前中斷
     movb    _imen + IRQ_BYTE(irq_num),%al  
       orb     $IRQ_BIT(irq_num),%al        
       movb    %al,_imen + IRQ_BYTE(irq_num)  
      outb    %al,$icu+ICU_IMR_OFFSET        
        enable_icus   使中斷控制器(8259)正常工作以選出優(yōu)先級(jí)最高的中斷給CPU      
        movl    _cpl,%eax  
        testb   $IRQ_BIT(irq_num),%reg  
        jne     2f  

跳轉(zhuǎn)的條件是cpl中的相應(yīng)位被置'1',也就是該中斷被屏蔽,因此要把中斷掛在ipending,這個(gè)被掛起的中斷應(yīng)該是比當(dāng)前正在處理的中斷優(yōu)先級(jí)有低.
        incb    _intr_nesting_level  

__CONCAT(Xresume,irq_num): 被掛起的中斷得到處理的時(shí)候都是從這里開(kāi)始的
     FAKE_MCOUNT(12*4(%esp))        
        incl    _cnt+V_INTR   
        movl    _intr_countp + (irq_num) * 4,%eax  
        incl    (%eax)  
        movl    _cpl,%eax  
        pushl   %eax  用于傳遞給doreti
        pushl   _intr_unit + (irq_num) * 4  
        orl     _intr_mask + (irq_num) * 4,%eax  提升優(yōu)先級(jí)的地方.
        movl    %eax,_cpl  設(shè)置當(dāng)前中斷的cpl
        sti  開(kāi)中斷.8259中斷控制器選出的中斷從這里開(kāi)始將得到CPU的注意
      call    *_intr_handler + (irq_num) * 4  
        cli                    
         
        以下的四條匯編的目的是把8259中中斷進(jìn)入時(shí)被屏蔽的當(dāng)前中斷打開(kāi)

     movb    _imen + IRQ_BYTE(irq_num),%al  
        andb    $~IRQ_BIT(irq_num),%al     
        movb    %al,_imen + IRQ_BYTE(irq_num)        
        outb    %al,$icu+ICU_IMR_OFFSET  
        sti                    
        MEXITCOUNT  時(shí)間片計(jì)數(shù)
      
        jmp     _doreti  

2:  
         orb     $IRQ_BIT(irq_num),_ipending + IRQ_BYTE(irq_num)  把中斷掛在ipending中
     popl    %es  
        popl    %ds  
        popal  
        addl    $4+4,%esp  
        iret 中斷返回,在這里一般是返回更高優(yōu)先級(jí)的中斷,繼續(xù)高優(yōu)先級(jí)中斷的處理.

[ 本帖最后由 bhpang2 于 2005-12-13 13:00 編輯 ]

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2005-12-13 12:02 |只看該作者
以下都是硬件中斷的匯編處理過(guò)程.
MCOUNT_LABEL(bintr)
        FAST_INTR(0,fastintr0, ENABLE_ICU1)
       . . .
        FAST_INTR(8,fastintr8, ENABLE_ICU1_AND_2)
        . . .
        FAST_INTR(15,fastintr15, ENABLE_ICU1_AND_2)
        INTR(0,intr0, IO_ICU1, ENABLE_ICU1, al)
       . . .
        INTR(7,intr7, IO_ICU1, ENABLE_ICU1, al)
        INTR(8,intr8, IO_ICU2, ENABLE_ICU1_AND_2, ah)
        . . .
        INTR(15,intr15, IO_ICU2, ENABLE_ICU1_AND_2, ah)
MCOUNT_LABEL(eintr)
_ihandlers:
ihandlers:                  
        .long   Xresume0, Xresume1, Xresume2, Xresume3
        .long   Xresume4, Xresume5, Xresume6, Xresume7
        .long   Xresume8, Xresume9, Xresume10, Xresume11
        .long   Xresume12, Xresume13, Xresume14, Xresume15
        .long   swi_tty, swi_net, dummycamisr, dummycamisr
        .long   _swi_vm, 0, 0, 0
        .long   0, 0, 0, 0
        .long   0, 0, _softclock, swi_ast

設(shè)備的中斷處理過(guò)程通過(guò)涵數(shù)register_intr(...)調(diào)用setidt(...)和中斷描述表聯(lián)系起來(lái),并把處理涵數(shù)放在數(shù)組*intr_handler[]里,這是一個(gè)涵數(shù)指針. 最終的處理涵數(shù)指針是在intr_handler[]里,在中斷的匯編處理過(guò)程通過(guò)call 指令調(diào)用.

快速中斷和一般中斷的不同有兩方面,首先是現(xiàn)場(chǎng)的保護(hù)內(nèi)容,一般中斷保護(hù)所有的寄存器內(nèi)容,快速中斷只保護(hù)用到的部分寄存器內(nèi)容,因?yàn)樗奶幚磉^(guò)程不開(kāi)中斷.其次是開(kāi)中斷的時(shí)機(jī)不同,快速中斷執(zhí)行完中斷處理后如果沒(méi)有被掛起的中斷是不開(kāi)中斷就返回的,也就是說(shuō)快速中斷是不會(huì)被掛起的,一般中斷在進(jìn)入中斷處理前開(kāi)中斷.

下面是中斷返回前的部分代碼,主要工作是處理被掛在ipending中的軟硬中斷.
_doreti:
        FAKE_MCOUNT(_bintr)            
        addl    $4,%esp                 
        popl    %eax               

這是本次中斷之前的cpl值,這個(gè)優(yōu)先級(jí)比當(dāng)前中斷的優(yōu)先級(jí)低.
doreti_next:
        movl    %eax,%ecx
        notl    %ecx
        正是因?yàn)橛弥袛嗲暗腸pl才能處理比當(dāng)前優(yōu)先級(jí)低的掛起的中斷,如果采用當(dāng)前中斷的cpl,當(dāng)前cpl的值是從當(dāng)前中斷位直到31位都是’1’,指令notl %ecx后比當(dāng)前中斷優(yōu)先級(jí)低的中斷位將是’0’,后面的指令andl    _ipending,%ecx的結(jié)果將導(dǎo)致低優(yōu)先級(jí)掛起中斷的不到處理就退出了.在中斷嵌套中這種優(yōu)先級(jí)逐步提高后,逐步降低過(guò)程中被掛起的中斷將按優(yōu)先級(jí)由高到低得到處理,最終cpl的值變成’0’,所有的掛起中斷都能得到處理后才結(jié)束中斷處理過(guò)程.
        cli
        andl    _ipending,%ecx  * ipending放有被掛起的中斷 *
        jne     doreti_unpend   如果有不被ipl屏蔽的掛起中斷將得到處理
doreti_exit:
        movl    %eax,_cpl   恢復(fù)本次中斷之前的cpl值,一般導(dǎo)致中斷優(yōu)先級(jí)降低.
        decb    _intr_nesting_level
        MEXITCOUNT
        .globl  doreti_popl_es
doreti_popl_es:              
        popl    %es
        .globl  doreti_popl_ds
doreti_popl_ds:
        popl    %ds
        popal                 恢復(fù)現(xiàn)場(chǎng).
        addl    $8,%esp      
        .globl  doreti_iret
doreti_iret:
        iret   所有的都處理完了,中斷返回
doreti_unpend:
        sti
        bsfl    %ecx,%ecx     

從右到左找出第一個(gè)置’1’的位,并把位置值放ecx,優(yōu)先級(jí)別也是從右到左提高的
遵循著高優(yōu)先級(jí)首先處理的原則.

        btrl    %ecx,_ipending   
        檢查ipending中的該位是否是’1’,同時(shí)該位清零
      如果該位是’1’就意味著有掛起的中斷.
         重復(fù)這過(guò)程,直到ipending中所有的位都是’0’才結(jié)束

     jnc     doreti_next        不是’1’就轉(zhuǎn)移
     movl    ihandlers(,%ecx,4),%edx
        testl   %edx,%edx
        je      doreti_next            
        cmpl    $NHWI,%ecx
        jae     doreti_swi     進(jìn)行軟件中斷處理.
        cli
        movl    %eax,_cpl
        MEXITCOUNT
        jmp     %edx  
將跳轉(zhuǎn)到一般中斷的__CONCAT(Xresume,irq_num)開(kāi)始的地方,最后也會(huì)回到doreti中.

doreti_swi:    軟件中斷處理部分.
        pushl   %eax
         orl     imasks(,%ecx,4),%eax   
        movl    %eax,_cpl     
        call    %edx          調(diào)用軟件中斷處理,如大家熟識(shí)的TCPIP協(xié)議處理
        popl    %eax
        jmp     doreti_next

[ 本帖最后由 bhpang2 于 2005-12-13 12:57 編輯 ]

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2005-12-13 14:37 |只看該作者
LZ真執(zhí)著呢

論壇徽章:
1
技術(shù)圖書徽章
日期:2013-12-05 23:25:45
4 [報(bào)告]
發(fā)表于 2005-12-13 14:53 |只看該作者
在大學(xué)的時(shí)候小小的研究過(guò)。

因?yàn)槲覀冏鰡纹瑱C(jī),中斷用的很多,不是BSD這樣子的。不過(guò)好像遠(yuǎn)離都類似,就是硬中斷和軟中斷
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP