Jailhouse虚拟化与异构多核框架在实时边缘计算中的融合实践
1. 项目概述:异构多核与虚拟化在实时边缘计算中的融合实践
在工业控制、汽车电子和高端消费电子领域,我们常常面临一个核心矛盾:系统既要运行功能丰富的通用操作系统(如Linux)来处理复杂的网络协议栈、图形界面或文件系统,又要保证某些关键任务(如电机控制、传感器数据采集、实时通信)的确定性和微秒级响应。传统的单核或同构多核方案往往难以兼顾这两方面需求,要么实时性不足,要么功能过于单一。
NXP的实时边缘软件(Real-time Edge Software)及其异构多核框架,正是为解决这一矛盾而生。它基于一个非常直观的理念:“让专业的核心做专业的事”。具体来说,就是将高性能的Cortex-A核心分配给Linux,处理复杂的非实时任务;而将低功耗、确定性强的Cortex-M核心,或者通过虚拟化隔离出的Cortex-A核心,分配给实时操作系统(RTOS),专攻硬实时任务。这种非对称多处理(AMP)架构,从硬件层面为实时与非实时任务的隔离与协同奠定了基础。
然而,仅有硬件隔离还不够。如何让运行在不同核心、甚至不同操作系统上的任务安全、高效地通信与共享资源,是工程落地的关键。这正是Jailhouse分区化Hypervisor和异构多核框架大显身手的地方。Jailhouse不像KVM或Xen那样追求功能的全面性,它的设计哲学是极简与确定。它不进行CPU、内存等资源的超分配,而是像一个“监狱看守”,在Linux启动后,将硬件资源(CPU核心、内存区域、外设)静态地、排他性地划分给不同的“牢房”(Cell)。这种静态分区确保了RTOS或裸机应用获得的资源是独占的,不受Linux内核调度或内存管理的任何干扰,从而提供了媲美裸机的实时性能。
本文将以NXP i.MX 8M Plus、LS1028A等主流平台为例,深入剖析如何将Jailhouse与异构多核框架结合,构建一个既强大又可靠的实时边缘计算系统。我会从底层原理、环境搭建、实操配置,一直讲到通信机制和避坑经验,目标是让你不仅能照着步骤做出来,更能理解每一步背后的设计考量。
2. Jailhouse虚拟化:原理、部署与实战
2.1 Jailhouse的设计哲学与核心机制
初次接触Jailhouse,你可能会疑惑:既然已经有了Linux,为什么还要一个Hypervisor?Jailhouse的定位非常独特,它不是一个用来创建大量虚拟机的通用虚拟化平台,而是一个系统分区管理器。
它的工作流程可以这样理解:
- Linux先行:系统正常启动一个完整的Linux。此时,Linux掌控所有硬件资源。
- Jailhouse激活:通过内核模块加载Jailhouse。Jailhouse会初始化硬件虚拟化支持(如ARM的GIC、SMMU),但它自己并不运行任何客户机。
- 静态分区:通过Jailhouse提供的用户空间工具(如
jailhouse命令),你编写一个“单元配置”(Cell Configuration)。这个配置文件以纯文本形式,精确地定义:- CPU:将哪几个物理CPU核心分配给新单元(Inmate Cell)。
- 内存:将哪几段物理内存地址空间(绝对地址)划给新单元。
- 外设:将哪些PCI设备、中断号、内存映射I/O(MMIO)区域分配给新单元。
- 单元创建:执行命令(如
jailhouse cell create my_inmate.cell),Jailhouse会根据配置,从Linux手中“夺走”指定资源的控制权,并为新单元创建一个纯净的、裸机式的执行环境。 - 加载与运行:将RTOS或裸机应用的二进制镜像加载到分配给该单元的内存中,并启动它。此时,被隔离的核心开始独立运行RTOS,与Linux核心并行不悖。
核心提示:Jailhouse的“轻量”体现在它几乎不做软件模拟。它主要依赖硬件虚拟化能力来隔离CPU和内存访问。对于无法硬件虚拟化的平台资源(如某些定时器),它才会进行最小化的软件虚拟化。这种设计使得其代码量小,运行时开销极低,中断延迟可预测。
2.2 在i.MX 8M Plus EVK上部署Jailhouse与PREEMPT_RT Linux
理论讲完,我们上手实操。以i.MX 8M Plus LPDDR4 EVK开发板为例,目标是让一个Cortex-A53核心运行Linux,另一个核心运行带PREEMPT_RT补丁的实时Linux。
2.2.1 前期准备:镜像与设备树
NXP的实时边缘软件SDK已经为我们做好了大部分集成工作。你需要确保刷写的镜像包含了Jailhouse内核模块、工具以及对应的设备树二进制文件(DTB)。
关键步骤解析:
- U-Boot引导参数:文档中提到的
run jh_mmcboot是一个U-Boot环境变量命令。它内部通常设置了正确的内核镜像地址、设备树文件(fdtfile)和启动参数。这个特定的DTB文件(如imx8mp-evk-jailhouse.dtb)至关重要,它会在内核启动早期,为Jailhouse预留出指定的内存区域(reserved-memory),并可能配置好CPU核心的启动状态,防止Linux去调度那些预留给RTOS的核心。 - 设备树的作用:设备树是描述硬件资源的蓝图。Jailhouse的单元配置需要严格与设备树中定义的资源映射对齐。例如,如果你在设备树中将
0x80000000-0x90000000这段内存标记为reserved,那么在Jailhouse的单元配置里,也必须精确地将这段内存分配给非根单元(Non-root Cell)。任何不匹配都可能导致系统崩溃或资源访问冲突。
2.2.2 启动非根单元Linux
系统从U-Boot启动,进入标准的Linux用户空间后,操作就集中在用户态了。
# 切换到Jailhouse脚本目录 cd /usr/share/jailhouse/scripts/ # 执行针对i.MX 8M Plus的Linux演示脚本 ./linux-demo-imx8mp.sh这个脚本背后做了几件关键事情:
- 加载Jailhouse内核模块:通常是
insmod jailhouse.ko。 - 启用Jailhouse:
jailhouse enable /path/to/imx8mp.cell。这个命令会初始化Hypervisor,并将配置文件里定义的“根单元”(Root Cell)资源(即留给Linux的部分)固化下来。 - 创建非根单元:
jailhouse cell create /path/to/linux-inmate.cell。这个配置文件定义了分给这个“监狱”Linux的核心(比如CPU1)、内存(比如从0xa0000000开始的512MB)以及一个虚拟的UART设备。 - 加载客户机镜像:
jailhouse cell load inmate1 /path/to/linux-rt-inmate.bin。这个镜像是一个精简的、带PREEMPT_RT补丁的Linux内核,可能还包含一个极简的ramdisk根文件系统。 - 启动客户机:
jailhouse cell start inmate1。此时,CPU1会从指定的内存地址开始执行,第二个Linux就启动了。
实操心得:串口调试运行脚本后,关键的输出不在当前终端!你需要连接开发板的第二个UART接口(文档中提到的UART4)。在这个串口终端上,你会看到第二个Linux内核的启动日志,最终出现登录提示。这是排查非根单元是否成功启动的最直接窗口。务必在实验前确认好硬件串口线的连接。
2.2.3 资源分配实战:以LS1028ARDB的ENETC和GPIO为例
文档中LS1028ARDB的例子更深入地展示了资源分配的细节。
ENETC网络控制器分配:
- 修改设备树:首先,需要通过一个特殊的DTB(
fsl-ls1028a-rdb-jailhouse-without-enetc.dtb)启动根单元Linux。这个DTB的关键在于从Linux视角“移除”了ENETC节点。这意味着Linux启动后根本看不到这个网卡,自然也不会加载它的驱动。 - 分配给非根单元:在非根单元(Inmate)的Jailhouse配置文件中,将ENETC控制器对应的PCI BDF(Bus/Device/Function)号、MMIO地址空间和MSI-X中断资源明确分配给它。
- 中断处理:这里涉及一个高级话题——GICv3 ITS(Interrupt Translation Service)。为了将物理PCIe的MSI-X中断正确地路由到非根单元,需要将GICv3 ITS节点也从根单元的设备树中移除,并分配给非根单元。这样,非根单元内的Linux或RTOS才能直接、低延迟地处理ENETC的网络中断。
GPIO控制器分配:GPIO的分配更直观地体现了“硬件直通”的思想。
- 硬件与RCW配置:首先通过硬件跳线(连接J11的特定引脚)和RCW(复位配置字,一种板级硬件配置)将相关引脚的功能复用(MUX)设置为GPIO模式。
- CPLD配置:通过I2C命令配置CPLD寄存器,确保物理信号连接到正确的GPIO引脚。
- 软件映射:在非根单元启动后,通过Linux标准的sysfs GPIO接口(
/sys/class/gpio)即可直接操作这些引脚(如gpio490、gpio491),进行输入输出测试。这证明了该GPIO控制器的所有权已完全从根单元Linux转移到了非根单元。
注意事项:资源分配是排他性的。一旦将某个外设(如ENETC、GPIO)分配给非根单元,根单元Linux将永久失去对该硬件的访问能力,直到Jailhouse被禁用、系统重启。规划资源分配时,必须仔细评估所有软件模块对硬件的依赖关系。
2.3 Jailhouse单元示例程序解析
除了运行完整的OS,Jailhouse更适合运行轻量级的裸机应用或RTOS。SDK提供的GIC、UART、ivshmem演示程序就是很好的例子。
- GIC Demo:这个演示通常是一个极简程序,它配置并触发一个虚拟中断,然后由非根单元内的中断服务程序(ISR)处理,最后通过共享内存或Hypercall通知根单元。它验证了中断虚拟化通路是否正常工作。
- UART Demo:将某个物理UART控制器分配给非根单元,然后运行一个简单的串口回显程序。这验证了外设的MMIO访问和中断处理的正确性。
- ivshmem Demo:这是Jailhouse中实现单元间高性能共享内存通信的标准机制。它会在两个单元(如根单元Linux和一个非根单元)之间建立一段共享内存区域。演示程序通常是一端写、一端读,验证数据能正确、高效地传递。
运行这些示例的命令很简单,例如在i.MX 8M Plus上:./gic-demo-imx8mp.sh。它们的价值在于,当你的自定义RTOS应用出现问题时,可以用这些标准示例来排除Jailhouse基础环境的问题。
3. 异构多核框架:通信、共享与生命周期管理
Jailhouse解决了“隔离”的问题,而NXP的异构多核框架(Heterogeneous Multicore Framework)则致力于解决“协同”的问题。它为运行在不同核心、不同OS上的应用提供了统一的通信、资源共享和生命周期管理接口。
3.1 核心功能深度解读
3.1.1 数据通信:RPMsg与VirtIO
这是多核协同的血液系统。
- RPMsg (Remote Processor Messaging):这是Linux内核中为远程处理器(如DSP、MCU)通信定义的标准框架。它基于共享内存和核间中断(IPI)实现。在异构多核框架中,RPMsg是最通用、最标准的通信方式,支持在Cortex-M RTOS、Cortex-A RTOS和Cortex-A Linux之间任意建立通信通道。文档中提到的
rpmsg_str_echo、rpmsg_pingpong就是基于此的演示。- 工作原理:两端(例如Linux端和RTOS端)各维护一套“邮箱”(VirtIO队列)。发送方将消息放入共享内存的发送邮箱,然后触发一个核间中断通知接收方。接收方处理中断,从自己的接收邮箱读取消息。Linux端有现成的
rpmsg字符设备驱动,应用层可以通过读写/dev/rpmsgX设备文件进行通信;RTOS端则有相应的客户端库。
- 工作原理:两端(例如Linux端和RTOS端)各维护一套“邮箱”(VirtIO队列)。发送方将消息放入共享内存的发送邮箱,然后触发一个核间中断通知接收方。接收方处理中断,从自己的接收邮箱读取消息。Linux端有现成的
- 异构多核VirtIO:这是NXP在标准VirtIO协议上做的优化和扩展,旨在提供比RPMsg更高的吞吐量和更低延迟。VirtIO本身是一种半虚拟化I/O协议,常用于虚拟机与宿主机之间的设备访问。这里被创新性地用于核间通信。
virtio_perf工具就是用来对比评测这两种通信机制性能的。- 优势:它允许在Linux端复用大量成熟的VirtIO设备驱动(如网络
virtio_net、块设备virtio_blk),使得RTOS为核心的服务在Linux端看起来就像一个标准的虚拟设备,大大降低了Linux端应用开发的复杂度。
- 优势:它允许在Linux端复用大量成熟的VirtIO设备驱动(如网络
3.1.2 资源共享:虚拟设备抽象
这是框架的精华所在。它不仅仅是传递数据,而是让一个OS能够使用另一个OS控制的物理硬件。
- UART共享示例:物理UART控制器由Cortex-M核心的RTOS直接驱动(裸机或通过RTOS驱动)。然后,RTOS侧运行一个“后端”服务,通过RPMsg或VirtIO通道,将串口的读写操作转化为消息。在Linux侧,框架会生成一个
tty设备(例如/dev/ttyRPMSGx),这个虚拟串口设备的驱动负责将Linux应用的read/write调用,通过通信通道转发给RTOS后端,再由RTOS操作真实硬件。这样,Linux应用可以像使用普通串口一样,透明地使用由RTOS管理的物理串口。 - 网络共享(VirtIO Networking):这是更复杂的例子。一个物理以太网控制器(如ENETC)可以完全分配给一个RTOS(运行在Cortex-M或隔离的Cortex-A上)。RTOS内实现一个轻量级TCP/IP栈(如lwIP)和VirtIO网络后端驱动。在Linux侧,会看到一个
virtio_net类型的虚拟网卡(如eth1)。Linux的所有网络数据包通过VirtIO通道传递给RTOS后端,再由RTOS通过物理网卡发送出去;反之亦然。这实现了网络接口在多个OS间的安全、高性能共享。
3.1.3 统一生命周期管理
框架提供了两种方式来启动/停止Cortex-M或Cortex-A上的RTOS,这给了开发者极大的灵活性。
- U-Boot命令(
bootaux):在系统启动的最早期,由Bootloader直接加载RTOS镜像到指定内存并启动协处理器核心。这种方式RTOS启动最早,几乎与Linux同时初始化,适合对启动时序有严格要求的场景。# 示例:在i.MX 8M Mini上从eMMC加载CM4镜像并启动 => ext4load mmc 1:2 0x48000000 /examples/heterogeneous-multicore/hello-world-freertos/hello_world_cm4.bin => cp.b 0x48000000 0x7e0000 20000 => bootaux 0x7e0000 - Linux Remoteproc:先让Linux完全启动,然后通过Linux的
remoteproc框架动态加载和启动RTOS。这提供了运行时管理的能力,可以随时重启、更新RTOS固件,而无需重启整个系统。# 在Linux中动态启动i.MX 8M Mini上的CM4 RTOS root@imx8mm-lpddr4-evk:~# echo -n /examples/heterogeneous-multicore/hello-world-freertos/hello_world_cm4.elf > /sys/devices/platform/imx8mm-cm4/remoteproc/remoteproc4/firmware root@imx8mm-lpddr4-evk:~# echo start > /sys/devices/platform/imx8mm-cm4/remoteproc/remoteproc4/state # 动态停止 root@imx8mm-lpddr4-evk:~# echo stop > /sys/devices/platform/imx8mm-cm4/remoteproc/remoteproc4/state
3.2 应用构建:Yocto与独立编译
NXP提供了两种构建RTOS应用的方式,适应不同的开发阶段。
3.2.1 使用Yocto构建(集成化)
这是最推荐的方式,尤其在产品化阶段。Yocto项目会从源码开始,构建出包含Linux根文件系统、所有RTOS应用固件、设备树、引导程序的完整镜像。
- 命令:
bitbake packagegroup-real-time-edge-rtos可以一键构建所有支持的RTOS演示程序。 - 优势:版本一致性强,所有组件(Linux内核、RTOS SDK、工具链)由Yocto统一管理,确保兼容性。构建出的镜像可以直接烧录测试。
3.2.2 独立编译(敏捷开发)
在早期算法验证或快速迭代RTOS应用时,每次都构建整个Yocto镜像太慢。这时可以使用west工具进行独立编译。
- 环境搭建:按照文档安装ARM GCC工具链、Python虚拟环境、west等。
- 获取源码:
west init和west update会拉取heterogeneous-multicore这个主仓库及其所有子模块(包括MCUXpresso SDK、Zephyr RTOS等)。 - 编译:使用
west sdk_build扩展命令或项目自带的脚本来编译特定应用。例如,在workspace目录下,可能有build_freertos_hello_world.sh这样的脚本。
- 优势:编译速度快,适合频繁修改RTOS代码。可以直接生成
.bin或.elf文件,通过U-Boot或remoteproc动态加载测试,无需重新烧录整个镜像。
避坑指南:工具链路径:独立编译时,最常见的错误是工具链路径不对。务必在编译前,通过
export命令正确设置ARMGCC_DIR或ZEPHYR_TOOLCHAIN_VARIANT等环境变量,指向你解压的ARM GCC或Zephyr SDK目录。编译脚本通常会检查这些环境变量。
4. 平台支持矩阵与选型指南
文档末尾的“支持矩阵”表格信息量巨大,是硬件选型和功能评估的宝典。我们解读一下关键信息:
横向看平台:从i.MX 8M Mini(4xA53+1xM4)到高端的i.MX 95(6xA55+1xM7),NXP的主流异构平台都已覆盖。这意味着该软件框架具有很好的可移植性和延续性。
纵向看功能:
- 基础功能:
hello_world是所有平台的标配,用于验证最基本的RTOS启动和串口输出。 - 通信能力:
rpmsg_str_echo(字符串回显)支持广泛,是测试核间通信的首选。rpmsg_pingpong用于测试RTOS与RTOS之间的通信性能。 - 网络特性:
lwip_ping和virtio_net_backend标志着平台支持RTOS侧运行网络栈并进行网络共享,这对于需要RTOS直接处理网络协议的边缘网关设备至关重要。 - 工业应用:
soem_digital_io和soem_servo直接指向工业以太网协议EtherCAT的支持,表明该框架已深入工业自动化领域。soem_servo_rt1180更是针对NXP的i.MX RT1180跨界MCU做了适配。
选型建议:
- 入门与评估:选择i.MX 8M Mini EVK。它资源丰富,社区支持好,所有基础功能都支持,是学习异构多核和Jailhouse的最佳起点。
- 高性能实时计算:选择i.MX 8M Plus EVK或i.MX 93 EVK。它们拥有更强的Cortex-A核心和更先进的Cortex-M7/M33,对RPMsg、VirtIO、网络共享的支持更全面。
- 工业网络与多网口:选择LS1028A RDB。它集成了多个高性能ENETC网络控制器,非常适合做工业交换机、网关,其Jailhouse示例中专门演示了ENETC的分配,实践价值极高。
5. 实战问题排查与性能调优
5.1 常见启动失败问题排查
Jailhouse启用失败 (
jailhouse enable报错):- 检查一:内核配置。确保运行的Linux内核编译时启用了
CONFIG_JAILHOUSE,并包含了必要的平台支持(如CONFIG_JAILHOUSE_IMX8MP)。 - 检查二:设备树预留内存。这是最常见的原因。Jailhouse需要一大段连续的物理内存给非根单元。通过
/proc/iomem查看系统内存布局,确认设备树中reserved-memory节点的地址和大小与Jailhouse单元配置文件中的定义完全一致。一个字节的偏差都会导致启用失败。 - 检查三:CPU状态。预留给非根单元的CPU核心,在Linux启动时应该被标记为“disabled”或通过
cpu-idle-states等方式让Linux不去在线(online)它。可以通过cat /sys/devices/system/cpu/offline查看离线CPU。
- 检查一:内核配置。确保运行的Linux内核编译时启用了
非根单元启动后无输出:
- 检查一:串口配置。确认你监视的串口终端(如UART4)是否正确连接,波特率是否匹配(通常是115200)。
- 检查二:单元配置中的控制台。在非根单元的Jailhouse配置文件中,
console字段必须指向正确的UART硬件地址(MMIO),且该UART必须已分配给该单元。 - 检查三:镜像加载地址。
jailhouse cell load命令加载的镜像地址,必须与单元配置中定义的内存区域起始地址、以及该镜像本身的链接地址对齐。
RPMsg或VirtIO通信失败:
- 检查一:共享内存区域。通信依赖于正确的共享内存(
ivshmem)区域定义。确保两个单元(根与非根)的配置文件中,对同一段共享内存的名称、大小、地址的定义完全相同。 - 检查二:VirtIO设备ID。在VirtIO通信中,设备ID需要匹配。检查Linux侧生成的
virtio设备(如/sys/bus/virtio/devices/下的设备)与RTOS侧配置的后端设备ID是否一致。 - 检查三:使用调试工具。在Linux侧,使用
rpmsg_char_sample或virtio_test等内核自带的测试程序先进行基础通信测试,排除应用层代码问题。
- 检查一:共享内存区域。通信依赖于正确的共享内存(
5.2 实时性能分析与优化
文档开头提到的rt_latency测试输出,是评估系统实时性的黄金标准。我们来解读一下:
INFO: stats_print : stats(C0601260) irq delay (ns) min 708 mean 711 max 833 rms^2 506896 stddev^2 174 absmin 708 absmax 3083 INFO: stats_print : stats(C06016C0) irq to sched (ns) min 2416 mean 2499 max 5333 rms^2 6341435 stddev^2 92571 absmin 2416 absmax 5625- irq delay:指从中断信号到达CPU,到CPU开始执行该中断的服务程序(ISR)第一行代码之间的延迟。708纳秒的最小值和833纳秒的最大值是一个非常优秀的成绩,表明在Jailhouse隔离环境下,中断响应极其迅速且确定。
- irq to sched:指从ISR执行完毕,到被该中断唤醒的高优先级任务真正被调度执行之间的延迟。这个值更大(微秒级),因为它涉及任务上下文切换。
- 关键指标是
max和absmax:max是最近10秒内的最大值,absmax是整个测试周期(如12小时)内的最大值。absmax的值(本例中3.083微秒和5.625微秒)是衡量系统“最坏情况响应时间”的关键,必须满足你的实时任务截止时间要求。 - 优化方向:
- CPU隔离与关联:在Linux侧,使用
taskset或cpuset将所有的用户空间进程和无关的内核线程绑定到特定的Cortex-A核心上,确保运行RTOS的核心(或通过Jailhouse隔离出的核心)完全空闲,不被Linux调度器打扰。 - 中断隔离:通过
/proc/irq/[IRQ#]/smp_affinity文件,将实时设备的中断(如GPIO、定时器)定向到RTOS所在的核心,避免Linux核心处理这些中断带来的延迟和不确定性。 - 内核配置:为根单元Linux使用
PREEMPT_RT补丁,并合理配置CONFIG_PREEMPT、CONFIG_HZ_1000等选项,减少Linux自身的内核抢占延迟。 - BIOS/Firmware设置:在板级层面,关闭CPU的节能功能(如C-states, P-states),禁用看门狗等可能引起全局中断的机制,以确保CPU始终以最高性能、最确定的状态运行。
- CPU隔离与关联:在Linux侧,使用
5.3 开发与调试技巧
- 双串口调试法:这是必备的硬件设置。一个串口(如UART2)连接根单元Linux的控制台,用于执行Jailhouse管理命令。另一个串口(如UART4)连接分配给非根单元的UART,用于查看RTOS或非根Linux的启动和运行日志。两个终端同时监控,问题定位效率倍增。
- 利用Linux调试文件系统:Jailhouse在
/sys/kernel/debug/jailhouse/下提供了丰富的调试信息,可以查看已创建的单元、资源配置、统计信息等。/sys/class/remoteproc/下可以查看和管理Cortex-M核心的状态。 - 从Demo开始,逐步迭代:不要一开始就试图构建复杂的多核应用。严格按照文档,从
hello_world开始,确保RTOS能启动并打印。然后测试rpmsg_str_echo,确保基础通信畅通。再尝试uart_sharing或virtio_net,验证资源共享。每一步都稳扎稳打,能有效隔离问题范围。 - 版本管理:异构系统涉及Bootloader (U-Boot)、Linux内核、Jailhouse版本、RTOS SDK等多个组件。强烈建议使用NXP官方发布的、经过验证的Real-time Edge软件包组合,并记录下确切的版本号(如Real_Time_Edge_v3.4_202604)。自行混用不同版本的组件是导致兼容性问题的主要根源。
在我实际将这套方案应用于一个工业视觉检测项目时,最初遇到了非根单元RTOS运行几小时后通信偶然失败的问题。通过长时间运行rt_latency测试,我们发现absmax值偶尔会出现几十毫秒的尖峰。最终定位到根单元Linux中某个后台维护任务(如kswapd)没有被正确隔离,偶尔会跑到隔离核上执行。通过更精细的cpuset配置和内核启动参数(isolcpus)将隔离核彻底从Linux调度器中移除,问题得以解决。这个经历让我深刻体会到,在异构多核系统中,“隔离”的彻底性直接决定了系统的最终可靠性。
