《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;"> </p>
<p><span style="font-size:18px;">三、异常处理</span></p>
<p><span style="font-size:18px;"> 以出现用户模式(异常级别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;"> 对于用户模式(异常级别0)下生成的同步异常,入口是el0_sync。该入口函数在arch/arm64/kernel/entry.s中</span></p>
<p><span style="font-size:18px;">通过上面代码,跳到对应的异常处理函数, </span></p>
<p><span style="font-size:18px;">其中:访问数据时生成的页错误异常,通过( b.eq el0_da //调用el0_da )这行代码,进入 el0_da 函数。</span></p>
<p><span style="font-size:18px;">下面为 el0_da 函数代码</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 << 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;"> 通过do_mem_abort( ) 函数将异常信息进行处理。</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> <p>已下载学习了,谢谢楼主的介绍。<img height="50" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/wanwan21.gif" width="63" /></p>
风尘流沙 发表于 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>
<p>表示没有看懂,看着不像ARM或者X86</p>
T_T1111 发表于 2025-1-16 20:29
表示没有看懂,看着不像ARM或者X86
<p>我写的不全,另外Linux内核确实比较难。</p>
水手勇敢 发表于 2025-1-16 21:38
我写的不全,另外Linux内核确实比较难。
<p>一个模块一个模块地啃还是可以搞懂,只是linux内核太大了,内容太多了,没书完全不知道从哪开始啃</p>
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]