微码文件结构及下载过程

    本文是从 BSP 和驱动角度研究动态下载的时候,对微码的结构进行的整理;详细的结构为针对 intel IXA_SDK_3.1 ,它较先前的结构有了比较大的变化,由于接触的部分较少,实际有理解错误的地方请大家斧正。 
1. 微码结构:

类似于coff,或者pe等通用的文件结构,微码的文件结构也是分为文件头和一个称为文件体的多段部分。一个典型的UOF文件一般包含一个UOF_OBJS文件体,另外DBG_OBJS文件题可有可无,这些结构的定义包含在intel的SDK中的文件UOF.H和DBG_UOF.H文件中,详细结构如图.7所示。

Ø      文件头:uof_fileHdr_T部分:用于表示当前文件为特定的微码文件,文件标识为0xC2C6;当前微码文件适用的处理器的版本范围;该微码文件所能容纳的最大文件快和当前文件块数。另外,根据文件标识还能判断出是大或者小字节序,物理位置接下来是全文件UOF对象头。

Ø      全文件UOF对象头:uof_filechunkHdr_T部分,它是所有文件对象的头部分。每个文件对象对应一个结构体。该结构体包含文件对象ID,checksum,本文对象的大小和偏移量。其中ID一般包括UOF_OBJS和DBG_OBJS两种。

Ø      UOF对象头:uof_objHdr_T部分,该部分是UOF_OBJS或DBG_OBJS部分的头,包含信息为CPU类型,微码所能运行的CPU的版本范围,最大和当前文件块数目。在其后接下来的是该对象中的相关文件块的头信息。

Ø      文件块头信息:为uof_chunkHdr_T部分,该部分包含块的ID,和该块的大小和偏移。相应的ID有UOF_STRT UOF_GTID  UOF_IMAG  UOF_MSEG           UOF_IMEM。

Ø      UOF_STRT文件块:uof_strTab_T部分,它包含其他对象块所使用的所有字符串,以NULL作为结束标志,用一个小于表长度的数字作为字符串的索引。

Ø      UOF_GTID文件块:uof_GTID_T部分,包含产生这个文件的一些工具的相关信息,例如工具的Id编号和相关版本号等。

Ø      UOF_MSEG文件块:是uof_varMemSeg_T部分,包含分配的内存空间的起始地址和分配大小。

Ø      UOF_IMEM文件块:uof_initMem_T部分,包含内存的初始值和相应的位置,他们以一系列相关byte列的形式写入内存中。他对应于uof_memValAttr_t,内部分别包含字节偏移,类型和两个保留字。

Ø      UOF_IMAG文件块,是最为重要的一个文件块,他整体分成头和体两个部分。头包含的相关信息有:映像的名称,该映像所分配的寄存器的相应的值,没有使用的microstore的填充模式,映像文件是否大小写敏感,微引擎模式,CPU类型,所适应的最大和最小版本号,映像文件的属性,PAGE number进入点,UC代码进入点,微码相应的页数目,REG表相对块头的偏移,寄存器/符号初始化表相对于块头的初始化地址。其后紧跟相应的微码页简要信息。

    UOF%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F.jpg
                           图.7:微码结构图

    uof_codePage_T部分,该部分是相关CODEPAGE部分信息的简要介绍,相应的简要信息段包含NR寄存器列表的偏移,uC变量列表的偏移,导入变量列表的偏移,导出变量列表的偏移以及代码区偏移等。

Ø      剩余部分:导入变量列表,导出变量列表,ucVar变量列表,微引擎寄存器列表,微引擎寄存器符号列表,NR寄存器列表,以及代码空间等

由于时间和篇幅关系,在该处不做更为详细的介绍,假如以后有相关方面的需要,可以在该方面做更为深入的研究。

2.微码加载过程:

微码的加载过程包括从微代码下载到微引擎启动的整个流程,根据具体的流程的执行情况,可以将该过程分成如下几个部分:下载过程,微码映射,PATCH变量,UOF加载和微引擎启动。

Ø      下载:<?xml:namespace prefix = o />

根据接口板类型和主从2400获取相应的微码文件的名称,然后通过ftp在指定的HOST上下载微码文件,存放在本地SDRAM中,当是主NPCT的话,直接写进入相应地址,当是从NPCT的话,需要执行PCI映射。

Ø      微码映射

该部分根据传输过来的存放映象文件的BUFFER为微引擎设置微码,但是这个时候映象文件并不装载进微引擎的运行空间。该部分需要执行的工作是首先清微码的句柄和patch变量队列;然后根据微码文件的结构将相关数据映射到g_MicroengineAPIManager.m_UOFActiveHandle结构中,其中几个主要的任务包含映射UOF_IMEM文件块,映射UOF_MSEG和对UOF_IMAG文件块的映射几个部分,其中还包含判断大小字节序并对其转换的过程;最后根据映射的g_MicroengineAPIManager.m_UOFActiveHandle中的varMegSeg成员(也就是先前UOF_MSEG)判断系统是否预留相关部分空间。

Ø      PATCH变量:

这个过程一般不是集中进行的,他在接下来的步骤中,直到UOF实际加载过程都可以执行变量的PATCH操作。这个时候的PATCH的过程,实际是将需要PATCH的变量名称和值写进一个链表g_MicroengineAPIManager.m_aImported

SymbolsList中,其中链表的每个包含变量名称,value和下一个节点位置。

Ø        UOF加载

该过程首先将先前链表中的变量patch到sdram中的映象中,而后将该相关的映象文件写进入微引擎实际执行的空间。

Ø        微引擎启动:

实际启动微擎,该部分根据 registry 中的数据,设置启动特定的微引擎或者线程,在 V6 中,该处是预定的启动所有引擎的所有线程。具体过程为比较 Uengine 中的和封装的映象是否相同,假如相同则设置 CTX_ENABLES 寄存器中 CXTX_ENABLES 的相应位置,使得微引擎启动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值