定義對映版面配置

本主題利用範例來說明對映的版面配置定義。

註: 對映版面配置不支援以多種方式來定義相同的記憶體部分。 例如,不支援定義聯集

下列範例定義下列 C 語言結構的版面配置:

typedef struct {
  char char_val;
  unsigned short ushort_val;
  short short_val;
  unsigned long ulong_val;
  long long_val;
  char string_val[32];
} _test;

建立版面配置 XML 檔

layout.dtd 文件類型定義 (DTD) 檔中定義的 XML 檔案格式如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>
  <!ELEMENT LAYOUT (FIELD)+>
  <!ATTLIST LAYOUT Header CDATA #REQUIRED length CDATA #REQUIRED>
  <!ELEMENT GROUP EMPTY>
  <!ATTLIST GROUP Name CDATA #REQUIRED>
  <!ELEMENT FIELD (FIELD)*>
  <!ATTLIST FIELD
    Header CDATA #REQUIRED
    Type (16_BIT_INT|16_BIT_UINT|16_BIT_HINT|32_BIT_INT|32_BIT_UINT|32_BIT_HINT|32_BIT_FLOAT|64_BIT_INT|64_BIT_FLOAT|CHARACTER|HEX|ASCII|EBCDIC|STRUCTURE|PADDING|BIT|BITMASK|MAP) #REQUIRED
    length CDATA #REQUIRED
    layout CDATA #IMPLIED
    filename CDATA #IMPLIED
	  Groups CDATA #IMPLIED>

這表示 XML 配置檔一開始先指定版面配置的標頭(標題)和版面配置長度總計, 接著以標頭(名稱)、長度及初始類型(用來決定該子元素的預設表示法)的說明來指定一連串子元素 (FIELD)。

另外還有特殊的子元素類型:

說明 _test 結構的樹狀結構視圖且遵循此格式的 XML 檔如下:

<?xml version="1.0"?>
<!DOCTYPE LAYOUT SYSTEM "Layout.dtd" >
  <LAYOUT Header="A Layout" length="17">
  <FIELD Header="char_val" Type="CHARACTER" length="1"></FIELD>
  <FIELD Header="ushort_val" Type="16_BIT_UINT" length="2"></FIELD>
  <FIELD Header="short_val" Type="16_BIT_INT" length="2"></FIELD>
  <FIELD Header="ulong_val" Type="32_BIT_UINT" length="4"></FIELD>
  <FIELD Header="long_val" Type="32_BIT_INT" length="4"></FIELD>
  <FIELD Header="string_val" Type="ASCII" length="32"></FIELD>
</LAYOUT>
註: <!DOCTYPE LAYOUT SYSTEM "Layout.dtd" > 行指定使用哪一個 DTD 檔來剖析這個檔案的內容。 如果 Layout.DTD 檔放在不同的位置,則必須指定該位置的完整路徑。

定義填補欄位

如果您決定忽略 long_val 欄位,但想要在版面配置中顯示 string_val 類型, 則 XML 檔的內容如下:

  <FIELD Header="short_val" Type="16_BIT_INT" length="2"></FIELD>
  <FIELD Header="ulong_val" Type="32_BIT_UINT" length="4"></FIELD>
  <FIELD Header="" Type="PADDING" length="4"></FIELD>
  <FIELD Header="string_val" Type="ASCII" length="32"></FIELD>

最初定義 PADDING 子元素的用意是為了處理位元組定址結構,但也可以用來跳過不需要在版面配置中詳述的資料區。

定義結構

下列 XML 片段顯示如何使用 STRUCTURE 欄位來對映巢狀結構。 結構頂端元素沒有相關聯的值,且可以展開來顯示子元素。 雖然 STRUCTURE 欄位的長度會加總至 XML 版面配置的大小總計,但納入的欄位大小只是基於顯示用途。 例如,下列結構表示只從版面配置大小總計中顯示 344 個位元組。

<FIELD Header="MACHINE CHECK LOG OUT AREA" Type="STRUCTURE" length="344">
  <FIELD Header="reserved" Type="HEX" length="16"></FIELD>
  <FIELD Header="FLCSID" Type="HEX" length="4"></FIELD>
  <FIELD Header="FLCIOFP" Type="HEX" length="4"></FIELD>
  <FIELD Header="reserved" Type="HEX" length="20"></FIELD>
  <FIELD Header="FLCESAR" Type="HEX" length="4"></FIELD>
  <FIELD Header="FLCCTSA" Type="HEX" length="8"></FIELD>
  <FIELD Header="FLCCCSA" Type="HEX" length="8"></FIELD>
  <FIELD Header="FLCMCIC" Type="HEX" length="8"></FIELD>
  <FIELD Header="reserved" Type="HEX" length="8"></FIELD>
  <FIELD Header="FLCFSA" Type="HEX" length="4"></FIELD>
  <FIELD Header="reserved" Type="HEX" length="4"></FIELD>
  <FIELD Header="FLCFLA" Type="HEX" length="16"></FIELD>
  <FIELD Header="FLCRV110" Type="HEX" length="16"></FIELD>
  <FIELD Header="FLCARSAV" Type="STRUCTURE"length="64">
    <FIELD Header="AR0" Type="HEX" length="4"></FIELD>
    <FIELD Header="AR1" Type="HEX" length="4"></FIELD>
    <FIELD Header="AR2" Type="HEX" length="4"></FIELD>
    <FIELD Header="AR3" Type="HEX" length="4"></FIELD>
    <FIELD Header="AR4" Type="HEX" length="4"></FIELD>
    <FIELD Header="AR5" Type="HEX" length="4"></FIELD>
    <FIELD Header="AR6" Type="HEX" length="4"></FIELD>
    <FIELD Header="AR7" Type="HEX" length="4"></FIELD>
    <FIELD Header="AR8" Type="HEX" length="4"></FIELD>
    <FIELD Header="AR9" Type="HEX" length="4"></FIELD>
    <FIELD Header="AR10" Type="HEX" length="4"></FIELD>
    <FIELD Header="AR11" Type="HEX" length="4"></FIELD>
    <FIELD Header="AR12" Type="HEX" length="4"></FIELD>
    <FIELD Header="AR13" Type="HEX" length="4"></FIELD>
    <FIELD Header="AR14" Type="HEX" length="4"></FIELD>
    <FIELD Header="AR15" Type="HEX" length="4"></FIELD>
  </FIELD>
  <FIELD Header="FLCFPSAV" Type="HEX" length="32"></FIELD>
  <FIELD Header="" Type="PADDING" length="64"></FIELD>
  <FIELD Header="" Type="PADDING" length="64"></FIELD>
</FIELD>

結構可以在版面配置的內部或外部定義。 建立外部結構就像建立巢狀版面配置一樣, 同樣是在結構欄位中指定 filename="<file name>", 其中,<file name> 所參照的檔案包含結構的實際定義。

例如,MACHINE CHECK LOG OUT AREA 結構可以在外部對映版面配置中指定如下: <FIELD Header="MACHINE CHECK LOG OUT AREA" Type="STRUCTURE" length="344" filename="machine.xml"></FIELD>

定義位元遮罩欄位

下列 XML 片段是 BITMASK 欄位的說明範例。 BITMASK 的長度以位元組來指定,且包含一組以位元來指定長度的 BIT 欄位。 BIT 欄位顯示的偏移是指 BITMASK 欄位內的位元偏移。 雖然位元遮罩欄位的長度會加總至 XML 版面配置的大小總計,但個別的 BIT 欄位大小只是基於顯示用途。

<FIELD Header="byte_field" Type="BITMASK"length="2">
  <FIELD Header="hi_byte" Type="BIT" length="8"></FIELD>
  <FIELD Header="lo_byte" Type="BIT" length="8"></FIELD>
</FIELD>

定義巢狀版面配置

MAP 欄位類型和選用的版面配置欄位可以一起用來說明巢狀版面配置,如下列 DSA 版面配置範例所示:

<?xml version="1.0"?>
<!DOCTYPE LAYOUT SYSTEM "Layout.dtd">
<LAYOUT Header="DSA" length="72">
  <FIELD Header="FLAGS" Type="HEX" length="2"></FIELD>
  <FIELD Header="junk" Type="HEX" length="2"></FIELD>
  <FIELD Header="Back Chain" Type="MAP" length="4" layout="dsa.xml"></FIELD>
  <FIELD Header="Forward Chain" Type="MAP" length="4" layout="dsa.xml"></FIELD>
  <FIELD Header="R14" Type="HEX" length="4"></FIELD>
  <FIELD Header="R15" Type="HEX" length="4"></FIELD>
  <FIELD Header="R0" Type="HEX" length="4"></FIELD>
  <FIELD Header="R1" Type="HEX" length="4"></FIELD>
  <FIELD Header="R2" Type="HEX" length="4"></FIELD>
  <FIELD Header="R3" Type="HEX" length="4"></FIELD>
  <FIELD Header="R4" Type="HEX" length="4"></FIELD>
  <FIELD Header="R5" Type="HEX" length="4"></FIELD>
  <FIELD Header="R6" Type="HEX" length="4"></FIELD>
  <FIELD Header="R7" Type="HEX" length="4"></FIELD>
  <FIELD Header="R8" Type="HEX" length="4"></FIELD>
  <FIELD Header="R9" Type="HEX" length="4"></FIELD>
  <FIELD Header="R10" Type="HEX" length="4"></FIELD>
  <FIELD Header="R11" Type="HEX" length="4"></FIELD>
  <FIELD Header="R12" Type="HEX" length="4"></FIELD>
</LAYOUT>

這個形式完整的 XML 版面配置已儲存在 DSA.XML 檔案中。 因為您知道欄位 3 和 4 中有指標指向不同的 DSA 結構,所以您新增兩個巢狀版面配置定義。

註: 當您第一次展開佈置元素時,才會真正地執行該版面配置的實際記憶體對映,以防止遞迴地展開版面配置。

定義群組

透過群組語法,您可以將對映版面配置中的欄位組織成群組,以方便使用。 若要定義群組,您必須在配置檔的開頭加上 <GROUP Name="groupName"></GROUP>。 接著指定下列程式碼,表示欄位屬於預先定義的群組: <FIELD Header="RESERVED" Type="HEX" length="12" Groups="groupName"></FIELD>

一個欄位可以屬於多個群組。 若要定義多個群組,請在 Groups 屬性中以逗號分隔清單來指定群組。

ALL 群組名稱是一個特殊的群組。 在欄位中指定這個名稱會使該欄位隸屬於所有群組,在所有群組中將可以看到這個欄位。 下列程式碼範例包含群組:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE LAYOUT SYSTEM "Layout.dtd">
<LAYOUT Header="GROUP_EXAMPLE" length="32">
  <GROUP Name="GroupA"></GROUP>
  <GROUP Name="GroupB"></GROUP>
  <FIELD Header="FIELD_A" Type="HEX" length="8" Groups="GroupA"></FIELD>
  <FIELD Header="FIELD_B" Type="HEX" length="8" Groups="GroupB"></FIELD>
  <FIELD Header="FIELD_AB" Type="HEX" length="8" Groups="GroupA,GroupB"></FIELD>
  <FIELD Header="FIELD_ALL" Type="HEX" length="8" Groups="ALL"></FIELD>
</LAYOUT>
相關工作
對映記憶體
使用對映的記憶體
設定記憶體對映喜好設定
對映表示式、變數或暫存器的記憶體
編輯記憶體版面配置
在「記憶體」視圖中編輯被對映記憶體
從「記憶體」視圖中移除被對映記憶體
將對映版面配置欄位分組
尋找和展開欄位
新增多個記憶體對映

意見