[CE 6.0의 OAL의 구성]
6.0에서 크게 바뀐 점 중에 하나가 이전에도 언급했었지만,
Kernel | OAL | KITL 의 분리가 아닌가 한다.
그에 따른 OAL의 변화된 부분 및 각각의 호출 관계를 소스를 이용하여 알아보겠다.
흠....어디부터 해야할지...난감하다 ㅋ
Kernel | OAL | KITL 이 분리가 되면서,
이들간의 통신을 위해서 stub라이브러리와, NKGlobal, OEMGlobal 등 이 사용되며,
OAL 생성 시, stub 라이브러리만 링크 시켜두면,
5.0 에서와 각 모듈에서 다른 모듈의 함수들을 그냥 사용 할 수 있다.
예를 들면, 1.OEMInit()등의 함수들은 KERNEL이 제공하는 함수호출을 위해서 과거
Bootloader로 부터 제어를 받거나, 전원이 인가 되었을 경우,
첫 실행 되는 과정으로 부터 OAL과 Kernel 간의 관계를 보겠다.
크게 보면 흐름은 다음과 같다.
__
OAL.LIB ↑
↓
NKLDR.LIB OAL.EXE
↓ ↓
KERNEL.DLL ↑
↓
OEMMAIN.LIB KERNEL.DLL
↓
KERNEL.DLL ↓
↓ ↑
OAL.LIB ↓OAL.EXE
--
[1] OAL.LIB
bootloader로 부터 제어를 받거나, 전원이 인가되었을 경우 최초로 수행 되는 소스가,
OAL의 Startup() 함수 이다.
경로 C:\WINCE600\PLATFORM\DEVICEEMULATOR\SRC\OAL\OALLIB\startup.s
이 함수를 Edit창에서 오픈해서, 'startup' 함수를 찾아보자.
이 함수의 주된 역활은 메모리등의 초기화 및 커널 호출이다.
함수의 마지막 부분을 보자.
※ g_oalAddressTable
: KernleStart를 호출하기 전에, 가상 주소와 물리주소간의 변환 정보를 담음.
[2] NKLDR.LIB
OAL로부터 제어를 받는 커널의 시작함수(KernelStart)를 가지고 있다.
MMU 초기화 => 가상메모리사용이 가능하게 CPU를 바꿈
KERNEL.DLL을 찾아서, 시작엔트리를 호출
경로 : C:\WINCE600\PRIVATE\WINCEOS\COREOS\NK\LDR\ARM\armstart.s
C:\WINCE600\PRIVATE\WINCEOS\COREOS\NK\LDR\ARM\arminit.c
( LDR 폴더에서 선택된 소스가 빌드되면, NKLDR.LIB가 생성
=> OAL.exe를 만드는데 꼭 필요한 LIB )
OAL.LIB('startup' ) 에서 호출 된 'KernelStart', KernelStart 는 armstart.s
잠시 휴식을...취해야겠다....덜덜덜 압박이 심해~!!!!!
여기까지가 OAL.EXE 모드.
Startup함수는 g_OalAddressTable의 주소를 파라미터로 정한뒤,
커널라이브러리(NKLDR.LIB)가 가진 KernelStart함수를 호출한다
6.0에서 크게 바뀐 점 중에 하나가 이전에도 언급했었지만,
Kernel | OAL | KITL 의 분리가 아닌가 한다.
그에 따른 OAL의 변화된 부분 및 각각의 호출 관계를 소스를 이용하여 알아보겠다.
흠....어디부터 해야할지...난감하다 ㅋ
Kernel | OAL | KITL 이 분리가 되면서,
이들간의 통신을 위해서 stub라이브러리와, NKGlobal, OEMGlobal 등 이 사용되며,
OAL 생성 시, stub 라이브러리만 링크 시켜두면,
5.0 에서와 각 모듈에서 다른 모듈의 함수들을 그냥 사용 할 수 있다.
예를 들면, 1.OEMInit()등의 함수들은 KERNEL이 제공하는 함수호출을 위해서 과거
처럼 커널함수들을 사용할 수 있다. 단, OEM.LIB에 NKSTUB.LIB이 반드시 존재해야 한다.
Bootloader로 부터 제어를 받거나, 전원이 인가 되었을 경우,
첫 실행 되는 과정으로 부터 OAL과 Kernel 간의 관계를 보겠다.
크게 보면 흐름은 다음과 같다.
__
OAL.LIB ↑
↓
NKLDR.LIB OAL.EXE
↓ ↓
KERNEL.DLL ↑
↓
OEMMAIN.LIB KERNEL.DLL
↓
KERNEL.DLL ↓
↓ ↑
OAL.LIB ↓OAL.EXE
--
[1] OAL.LIB
bootloader로 부터 제어를 받거나, 전원이 인가되었을 경우 최초로 수행 되는 소스가,
OAL의 Startup() 함수 이다.
경로 C:\WINCE600\PLATFORM\DEVICEEMULATOR\SRC\OAL\OALLIB\startup.s
이 함수를 Edit창에서 오픈해서, 'startup' 함수를 찾아보자.
이 함수의 주된 역활은 메모리등의 초기화 및 커널 호출이다.
함수의 마지막 부분을 보자.
; Execute KernelStart
add r0, pc, #g_oalAddressTable - (. + 8) ;가상 주소와 물리주소간의 변환 정보를 담음
bl KernelStart ; KernelStart => NKLDR 호출
bl KernelStart ; KernelStart => NKLDR 호출
ENTRY_END
LTORG
LTORG
※ g_oalAddressTable
: KernleStart를 호출하기 전에, 가상 주소와 물리주소간의 변환 정보를 담음.
[2] NKLDR.LIB
OAL로부터 제어를 받는 커널의 시작함수(KernelStart)를 가지고 있다.
MMU 초기화 => 가상메모리사용이 가능하게 CPU를 바꿈
KERNEL.DLL을 찾아서, 시작엔트리를 호출
경로 : C:\WINCE600\PRIVATE\WINCEOS\COREOS\NK\LDR\ARM\armstart.s
C:\WINCE600\PRIVATE\WINCEOS\COREOS\NK\LDR\ARM\arminit.c
( LDR 폴더에서 선택된 소스가 빌드되면, NKLDR.LIB가 생성
=> OAL.exe를 만드는데 꼭 필요한 LIB )
OAL.LIB('startup' ) 에서 호출 된 'KernelStart', KernelStart 는 armstart.s
잠시 휴식을...취해야겠다....덜덜덜 압박이 심해~!!!!!
여기까지가 OAL.EXE 모드.
Startup함수는 g_OalAddressTable의 주소를 파라미터로 정한뒤,
커널라이브러리(NKLDR.LIB)가 가진 KernelStart함수를 호출한다
'이것저것 > Windows CE' 카테고리의 다른 글
VisualStudio2005 Uninstall 순서 정리 (0) | 2007.04.16 |
---|---|
WinCE 5.0 과 Windows Embedded CE 6.0 의 차이점 (1) (1) | 2007.04.10 |
Windows CE5.0 BSP를 6.0 BSP로 포팅하기 (0) | 2007.04.04 |
Tip (0) | 2007.04.04 |
Booting 환경 (0) | 2007.04.04 |