XMOS可执行文件(XE)格式
XMOS可执行(XE)二进制文件格式是用于存放已编译且能在XMOS设备上运行的程序的文件格式。这种格式能够支持在多核或多芯片设计中为每个xCORE核心提供独立的程序,并允许在每个核心上进行多次加载与执行操作。
XE文件不仅包含程序代码,还包括其设计运行环境的描述信息。这些描述信息可以是XML格式的系统配置描述,或者是每个节点的64位系统标识符。
二进制文件格式
下文将详细解释二进制格式的通用元素。所有数据均采用小端字节序编码。
XE文件头
XE文件必须以一个XE文件头开始,其结构如下表所示:
| 字节偏移 | 长度(字节) | 描述 |
|---|---|---|
| 0x0 | 4 | ASCII编码的字符串“XMOS”。 |
| 0x4 | 1 | 主版本号,当前为2。 |
| 0x5 | 1 | 次版本号,当前为0。 |
| 0x6 | 2 | 保留字段,必须设置为零。 |
扇区结构
XE文件头之后是扇区(Sectors)列表,列表的结尾应使用扇区类型为0x5555的扇区标记。每个扇区包含一个扇区头部,可能还会跟有一个包含扇区数据的可变长度的扇区内容块。为了使扇区内容块整体成为32位字的倍数,在扇区数据之后会添加填充。
扇区头部:
| 字节偏移 | 长度(字节) | 描述 |
|---|---|---|
| 0x0 | 2 | 扇区类型标识。 |
| 0x2 | 2 | 保留字段,必须设置为零。 |
| 0x4 | 8 | 扇区内容块的大小(字节)。如果没有内容块,则设置为零。 |
扇区内容块:
| 字节偏移 | 长度(字节) | 描述 |
|---|---|---|
| 0x0 | 1 | 扇区数据后用于对齐的填充字节大小。 |
| 0x1 | 3 | 保留字段,必须设置为零。 |
| 0x4 | n | 扇区数据。 |
| 0x4+n | p | 填充字节,用于确保对齐到32位字边界。 |
| 0x4+n+p | 4 | 扇区的循环冗余校验(CRC)值。 |
扇区CRC是从扇区头部开始到CRC值前一个字节的字节流计算得出的,使用的多项式是0x04C11DB7(IEEE 802.3标准),CRC寄存器初始值为0xFFFFFFFF,计算出的CRC值会被取反。
定义了以下几种扇区类型:
扇区类型:
| 数值 | 名称 | 描述 |
|---|---|---|
| 0x1 | 二进制 | 加载二进制映像文件。 |
| 0x2 | ELF | 加载ELF映像文件。 |
| 0x3 | SysConfig | 系统配置的XML描述。 |
| 0x4 | NodeDescriptor | 节点描述信息。 |
| 0x5 | Goto | 开始执行程序。 |
| 0x6 | Call | 开始执行程序并等待返回。 |
| 0x8 | XN | XN系统描述。 |
| 0x5555 | 最后扇区 | 表示文件扇区列表的结束。 |
| 0xFFFF | 跳过 | 忽略此扇区。 |
扇区数据的具体内容取决于其类型。下面的章节会详细介绍每种扇区类型的数据格式:
SysConfig 扇区
SysConfig扇区包含系统的完整XML描述,包括节点数、xCORE块以及链接/互连配置。这些信息由XMOS提供,用于描述其芯片产品。SysConfig扇区的格式目前未记录。
NodeDescriptor 扇区
NodeDescriptor扇区描述了一个单独的节点,允许工具链验证可执行文件是否与目标设备匹配。可能会有0个或多个NodeDescriptor扇区。
| 数据字节偏移 | 长度(字节) | 描述 |
|---|---|---|
| 0x0 | 2 | JTAG扫描链中节点的索引。 |
| 0x2 | 2 | 保留。 |
| 0x4 | 4 | 设备JTAG ID。 |
| 0x8 | 4 | 设备JTAG用户ID。 |
XN 扇区
XN扇区包含系统的XN描述。
二进制/ELF 扇区
二进制或ELF扇区指示加载程序映像到指定的xCORE块。二进制/ELF扇区的格式如下表所示:
| 数据字节偏移 | 长度(字节) | 描述 |
|---|---|---|
| 0x0 | 2 | JTAG扫描链中节点的索引。 |
| 0x2 | 2 | xCORE块编号。 |
| 0x4 | 8 | 二进制映像数据的加载地址。对于ELF扇区,此字段应设置为0。 |
| 0xC | n | 映像数据。 |
加载二进制扇区时,数据字段被复制到从指定的加载地址开始的内存中。加载ELF扇区时,数据字段中包含的ELF映像的可加载段被加载到ELF映像中指定的地址。
Goto/Call 扇区
Goto和Call扇区指示加载程序到指定的xCORE块上执行。如果最后加载到块上的映像是ELF映像,则执行将从_start符号的地址开始,否则将从扇区中指定的地址开始。
处理Call扇区时,加载程序应等待代码通过done或exit系统调用成功终止,然后再处理下一个扇区。
| 数据字节偏移 | 长度(字节) | 描述 |
|---|---|---|
| 0x0 | 2 | JTAG扫描链中节点的索引。 |
| 0x2 | 2 | xCORE块编号。 |
| 0x4 | 8 | 如果最后加载到块上的映像是二进制映像,则指定要跳转到的地址。如果最后加载的是ELF映像,则此字段应设置为0。 |
最后扇区
最后扇区类型用于指示扇区列表的结束。此类型的扇区不应包含扇区内容块。
跳过扇区
加载程序必须忽略出现在扇区列表中的任何跳过扇区。将现有扇区的类型更改为跳过扇区类型允许删除扇区而不影响XE文件的布局。