CPU的自我控制之(3)-异常的同步与异步

——————————————————————异常 背景——————————————————————

 

上面说了一大篇,对主题的意义就是表述清楚一件事:异常,使指令流直接在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(厂商实现决定)的时候才存在。

但有一点是明确的,异步异常可以是非精确的,但我认为异步异常大多是精确地。

另外,本文中如有任何错误,请立刻毫不犹豫的迅速的联系我。我收到消息后会立刻给出回复,并修正或给出解释。

 

你可能感兴趣的:(指令集,同步/异步异常)