◆ 무한한 가능성/& WINCE

[펌글] Kernel & OAL

치로로 2009. 1. 12. 00:26

출처 ratharn's winceBlog | ratharn
원문 http://blog.naver.com/ratharn/20040298817

기본적으로 윈도 CE를 이용하여 커널(OAL영역) 개발 작업을 할 때 미리 알아야할 항목들을 나열해 본다면 다음과 같다.


* 윈도 CE를 이용할 때 작업해야 할 항목 알기 - 물론 처음부터 안다는 일은 불가능한 일이다. 본 그러므로 본 연재를 참고하여 작업 항목에 대해서 알면 된다. 윈도 CE에 대한 개발은 어떠한 것을 먼저 시작하는지 아는 것이 중요하다. 개발된 하드웨어를 가지고 처음 하는 일은 4월호에서 설명했듯이 eboot를 포팅 하는 것이고 커널에 대한 작업은 OAL 부분을 포팅 하는 것이다. 다음 표는 OAL에서 해야 할 내용들에 대해서 정리한 것이다.


<표 1, OAL 처리 항목 내용>

 작업 단계

작업 내용

1. OAL 구조 파악

\BSP\Src\Kernel\Oal 형식으로 저장되어 있는 OAL의 구조 및 OAL 구성 요소 파악

2. OAL 초기화 함수

OAL의 초기화(StartUp) 함수를 구현 한다

3. OAL 기본 함수 구현

InitClock(), OEMInit()과 같은 하드웨어 초기화 함수와

OEMDebugInit(), OEMWriteDebugByte()와 같은 디버깅 지원 함수들을 구현한다.

4. OAL 전원 함수 구현

동작 시 전류 최소화를 위한 OEMIdle() 함수와 전원을 최소화하기 위한 OEMPowerOff() 함수를 구현한다.

5. KITL

커널 디버깅을 위한 KITL 기능을 추가 한다. 시리얼 포트, 이더넷, USB 등을 사용할 수 있다.

6. 인터럽트 처리 함수 구현

인터럽트가 발생하였을 경우 처리하게 하는 OEMInterruptDisable(), OEMInterruptDone(), OEMInterruptEnable()등의 함수를 구현한다. 새로운 인터럽트에 대한 추가 작업이 될 것이다.

7. RTC 관련 함수 구현

RTC(Real Time Clock)이 있을 경우 윈도 CE에서 시간을 관리하기 위한 함수인 OEMGetRealTime(), OEMSetRealTime()등의 함수를 구현한다. 보통 백업 밧데리를 사용하여 주 전원이 꺼저도 동작하는 구조로 구성된다.

8. OEMIoControl

KernelIoControl() 함수를 이용하여 드라이버에서 커널에 대한 처리를 요청하거나 정보를 얻고자 할 경우 OEMIoControl 함수 내에 추가적인 구현을 통하여 사용할 수 있다.

9. 설정 파일

config.bib 설정을 통하여 운영체제 이미지의 크기, 시작 위치 등을 설정한다

10. 운영체제 이미지 생성

위의 사항이 제대로 반영 되어 동작하는지 확인하기 위해 운영체제를 만들고 테스트 한다.


* 인터럽트 처리 방법 알기 - 인터럽트를 어떻게 처리하는지를 아는 것은 운영체제를 이해하는데 있어 중요한 부분이다. 프로세서 혹은 쓰레드를 생성하고 관리하는 방법, 메모리(가상 메모리)를 관리하는 방법, 프로세서간의 통신 등 운영체제에서 기본적으로 제공하는 서비스들이 있다. 이러한 기본적인 운영 방식을 이해하는 것, 윈도 CE에서 어떻게 운영되고 있는지 확인하는 것은 윈도 CE를 개발하기 위한 첫걸음 이다. 윈도 CE 운영체제를 6.0 버전까지 오면서 인터럽트 처리에 대한 추상화 작업을 통해 손쉽게 하드웨어 및 소프트웨어 인터럽트를 처리 할 수 있도록 하였다. OEMInterruptEnable(), OEMInterruptDisable(), OEMInterruptDone()등의 기본적인 인터럽트 처리 함수에 처리하고자 하는 인터럽트를 등록하면 쉽게 인터럽트 처리 루틴을 만들 수 있다. 인터럽트 처리를 제대로 이해하는 것은 인터럽트를 사용하여 동작을 하는 디바이스 드라이버를 개발을 위한 중요한 시작이 되기 때문에 전체적인 개념을 철저히 아는 것은 중요한 요소이다. 제공된 BSP에는 물론 몇 가지 기본 인터럽트에 대한 처리 코드가 들어있기 때문에 초기에는 예제 코드를 바탕으로 새로운 인터럽트를 추가하는 형태로 인터럽트 처리 방법을 이해하고 추가 작업을 하면 된다.


* 초기화 방법 - 윈도 CE 운영체제가 초기 부팅하기 위해서는 운영체제를 위한 초기화 함수를 호출하게 된다. 대부분의 함수들은 운영체제 내부를 초기 화 하기 위한 함수들이어서 특별히 개발 시 관여할 일이 없지만 개발 하드웨어 초기화를 위한 OEMInit()이라는 함수 부분은 개발 시 채워야 하는 함수이다. 이 부분에서 정확히 어떤 역할을 해 주어야 하는지 이해가 필요하다. 함수가 의미 하는 것처럼 개발하는 하드웨어의 프로세서나 장착된 장치를 초기화 하는 용도로 사용될 수 있다. 윈도 CE 커널이 동작되기 전에 하드웨어적으로 설정할 부분이 있을 때 이용할 수 있다. 윈도 CE 운영체제에서는 기본적인 초기화(메모리, 포트)는 부트로더에서 대부분 시행하게 된다. 이 때문에 부트로더에서 하지 않은 초기화 부분을 담당하게 된다. 필자는 이 영역에 LCD를 초기화하고 회사의 로고를 출력하는 루틴을 추가 하였다. 윈도 CE 운영체제가 부팅하기 위해서는 약 5초에서 10초 정도의 시간이 필요하다. 이 시간동안 로고를 보여 주면서 윈도 CE 운영체제가 부팅하고 있음을 사용자에게 알려주는 것이다.


* OEM 구현 함수들 이해하기 - OEMInit()과 같이 윈도 CE 운영체제를 제대로 하드웨어에 맞게 동작시키기 위해서는 구현해 주어야하는 OEM 함수들이 있다. 앞에서 설명 했던 것처럼 개발하는 하드웨어에 맞추어 OAL 함수들을 구현하는 과정이 필요하다. OAL 함수에는 필수적으로 구현해야 하는 OAL 함수들과 선택적으로 구현해야 하는 OAL 함수로 구분되어 있다. 대부분의 프로세서 제조업체는 BSP를 제공할 때 필수적으로 구현해야 하는 OAL 함수들은 구현이 된 상태로 제공을 한다. BSP에서 구현된 OAL 함수의 내용을 확인하고 추가로 구현할 OAL 함수에 대해서 추가 구현하는 것을 작업 방향으로 삼으면 된다. 추가 구현 OAL 함수들은 프로세서에 따라 구현하는  차이가 있기 때문에 MSDN의 내용을 확인하면서 구현해야 한다. 사실 추가 구현 OAL 함수들은 구현을 안 해도 운영체제의 기본 동작에는 문제가 안 된다. 하지만 엄밀히 따지면 모두 제대로 구현해야 하는 함수들이다. 단지 BSP 제공에 있어 모든 기능을 구현할 수 없기 때문에 덜 구현된 것뿐이다. 이전에 OEM 함수가 제대로 구현되지 않은 사실을 모르고 인증을 위한 테스트를 진행하였다가 테스트를 다시 해야 했던 경험이 있다. BSP를 지나치게 믿었다는 데에 문제가 있었다. 현재 대부분의 업체에서 안정화된 BSP를 제공하기 때문에 문제가 되지는 않다고 생각하지만 개발 시 BSP에 대한 맹신은 금물이다.


* 이미지 설정 방법 알기 - 윈도 CE 운영체제는 보통 플래시 메모리에 탑재된다. 따라서 이미지는 플래시 메모리의 크기에 맞추어 사이즈가 조절이 되고 어디서부터 시작하는지 정하게 된다. 윈도 CE 운영체제로 생성되는 이미지를 어떻게 설정할지? 어떻게 구성되는지 이해하는 것이 기본적인 접근 방법이다. 일반적인 PC 운영체제와 다른 임베디드 시스템만이 가지는 대표적인 구조 차이점이다. PC용 운영체제는 여러 개의 파일이 하드디스크나 DVD에 저장되는 구조로 구성되어 있다. 반면 윈도 CE이미지는 플래시와 같은 메모리 장치에 설치되는 운영체제이기 때문에 하나의 이미지 파일로 구성이 되고 거기에 동작에 필요한 각종 파일 및 정보가 기록되게 된다. 또한 대량 생산을 위해 플래시에 직접 라이팅이 가능한 형태로도 이미지도 만들 수 있어야 한다. 이러한 점은 PC에서 개발했던 개발자들이 임베디드 시스템 개발로 전환 했을 때 이해하기 힘든 점 중 하나이다. 다음은 윈도 CE에서 운영체제 이미지를 설정하기 위한 “Config.bib" 파일을 예를 보인 것이다. 윈도 CE는 config.bib에서 지정된 운영체제의 시작 위치, 운영체제 이미지의 크기에 따라 최종 운영체제 이미지를 생성하게 된다.


MEMORY

 

;   Name             Start          Size           Type

;   -------          --------       --------       ----

    RSVD             80000000       000FF000       RESERVED   

    ARGS             800FF000       00001000       RESERVED

    NK               $(NK_START)    $(NK_SIZE)     RAMIMAGE

    RAM              $(NKRAM_START) $(NKRAM_SIZE)  RAM


* 윈도 CE 운영체제 설정을 위한 레지스터리(Registry) 파일 내용 알기 - PC 환경 설정을 위해서 레지스터리를 사용한다. PC와 동일한 구조와 내용으로 생각하면 된다. 다른 점이라면 PC에 비해 레지스터리의 세부 항목들을 알아야 한다는 것이다. PC의 경우 설치된 장치에 대한 드라이버는 주변장치 업체에서 설치 패키지 형태로 제공해준다. 윈도 CE에서는 직접 드라이버도 작성하고 설정도 변경하여야 하기 때문에 레지스터리를 어떻게 설정하고 구성하는지에 대한 지식이 필요하다. 다음은 BSP내에 오디오를 담당하고 있는 드라이버에 대한 레지스터리 등록 정보의 예를 보인 것이다. PC의 경우 이러한 등록 정보를 “새 하드웨어 설치”라는 메뉴를 통해 하드웨어를 탐색하고 자동 설치하게 되지만 윈도 CE 개발 중에는 BSP내에 있는 “Platform.reg"라는 레지스터리를 모아둔 레지스터리 파일에 직접 기록하여 운영체제 이미지 생성 시 레지스터리 값이 반영되도록 해야 한다.

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\WaveDev\]

   "Prefix"="WAV"

   "Dll"="mainstoneii_wavedev.dll"

   "Index"=dword:1

   "Order"=dword:0

   "Priority256"=dword:95

   "Sysintr"=dword:19

   "IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}"  ; power managed device