맵핑 레이아웃 정의

이 주제에서는 맵의 레이아웃 정의를 설명하는 예제를 사용합니다.

이 태스크 정보

레이아웃 XML 파일 작성

XML 파일 형식은 다음과 같이 layout.dtd 문서 유형 정의(DTD) 파일로 정의됩니다.

<?xml version="1.0"?>
  <!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) 목록이 표시되어 해당 하위 요소의 기본 표시를 결정하는 데 사용됩니다.

다음과 같은 특수 하위 요소 유형도 있습니다.

다음 예제에서는 C 언어 구조에 대해 레이아웃을 정의합니다.

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

_test 구조의 트리 보기를 설명하고 이 형식을 확인하는 XML 파일은 다음과 같습니다.

<?xml version="1.0"?>
  <LAYOUT Header="A Layout" description="Tree view" length="25">
  <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="12"></FIELD>
  <FIELD Header="char_val" Type="ASCII" length="1"></FIELD>
</LAYOUT>

offsetoffset_mode 속성을 사용하여 맵의 시작에 대해 상대적이거나(offset_mode=absolute) 현재 주소에 대해 상대적인(offset_mode=relative) 필드의 정확한 위치를 지정할 수 있습니다. 다음 예제에서 b로 이름이 지정된 요소는 offset이 10으로 설정되고 offset_moderelative로 정의됩니다. 이러한 속성이 없으면 이 요소의 오프셋은 80이나 오프셋이 현재 위치에 대해 상대적으로 10으로 정의되므로 90이 됩니다. 길이에 0x 접두부가 사용되므로 요소 a의 길이는 16진으로 정의됩니다. 일반적으로 lengthoffset 속성은 0x 접두부가 있는 HEX 형식으로 지정됩니다. 요소 c의 오프셋은 4이며 모드는 absolute입니다. 즉, 이 요소의 오프셋은 레이아웃의 시작으로부터 4바이트 떨어져 있습니다. c 필드에 의해 맵핑된 10바이트 또한 a 필드에 포함됩니다.

<Header="offset_Test" length="190">
  <FIELD Header="a" Type="HEX" length="0x64"></FIELD>
  <FIELD Header="b" description="offset = 90" Type="HEX" length="80" offset="10" offset_mode="relative"></FIELD>
  <FIELD Header="c" Type="HEX" length="10" offset="4" offset_mode="absolute"></FIELD>
</LAYOUT>

Padding 필드 정의

채우기 필드는 바이트로 맞춘 구조를 처리하기 위해 사용되거나 메모리 맵에서 정의할 필요가 없는 맵 내의 데이터 영역을 건너뛰기 위해 사용될 수 있습니다. 예를 들어, 위에서 정의된 _test 구조의 경우, long_val 필드를 무시하고 string_val 유형을 레이아웃에 표시하는 맵을 작성할 수 있습니다. XML 파일은 다음과 유사하게 표시됩니다.

<?xml version="1.0"?>
  <LAYOUT Header="A Layout" description="Tree view" length="0x19">
  <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="" Type="PADDING" length="4"></FIELD>
  <FIELD Header="string_val" Type="ASCII" length="12"></FIELD>
  <FIELD Header="char_val" Type="ASCII" length="1"></FIELD>
</LAYOUT>

또한 여기서 offset 속성을 사용하여 string_valoffset을 4로 지정하고 offset_moderelative로 지정하여 long_val을 건너뛸 수 있습니다.

  <FIELD Header="string_val" Type="ASCII" length="12" offset="4" offset_mode="relative"></FIELD>

이는 string_val 필드의 주소가 실제로 ulong_val 필드의 마지막 바이트에 대해 상대적으로 4바이트이며 long_val 필드에 의해 사용되는 바이트를 건너뛰게 됨을 의미합니다.

구조 정의

다음 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="<파일 이름>"을 지정하여 중첩된 레이아웃과 같이 만들 수 있습니다. 여기서, <파일 이름>으로 참조되는 파일에는 실제 구조 정의가 들어 있습니다.

예를 들어, MACHINE CHECK LOG OUT AREA 구조를 다음과 같이 맵핑 레이아웃에 외부적으로 지정할 수 있습니다. <FIELD Header="MACHINE CHECK LOG OUT AREA" Type="STRUCTURE" length="344" filename="machine.xml"></FIELD>

Bitmask 필드 정의

다음 XML은 BITMASK 필드를 설명하는 샘플입니다. BITMASK의 길이는 바이트 단위로 지정되며 길이를 비트로 지정한 BIT 필드 세트가 들어 있습니다. BIT 필드에 대해 표시된 오프셋은 BITMASK 필드 내의 비트 오프셋입니다. Bitmask 필드의 길이가 XML 레이아웃의 총 크기에 추가되지만 개별 BIT 필드의 크기는 표시용으로만 사용됩니다.

<FIELD Header="BITMASK" Type="BITMASK" length="1">
  <FIELD Header="BIT 1" Type="BIT" length="1"></FIELD>
  <FIELD Header="BIT 2" Type="BIT" length="1"></FIELD>
  <FIELD Header="BIT 3" Type="BIT" length="1"></FIELD>
  <FIELD Header="BIT 4" Type="BIT" length="1"></FIELD>
  <FIELD Header="BIT 5" Type="BIT" length="1"></FIELD>
  <FIELD Header="BIT 6" Type="BIT" length="1"></FIELD>
  <FIELD Header="BIT 7" Type="BIT" length="1"></FIELD>
  <FIELD Header="BIT 8" Type="BIT" length="1"></FIELD>
</FIELD> 

공용체 정의

다음 예제에서는 C 언어 공용체에 대해 레이아웃을 정의합니다.

union my_union {
  int my_intVal;
  double my_doubleVal;
};

아래의 샘플 XML에는 공용체를 설명하는 방법에 대해 나와 있습니다. XML에서 공용체의 길이는 가장 큰 필드의 크기입니다.

<LAYOUT Header="UNIONS" length="8">
  <FIELD Header="my_union" Type="UNION" length="8">
    <FIELD Header="my_intVal" Type="HEX" length="4" description="value within the union"></FIELD>
    <FIELD Header="my_doubleVal" Type="HEX" length="8"></FIELD>
  </FIELD>
</LAYOUT> 

중첩된 레이아웃 정의

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 속성에 쉼표로 구분된 목록으로 그룹을 지정하십시오.그룹 속성 내의 각 그룹은 <GROUP> 태그를 사용하여 레이아웃에서 정의되어 있어야 합니다.

ALL 그룹 이름은 특수 그룹입니다. 특수 그룹을 필드에 지정하면 필드가 모든 그룹에 속하게 되므로 모든 그룹에 표시됩니다. 다음은 그룹이 있는 코드 샘플입니다.

<?xml version="1.0"?>
<!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>

ORG 그룹 정의

ORG_GROUP 태그를 사용하여 이전에 정의된 메모리 부분의 레이아웃을 정의할 수 있습니다. 이는 어셈블러 내의 ORG 명령어의 작동과 유사합니다. FIELD 속성을 사용하여 새 레이아웃의 시작 위치를 지정할 수 있습니다. 단순한 경우, FIELD 속성의 값이 맵에서 이전에 정의된 필드의 이름을 수 있습니다. 또한 *NONE 또는 *를 값으로 사용할 수 있습니다. 그런 경우, 메모리 내의 현재 위치에 대한 레이아웃입니다. Header 속성은 단순히 새 레이아웃의 이름입니다.

<LAYOUT Header="SW00SR" length="271">
   <ORG_GROUP FIELD="*NONE" Header="ORG_GROUP1">
    <FIELD Header="A" length="4" Type="HEX"></FIELD>
    <FIELD Header="B" length="4" Type="HEX"></FIELD>
    <FIELD Header="c" length="4" Type="HEX"></FIELD>
  </ORG_GROUP>
   <ORG_GROUP FIELD="A" Header="my_custom_header">
    <FIELD Header="F" length="4" Type="HEX" description="address of F == address of A"></FIELD>
    <FIELD Header="G" length="4" Type="HEX"></FIELD>
    <FIELD Header="H" length="4" Type="HEX"></FIELD>
    <ORG_GROUP FIELD="*+4" Header="another_org">
      <FIELD Header="J" length="2" Type="HEX" description="address of J = current location + 4"></FIELD>
    </ORG_GROUP>
  </ORG_GROUP>
  <FIELD Header="R" length="4" Type="HEX"></FIELD>
  <FIELD Header="Z" length="4" Type="HEX"></FIELD>
</LAYOUT> 

여기서,


피드백