水手勇敢 发表于 2025-1-14 12:52

《Linux内核深度解析》-异常处理

<div class='showpostmsg'><p style="text-align: center;"><span style="font-size:18px;">《Linux内核深度解析》-异常处理</span></p>

<p><span style="font-size:18px;">一、异常级别</span></p>

<div style="text-align: center;"></div>

<p><span style="font-size:18px;">二、异常分类</span></p>

<p><span style="font-size:18px;">异常分为同步异常和异步异常。如下图所示</span></p>

<p style="text-align: center;">&nbsp;</p>

<p><span style="font-size:18px;">三、异常处理</span></p>

<p><span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;以出现用户模式(异常级别0)下访问数据时生成的页错误异常为例。</span></p>

<pre>
<code>el0_sync:
        kernel_entry 0
        mrs        x25, esr_el1                        // read the syndrome register
        lsr        x24, x25, #ESR_EL1_EC_SHIFT        // exception class
        cmp        x24, #ESR_EL1_EC_SVC64                // SVC in 64-bit state
        b.eq        el0_svc
        cmp        x24, #ESR_EL1_EC_DABT_EL0        // data abort in EL0
        b.eq        el0_da                   //调用el0_da   
        cmp        x24, #ESR_EL1_EC_IABT_EL0        // instruction abort in EL0
        b.eq        el0_ia
        cmp        x24, #ESR_EL1_EC_FP_ASIMD        // FP/ASIMD access
        b.eq        el0_fpsimd_acc
        cmp        x24, #ESR_EL1_EC_FP_EXC64        // FP/ASIMD exception
        b.eq        el0_fpsimd_exc
        cmp        x24, #ESR_EL1_EC_SYS64                // configurable trap
        b.eq        el0_undef
        cmp        x24, #ESR_EL1_EC_SP_ALIGN        // stack alignment exception
        b.eq        el0_sp_pc
        cmp        x24, #ESR_EL1_EC_PC_ALIGN        // pc alignment exception
        b.eq        el0_sp_pc
        cmp        x24, #ESR_EL1_EC_UNKNOWN        // unknown exception in EL0
        b.eq        el0_undef
        cmp        x24, #ESR_EL1_EC_BREAKPT_EL0        // debug exception in EL0
        b.ge        el0_dbg
        b        el0_inv</code></pre>

<p><span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;对于用户模式(异常级别0)下生成的同步异常,入口是el0_sync。该入口函数在arch/arm64/kernel/entry.s中</span></p>

<p><span style="font-size:18px;">通过上面代码,跳到对应的异常处理函数,&nbsp;</span></p>

<p><span style="font-size:18px;">其中:访问数据时生成的页错误异常,通过(&nbsp; &nbsp;b.eq&nbsp;&nbsp; &nbsp;el0_da &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //调用el0_da&nbsp; &nbsp;)这行代码,进入&nbsp; &nbsp;el0_da&nbsp; &nbsp;函数。</span></p>

<p><span style="font-size:18px;">下面为&nbsp;el0_da&nbsp; &nbsp;函数代码</span></p>

<pre>
<code>el0_da:
        /*
       * Data abort handling
       */
        mrs        x26, far_el1    //获取数据的虚拟地址
        // enable interrupts before calling the main handler
        enable_dbg_and_irq    //开启调试异常和中断
        ct_user_exit
        bic        x0, x26, #(0xff &lt;&lt; 56)
        mov        x1, x25
        mov        x2, sp
        bl        do_mem_abort   //调用do_mem_abort函数
        b        ret_to_user
</code></pre>

<p><span style="font-size:18px;">&nbsp; &nbsp;通过do_mem_abort(&nbsp; ) 函数将异常信息进行处理。</span></p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

风尘流沙 发表于 2025-1-14 14:35

<p>已下载学习了,谢谢楼主的介绍。<img height="50" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/wanwan21.gif" width="63" /></p>

水手勇敢 发表于 2025-1-14 15:38

风尘流沙 发表于 2025-1-14 14:35
已下载学习了,谢谢楼主的介绍。

<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/handshake.gif" width="48" />共同进步</p>

T_T1111 发表于 2025-1-16 20:29

<p>表示没有看懂,看着不像ARM或者X86</p>

水手勇敢 发表于 2025-1-16 21:38

T_T1111 发表于 2025-1-16 20:29
表示没有看懂,看着不像ARM或者X86

<p>我写的不全,另外Linux内核确实比较难。</p>

oxlm_1 发表于 2025-1-17 09:23

水手勇敢 发表于 2025-1-16 21:38
我写的不全,另外Linux内核确实比较难。

<p>一个模块一个模块地啃还是可以搞懂,只是linux内核太大了,内容太多了,没书完全不知道从哪开始啃</p>

水手勇敢 发表于 2025-1-17 10:57

oxlm_1 发表于 2025-1-17 09:23
一个模块一个模块地啃还是可以搞懂,只是linux内核太大了,内容太多了,没书完全不知道从哪开始啃

<p>操作系统要坚持看,睡觉前比起床前进步一点点,极少成多,慢慢就有感觉了。这种知识不是一会半会的功夫。<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/handshake.gif" width="48" /></p>
页: [1]
查看完整版本: 《Linux内核深度解析》-异常处理