——————————————————————异常 背景——————————————————————
上面说了一大篇,对主题的意义就是表述清楚一件事:异常,使指令流直接在CPU上执行而不会劫持CPU。
而我认为这是所谓CPU支持虚拟化的关键点,同样是系统调用的关键点(内核保护自己的保障,MMU也应该算在内,另说)。
另外:
Aarch64将异常划分了等级,我就不絮叨了,然后aarch32/aarch64的执行状态也被我扔掉了aarch32的部分。
两阶段MMU的问题已经絮叨的非常完备,同样被我作为默认已知条件了。
EL3并没有太复杂的设计(其实是我没去搞清楚),我也作为已知条件来说了。
——————————————————————异常之同步与异步——————————————————————
在说异常之前,还要给出两个定义,同步异常和异步异常。
或许我们能想到同步异常和异步异常分别是什么东西,但是从阅读指令集得到的结果看,这里面有更深入的东西在。
先说同步异常,同步异常是精确异常(precise exception),何为同步异常?又何为精确异常呢?
首先,当同步异常产生后,指令流会立刻进入异常处理流程,
是的,是立刻,立刻到什么程度?
立刻到指令执行完,甚至是尝试执行指令,产生了异常就去处理异常了。
这是同步异常。
啥要叫精确异常呢?
精确,意味着此异常发生时(注意,大招要来了):乱序且并发执行的指令们会被整理好,就好像没有乱序并行的执行一样(这回引出另外一个超标量体系架构的问题,请自行搜索了)。
在此,我就不写more than one single-copy atomic memory access的细节(主要没搞明白),
需要指出的一点就是,LDP/STP等指令会不止一次访存;
如果load/store指令指定会写新基址时抛出异常后,基址会被改回原值;
如果指令要加载到基址/偏移寄存器时抛出异常,基址/偏移寄存器会被改回原值,并且所有目标寄存器都变为未知;
如果指令不是加载基址/偏移寄存器,但抛出了异常,仅目标寄存器变未知)。
如果所生成的异常是more than one single-copy atomic memory access的一部分产生的,
那么,精确定义允许寄存器中的值或受指令影响的内存可以是未知的
(这段我是原文译过来的,我的理解是为了能够做崩溃转存或是打印崩溃信息,
这些位置的数据虽然是不对的,但是打印的时候必然会访问它们,
如果访问的时候抛出异常,那就死循环或打不出来了,
于是虽然数据不对,但是允许访问,但是我不是非常确定我的理解正确性)。
对于同步异常,还有一个问题,哪些异常是同步异常?
首先,在前言中提到的SVC,即发生syscall的指令的执行(EL0->EL1),即为同步异常;
从EL1向EL2发出的hypercall同样是同步异常,
同步异常超级强大的响应速度(立刻!)为基于大量系统调用的宏内核结构提供了效率上的支持,
微内核一直想做的都是用用户态进程来提供服务,以替代内核提供syscall,
我只能表示虽然长得美,但是想的更美
(当然,我并非认为微内核不会取代宏内核,
相反,我非常坚定地认为微内核会取代宏内核,
我有多个关键且合理的理由以及能解决两个问题方法,但我没有解决所有我看到的问题的方法
所有我就不说了(等有人提出解决方法,我就说我也想到了,奸笑))。
HVC即hypercall与syscall一样是同步异常,飞快飞快的。
其他还有很多同步异常,如指令中止、数据中止(这些都是MMU搞得事情),
还有一些错误产生的异常,
如执行未定义指令、PSTATE.IL置1时还想执行指令、SP未对齐、PC未对齐、
低异常等级下执行了高异常等级的指令、调适异常、浮点异常、外部中止等等。
然后对于异步异常:
异步异常比较好说,主要是从外部发送给PE的信号们,SError、IRQ、FIQ等。
在EL1中还有vSError、vIRQ、vFIQ等,这些都是在EL2下可以触发的,
也可以在EL2直接映射到物理中断,当然SError对应vSError,IRQ对应vIRQ,FIQ对应vFIQ。
EL1被ARM定义为内核应该在的异常等级,内核的虚拟CPU肯定是会被调度到等待状态的,当
虚拟CPU正在CPU上执行的时候,这些vXXX中断发生后,会直接给到虚拟CPU,
当然,这中间还有vGIC的事儿,
但如果内核的虚拟CPU不在执行中,当其被投入运行的时候就会给入vXXX中断。
在本文之前版本中有一个隐式的错误:
我虽没有明确的指出同步异常即为精确异常,异步异常为非精确异常,但行文上下给出了这一错误暗示;
因此给出明确的澄清:
同步异常是精确地,这没问题;但是异步异常并不是非精确异常,在仔细的再次查阅指令集后,
指令集中非精确异常仅在SError中断IMPLEMENTATION DEFINEED(厂商实现决定)的时候才存在。
但有一点是明确的,异步异常可以是非精确的,但我认为异步异常大多是精确地。
另外,本文中如有任何错误,请立刻毫不犹豫的迅速的联系我。我收到消息后会立刻给出回复,并修正或给出解释。