윈도우 CE 애플리케이션 영역과 커널 공간 [메모리 이해]

윈도우 CE 애플리케이션 영역과 커널 공간 [메모리 이해]


애플리케이션 영역


아래 그림은 윈도우 CE 애플리케이션 주소 영역을 나타낸다. 프로그램 영역은 각기 정해진 목적에 따라 다수의 영역으로 나뉜다. 첫 번째 영역은 프로그램 코드와 모든 메모리 할당을 담고 있는 하위 1GB의 주소 영역이다.


다른 윈도우 운영체제처럼 프로그램 코드는 0001 0000의 베이스 주소에서 상향으로 로드된다. 운영체제는 코드 위에서부터 프로그램이 사용할 정적 데이터 영역, 리소스 데이터, 로컬 힙을 위치시킨다. 여기에는 프로그램 주 스레드가 사용할 스택이 적어도 하나 이상 존재하고, 그 뒤에 보조 스레드용 스택이 온다.

스택, 힙, 직접 가상 할당 등 모든 메모리 할당은 프로그램 주소 영역의 최초 1GB 안에 위치한다.


4000 0000부터 5FFF FFFF까지의 512MB 영역은 여러 애플리케이션이 로드하는 DLL용 데이터와 코드를 위해서 예약되어 있다. 프로그램이 DLL을 로드할 때, 즉 애플리케이션이 로드되거나 LoadLibrary를 호출할 때 윈도우 CE는 이 영역을 DLL 용으로 맵핑한다.


시스템의 각 DLL은 이 영역 내에서 각기 정해진 유일한 주소에 로드된다. DLL의 주소는 모든 프로그램 간에 일관적이다.


예를 들어 프로그램 'A'가 BOB.DLL을 로드하고 프로그램 'B'도 BOB을 로드했다면 두 프로그램의 베이스 주소는 가상 주소 공간 내에서 같은 위치에 자리 잡는다.


애플리케이션 가상 주소 영역 다이어그램[애플리케이션 가상 주소 영역 다이어그램]


BOB을 로드하지 않은 프로그램 'C' 입장에서는 다른 프로그램이 BOB을 로드한 가상 주소는 할당되지 않은 영역처럼 보인다.


윈도우 CE 초기 버전에서 사용하던 기법과 달리 이 영역에는 첫 번째 DLL을 4000 0000에 로드하고 그 후의 DLL을 높은 주소로 로드하는 상향(bottom-up) 방식을 사용한다.


6000 0000에서 6FFF FFFF까지의 영역은 램 기반 메모리 맵 파일(RAM-based memory mapped file)이라는 메모리 맵 객체용 영역이다. 이 메모리 맵 '파일'은 어떤 실제 파일도 가지지 않는다. 이 객체는 주로 프로세스 간 통신용으로 사용되는 임시 메모리 버퍼다.


운영체제는 각 프로그램이 램 기반 메모리 맵 객체를 열 대 같은 객체는 같은 주소에 맵핑하는 기능을 제공한다. 이 기능을 위해서 램 기반 메모리 맵 파일을 위한 영역이 따로 필요하게 된 것이다. 이것은 지금은 제거된 기능은 공유된 대용량 메모리 영역(Large Memory Area)에 메모리 맵 파일을 할당하던 구 버전 윈도우 CE와 하위 호환성을 가진다.

운영체제가 메모리 맵 객체를 이 영역에 배치해 둔 상태에서 특정 프로그램이 메모리 맵 파일에 접근하려고 파일을 열면 관련 맵핑은 사용자 주소 공간의 1GB 위치에서부터 일어날 것이다.


7000 0000에서 7FFF 0000 영역은 공유 시스템 힙(share system heap)이라 한다. 이 영역은 운영체제가 애플리케이션으로 데이터를 넘길 때 사용한다. 애플리케이션은 이 영역을 읽기만 할 수 있지만 커널 모드에서 실행 중인 운영체제 컴포넌트는 읽기 쓰기를 모두 할 수 있다.


애플리케이션 영역의 가장 앞부분에 있는 1MB 영역은 '가드(guard)' 영역이다. 애플리케이션이나 운영체제 컴포넌트가 이 영역에 어떤 접근을 시도하면 운영체제가 예외를 발생시킨다.


윈도우 CE 커널 공간


상위 2GB 주소인 8000 0000 ~ FFFF FFFF는 운영체제용으로 예약되어 있고, 애플리케이션이나 사용자 모드에서 실행 중인 드라이버는 접근할 수 없다. 이 주소 영역은 운영체제나 운영체제가 로드한 커널 모드 드라이버가 사용한다.


아래 그림은 커널 모드 주소 영역 다이어그램이다.


커널 영역 메모리 맵 다이어그램[커널 영역 메모리 맵 다이어그램]


사용자 프로세스 영역처럼 커널이 사용하는 상위 2GB도 여러 영역으로 나뉜다.


처음 512MB 영역 8000 0000에서 9FFF FFFF까지는 물리 주소 영역에 맵핑되어 있다. 일부 CPU는 물리 주소 영역의 처음 512MB를 이 영역에 선형적으로 매핑한다. 그 밖의 CPU에서는 여러 물리 주소 영역을 가상 주소 영역에 맵핑시키는 주소 테이블이 존재하며 해당 테이블은 시스템 설계 시 제조업체에 의해 작성된다.


생성한 테이블은 윈도우 CE 시스템 부팅 시 사용되고 시스템 동작 중에는 변경되지 않는다. 이 영역에 대한 메모리 접근은 성능을 개선하기 위해 CPU의 데이터 캐시를 사용한다.


다음 512MB 영역인 A000 0000에서 BFFF 0000은 캐시가 사용되지 않는다. 성능은 느리지만 CPU 실행 중 값이 변경될 수 있는 디바이스 레지스터를 읽으려면 캐시를 하지 않는 접근 방식이 필요하다.


C000 0000에서 C7FF FFFF 영역은 커널 XIP(excute-in-place, 코드 저장 위치에서 즉시 실행) DLL용으로 사용한다. 여기에는 일반적으로 커널 모드 디바이스 드라이버와 함께 거의 모든 운영체제 시스템 코드가 위치한다. C800 0000에서 CFFF FFFF 영역은 오브젝트 스토어용으로 사용한다.


D000 0000에서 EFFF FFFF 영역은 가상 메모리 할당과 기타 메모리 요청을 위해 커널이 사용한다. SHx를 제외한 대부분의 CPU는 이 영역 전체를 사용할 수 있다. SHx는 이 중에서 DFFF FFFF까지만 사용할 수 있다. 마지막 F000 0000부터 메모리 영역의 꼭대기인 FFFF FFFF 영역은 시스템 관련 함수용으로 커널이 사용한다.


출처 - 윈도우 임베디드 CE 6.0 프로그래밍

윈도우 CE 애플리케이션 영역과 커널 공간 [메모리 이해]

이 글을 공유하기

댓글(0)

Designed by JB FACTORY