Skip to main content
欢迎来到PAWPAW技术文档网站了解更多信息

XMOS可执行文件(XE)格式

XMOS可执行(XE)二进制文件格式是用于存放已编译且能在XMOS设备上运行的程序的文件格式。这种格式能够支持在多核或多芯片设计中为每个xCORE核心提供独立的程序,并允许在每个核心上进行多次加载与执行操作。

XE文件不仅包含程序代码,还包括其设计运行环境的描述信息。这些描述信息可以是XML格式的系统配置描述,或者是每个节点的64位系统标识符。

二进制文件格式

下文将详细解释二进制格式的通用元素。所有数据均采用小端字节序编码。

XE文件头

XE文件必须以一个XE文件头开始,其结构如下表所示:

字节偏移长度(字节)描述
0x04ASCII编码的字符串“XMOS”。
0x41主版本号,当前为2。
0x51次版本号,当前为0。
0x62保留字段,必须设置为零。

扇区结构

XE文件头之后是扇区(Sectors)列表,列表的结尾应使用扇区类型为0x5555的扇区标记。每个扇区包含一个扇区头部,可能还会跟有一个包含扇区数据的可变长度的扇区内容块。为了使扇区内容块整体成为32位字的倍数,在扇区数据之后会添加填充。

扇区头部:

字节偏移长度(字节)描述
0x02扇区类型标识。
0x22保留字段,必须设置为零。
0x48扇区内容块的大小(字节)。如果没有内容块,则设置为零。

扇区内容块:

字节偏移长度(字节)描述
0x01扇区数据后用于对齐的填充字节大小。
0x13保留字段,必须设置为零。
0x4n扇区数据。
0x4+np填充字节,用于确保对齐到32位字边界。
0x4+n+p4扇区的循环冗余校验(CRC)值。

扇区CRC是从扇区头部开始到CRC值前一个字节的字节流计算得出的,使用的多项式是0x04C11DB7(IEEE 802.3标准),CRC寄存器初始值为0xFFFFFFFF,计算出的CRC值会被取反。

定义了以下几种扇区类型:

扇区类型:

数值名称描述
0x1二进制加载二进制映像文件。
0x2ELF加载ELF映像文件。
0x3SysConfig系统配置的XML描述。
0x4NodeDescriptor节点描述信息。
0x5Goto开始执行程序。
0x6Call开始执行程序并等待返回。
0x8XNXN系统描述。
0x5555最后扇区表示文件扇区列表的结束。
0xFFFF跳过忽略此扇区。

扇区数据的具体内容取决于其类型。下面的章节会详细介绍每种扇区类型的数据格式:

SysConfig 扇区

SysConfig扇区包含系统的完整XML描述,包括节点数、xCORE块以及链接/互连配置。这些信息由XMOS提供,用于描述其芯片产品。SysConfig扇区的格式目前未记录。

NodeDescriptor 扇区

NodeDescriptor扇区描述了一个单独的节点,允许工具链验证可执行文件是否与目标设备匹配。可能会有0个或多个NodeDescriptor扇区。

数据字节偏移长度(字节)描述
0x02JTAG扫描链中节点的索引。
0x22保留。
0x44设备JTAG ID。
0x84设备JTAG用户ID。

XN 扇区

XN扇区包含系统的XN描述

二进制/ELF 扇区

二进制或ELF扇区指示加载程序映像到指定的xCORE块。二进制/ELF扇区的格式如下表所示:

数据字节偏移长度(字节)描述
0x02JTAG扫描链中节点的索引。
0x22xCORE块编号。
0x48二进制映像数据的加载地址。对于ELF扇区,此字段应设置为0。
0xCn映像数据。

加载二进制扇区时,数据字段被复制到从指定的加载地址开始的内存中。加载ELF扇区时,数据字段中包含的ELF映像的可加载段被加载到ELF映像中指定的地址。

Goto/Call 扇区

Goto和Call扇区指示加载程序到指定的xCORE块上执行。如果最后加载到块上的映像是ELF映像,则执行将从_start符号的地址开始,否则将从扇区中指定的地址开始。

处理Call扇区时,加载程序应等待代码通过done或exit系统调用成功终止,然后再处理下一个扇区。

数据字节偏移长度(字节)描述
0x02JTAG扫描链中节点的索引。
0x22xCORE块编号。
0x48如果最后加载到块上的映像是二进制映像,则指定要跳转到的地址。如果最后加载的是ELF映像,则此字段应设置为0。

最后扇区

最后扇区类型用于指示扇区列表的结束。此类型的扇区不应包含扇区内容块。

跳过扇区

加载程序必须忽略出现在扇区列表中的任何跳过扇区。将现有扇区的类型更改为跳过扇区类型允许删除扇区而不影响XE文件的布局。

加载XE文件

加载XE文件时,需要按照文件中的扇区顺序依次处理。这样可以按照工具链定义的顺序加载和执行扇区,以初始化系统,并根据需要采用多个引导阶段。如果一个映像被加载到一个xCORE核心上,那么就必须有一个Goto扇区。这个Goto扇区必须在该核心的所有Call、Binary和ELF扇区之后。

加载程序可以选择推迟处理Call扇区,直到为目标设备上的所有xCORE核心积累了一组Call扇区,这样可以通过并行执行多个程序来缩短启动时间。

Example XE file中的示例展示了一个典型的XE文件布局,该文件包含了编译后在4核XS1-G4设备上运行的程序。

扇区类型节点** Tile **描述
SysConfigXML系统描述,加载器忽略。
XNXN描述,加载器忽略。
ELF03将ELF映像加载到节点0 Tile 3。
Call03在节点0 Tile 3上执行程序并等待成功结束。
ELF02将ELF映像加载到节点0 Tile 2。
Call02在节点0 Tile 2上执行程序并等待成功结束。
ELF01将ELF映像加载到节点0 Tile 1。
Call01在节点0 Tile 1上执行程序并等待成功结束。
ELF00将ELF映像加载到节点0 Tile 0。
Call00在节点0 Tile 0上执行程序并等待成功结束。
ELF03再次将ELF映像加载到节点0 Tile 3。
Goto03在节点0 Tile 3上执行程序。
ELF02再次将ELF映像加载到节点0 Tile 2。
Goto02在节点0 Tile 2上执行程序。
ELF01再次将ELF映像加载到节点0 Tile 1。
Goto01在节点0 Tile 1上执行程序。
ELF00再次将ELF映像加载到节点0 Tile 0。
Goto00在节点0 Tile 0上执行程序。
最后扇区标记文件扇区列表的结束。

更多关于XE文件的内容和它们的加载方式,请参考教程了解XE文件及其加载方式