본문 바로가기

개발

Windows Embedded CE 6.0 Catalog Internal

Windows Embedded CE 6.0의 BSP작업을 하다보면, 가끔씩 드는 생각이 Catalog가 도대체 뭘까? 하는 생각이 든다.
MS에서 만들어 나오는 SYSGEN Component들을 보면, Catalog에서 선택만하고, Sysgen만 한번 때리면(물론 빌드가 안되었으면 Build가 엮어져 들어가겠지만), 자연스레, OS Image에 포함된다. 왜일까?

Sysgen은 Systen Component들을 가져와서 OS의 구성요소에 끼워넣어주는 역할을 한다. 물론 빌드가 필요하면 빌드도 하고, 이 때 다 빌드된것들은 Public이나 Private의 Target에 있고, 이것들이 Release쪽으로 복사되어 온다. Lib는 Library라 대개 BSP와 함꼐 엮일 일은 없다. 물론 MDD/PDD형태의 코드들은 Lib만 있어서, BSP의 드라이버나 기타 Component와 묶이게 되지만, 이런것은 이미 BSP의 책임으로 넘어오는 것이므로, 예외로 한다. 아무튼 대부분의 상위 Component들, 즉 Logical Driver DLL이나, Application, 기타 DLL Module들은 죄다 들어온다고 보면 된다.

그런데? 도대체 어떤 원리로 들어오게 될까? 그 내부 속속들이를 알아보기 위해서 오늘은 우선 Catalog에 대해서 알아보도록 한다. 사실 빌드 과정은 MS문서를 보거나, 여러 Third Party Device Manufacture들의 사이트에 들어가거나, 커뮤니티에 들어가보면 글들이 많다. 하지만 Catalog자체에 대해서는 별 이야기가 없다. 그도 그럴 것이, BSP제작을 하는 곳도 드물겠거니와, 그것을 굳이 Catalog로 만들 필요도 없기 때문이겠다. 이건 이전부터의 빌드 시스템과 UI을 계승하기 때문이기도 한데, 대부분이 Command Line상에서 System Environment로 처리되는 것이라, 이 가장 최하위 원리를 알고 있다면 Catalog를 만들 필요가 없기 때문이겠다.
그래도.
알아두면 좋지 않겠는가? ^^?

우선은 대부분의 CE플랫폼 개발자들은 BSP에 관심이 있을 것이므로, MS에서 작업해놓은 BSP의 Catalog를 보도록 하자. 바로 Device Emulator의 탈을 쓴 SMDK2410의 BSP Catalog이다. MS의 Device Emulator가 SMDK2410을 모태로 하고 있기에 BSP도 거의 그대로 이다. 물론 Emulation고유의 기능 때문에, 코드상에 실제 Chip에서는 사용되지 않는 코드도 들어 있긴 하다. 대표적인게 Display의 DMA처리 부분.

어쨌든 열어보면 아래와 같은 화면이 보일 것이다.
일단은 notepad등의 텍스트 에디터로 열어보자.

보시다 시피 XML 이다. 뭐 이미 확장자 자체에서 PBC XML 이라고 했으니, 감이 오지 않는가?
Platform Builder Catalog XML 파일이란 의미가 되겠다.
XML을 잘 모르시는 분들을 위해서 간단히 설명하자면, 일종의 DB파일이라고 생각하면 된다. Data자체를 들고 있는 것이 XML이고, 이 DB를 위해서 DB내부의 구조를 정의하고 있는 것이 XML Schema라는 것이 있다. 물론 XML표준상 DTD라는 포맷으로 작성된 파일도 사용될 수 있지만, 여러가지 제약이 있어서 XML Schema를 많이 사용한다. 물론 Platform Builder도 XML Schema를 사용한다.

굳이 XML Schema를 모르더라도 XML파일만 봐서도 대충의 의미의 파악은 가능한데, HTML을 접해보셨던 분이라면, HTML과는 다른 글자들을 보실 수 있을 것이다. 이 각 태그 안의 것들이 Element즉 하나의 변수명이라고 생각하면 된다. <Element> ~~~ </Element>로 싸여있는 안쪽은 바로 이 변수에 할당될 값이 된다. 물론 이 값은 해당변수의 타입이 무엇인가에 따라서 달라지게 되는데, 이부분은 XML Schema를 봐야만 이해가 가능하다. 각 태그 안에 태그 이름과 함께, <Element XXX="AAA"> 라고 되어 있는 것이 보이는데, 이는 속성으로 해당 Element의 하위 변수라고 생각하면 되고, 실제로도 태그 내부에 들어있는 Element들과 동등하게 취급된다. 차이가 있다면, Scope정도?

한줄 일일히 설명하자면, 반 이상이 XML의 설명이 될지라 글이 언제 끝날지 알 수 없어, XML용어를 그대로 노출시키면서 설명을 하고, XML자체에 대한 궁금증은 독자 스스로 찾아보길 바라겠다.

우선은 주석을 제외하고 맨 윗 줄부터 보면,

<CatalogFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" RequiredVersion="6.00" xsi:schemaLocation="urn:Microsoft.PlatformBuilder/Catalog PbcXml600.xsd" xmlns="urn:Microsoft.PlatformBuilder/Catalog">

라고 되어 있다. 무슨 뜻일까?

RootElement는 CatalogFile 이라는 이름을 갖고 있고, 첫번째 속성으로 정의되는 Namespace로서 접두어는 xsi를 사용하며, NameSpace의 이름은 http://www.w3.org/2001/XMLSchema-instance 가 되겠다. 왜 이런 이름이 NameSpace의 이름인지는 XML 표준을 참고하시면 이해가 될것이다. 그리고 위의 URL에도 한번 들어가 보시고 하면 도움이 많이 될 듯하다.
왜 저렇게 했는지 생각하기 귀찮으신 분은, 그냥 기본 설정이라고 생각하면 속 편할 것 이다. 실제로도 그러하니까.
두번째로 정의되는 속성에서 다른 Namespace를 선언하고 있는데, 이번에는 xsd라는 접두어를 갖게되며, http://www.w3.org/2001/XMLSchema 라고 Namespace이름을 주었다. 말그대로 XML Schema에 대한 Namespace를 정의한 것이며, 해당 접두어를 xsd라고 했다. 대부분의 XML Schema파일은 확장자로 xsd를 갖는다.
세번째 속성은 RequiredVersion으로 6.00이라고 되어 있다. 이 속성은 CatalogFile의 속성이므로, 아마도 Platform Builder의 버전을 표시한 것이리라.
네번째 속성은 xsi:schemaLocation이라고 되어있는 속성인데, 속성의 이름은 schemaLocation이고 접두어로 xsi가 붙었다. 접두어는 어떻게 해석해야할까?? 그냥 앞에서 정의한 실제 값으로 치환해버리면 된다. 따라서 이 속성의 실제 이름은 http://www.w3.org/2001/XMLSchema-instance:schemaLocation이 된다. 무슨 뜻일까? 앞서 http:~~~~는 Namespace로 선언 되었다. 따라서 해당 Namespace에 이미 정의 되어 있는 schemaLocatino이라는 속성(요소)가 되겠다. 이것은 이미 XML표준에서 정의가 되어 있는 부분이므로, 현재 작성되고 있는 XML파일이 사용할 XML Schema의 위치를 알려주는 것이다. 그럼 이 속성에 할당된 값은? 그렇다
urn:Microsoft.PlatofrmBuilder/Catalog PbcXml600.xsd 다.  조금은 감이 오시는지?
혹시나 아직 감이 잘 안오시는 분들은 아마도 호기심이 덜하신 분이라 생각하여 위의 XMLSchema-instance URL에 들어갔을 때의 모양을 첨부해본다.
http://www.xfront.com/URLversusURN.pdf

의미는 Catalog XML파일의 Schema를 Instance화 하기 위해서(XML로 작성되기 위해서), XML Schema를 참고해야하는데, 그 Schema의 위치가 위와 같다는 것이다. 그 위치는 urn:Microsoft.PlatformBuilder/Catalog + PbcXml600.xsd 이다. 그래서 찾아보니 아래의 위치에 해당 파일의 이름이 있다. 그렇다면 "urn:Microsoft.PlatformBuilder/Catalog"는 아래의 설치 디렉토리가 되겠구나.

일단 Schema가 어디에 있는지는 확인해두었으니, 계속 첫째줄을 파악해나가보면.
SchemaLocation다음의 속성은 xmlns="urn:Microsoft.PlatformBuilder/Catalog"
이다. 의미는, Namespace이긴한데, 기본 네임스페이스가 바로 위의 값이 된다는 것이다.  ':'을 사용하여 Namespace를 명시하지 않은 모든 Element는 다 위의 값을 Namespace로 갖게되는 것이다. Class내부로 묶어버렸다고나 할까?

자 이제 아래줄부터는 모두 데이터이다. 이제 중요한 것은 바로 위에서 찾았던 XML Schema파일을 뒤져봐야 한다.
요것은 다음에 ^^;; 추가할께요. 너무 졸려서 =.=