• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            那誰的技術博客

            感興趣領域:高性能服務器編程,存儲,算法,Linux內核
            隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
            數據加載中……

            linux內核V2.6.11學習筆記(5)--異常處理

            這里以除0錯誤這個異常來講解異常處理的機制.

            1) 注冊異常處理函數
            在系統初始化的時候,調用trap_init函數注冊異常處理函數.
            這個函數里調用set_trap_gate(0,&divide_error);注冊除0錯誤的異常由divide_error函數處理,而這個錯誤的中斷向量號是0.

            2) 當異常被觸發時,調用原先注冊的divide_error函數.
            這個函數的實現的Entry.S文件中:
            ENTRY(divide_error)
                pushl $
            0            # no error code
                pushl $do_divide_error
                ALIGN
            error_code:
                pushl 
            %ds
                pushl 
            %eax
                xorl 
            %eax, %eax
                pushl 
            %ebp
                pushl 
            %edi
                pushl 
            %esi
                pushl 
            %edx
                decl 
            %eax            # eax = -1
                pushl 
            %ecx
                pushl 
            %ebx
                cld
                movl 
            %es, %ecx
                movl ES(
            %esp), %edi        # get the function address
                movl ORIG_EAX(
            %esp), %edx    # get the error code
                movl 
            %eax, ORIG_EAX(%esp)
                movl 
            %ecx, ES(%esp)
                movl $(__USER_DS), 
            %ecx
                movl 
            %ecx, %ds
                movl 
            %ecx, %es
                movl 
            %esp,%eax            # pt_regs pointer
                call 
            *%edi
                jmp ret_from_exception
            首先,它將真正的處理函數do_divide_error壓入棧中,其實,對于每個異常而言,真正的處理函數都是名為"do_注冊函數"的函數.
            緊跟著,將一些需要保存的寄存器也壓入棧中.
            接著,由于處理函數的地址已經在edi寄存器中了,調用call *%edi調用處理函數.
            當處理完畢之后,調用函數ret_from_exception從異常處理中返回.

            上面是大致的流程,下面詳細看看do_divide_error函數做了什么.
            這個函數的實現在文件trap.c中:
            #define DO_VM86_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
            fastcall 
            void do_##name(struct pt_regs * regs, long error_code) \
            { \
                siginfo_t info; \
                info.si_signo 
            = signr; \
                info.si_errno 
            = 0; \
                info.si_code 
            = sicode; \
                info.si_addr 
            = (void __user *)siaddr; \
                
            if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
                                    
            == NOTIFY_STOP) \
                    
            return; \
                do_trap(trapnr, signr, str, 
            1, regs, error_code, &info); \
            }

            DO_VM86_ERROR_INFO( 
            0, SIGFPE,  "divide error", divide_error, FPE_INTDIV, regs->eip)
            可以看到,最終這個函數會走到do_trap函數中,接著看這個函數中的代碼片段:
                trap_signal: {
                    
            struct task_struct *tsk = current;
                    tsk
            ->thread.error_code = error_code;
                    tsk
            ->thread.trap_no = trapnr;
                    
            if (info)
                        force_sig_info(signr, info, tsk);
                    
            else
                        force_sig(signr, tsk);
                    
            return;
                }
            首先得到當前進程的指針,在進程結構體的thread結構體中保存error_code和trapnr,也就是錯誤號和中斷向量.
            接著調用force_sig_info函數,可以跟進這個函數,其實最終要做的就是將該異常以信號量的形式加入到當前進程的信號集合中,也就是給當前進程發送信號,告訴進程有異常被觸發了,需要處理.以除0錯誤來看,這個信號量是SIGFPE.



            posted on 2009-04-29 21:45 那誰 閱讀(3250) 評論(0)  編輯 收藏 引用 所屬分類: linux kernel

            少妇被又大又粗又爽毛片久久黑人 | 99久久国产亚洲高清观看2024 | 国产午夜精品久久久久九九电影| 国产精品美女久久久久AV福利| 久久久久97国产精华液好用吗| 久久人人爽人人爽人人片AV不 | 国产精品99久久免费观看| 久久精品国产91久久综合麻豆自制| 国产日韩欧美久久| 色综合久久久久久久久五月| 久久亚洲欧美日本精品| 国产欧美久久久精品影院| 99久久er这里只有精品18| 青青久久精品国产免费看| 久久久久久久97| 久久露脸国产精品| 美女写真久久影院| 久久国产色AV免费看| 亚洲国产成人精品女人久久久 | 久久人人爽人人爽人人AV东京热 | 伊人久久无码精品中文字幕| 韩国三级大全久久网站| 奇米影视7777久久精品人人爽| 久久久久国产一级毛片高清版| 狠狠色婷婷久久综合频道日韩| 国产精品美女久久久免费| 99久久精品午夜一区二区| 精品一二三区久久aaa片| 亚洲国产成人久久笫一页| 国产成人无码精品久久久免费 | 久久久久久久久波多野高潮| 亚洲国产精品综合久久一线| 999久久久免费国产精品播放| 99精品国产综合久久久久五月天| 久久天天躁狠狠躁夜夜av浪潮 | 97久久精品无码一区二区| 久久亚洲国产精品成人AV秋霞| 欧美大战日韩91综合一区婷婷久久青草 | 久久99精品国产麻豆| 99国产精品久久| 国产综合成人久久大片91|