2009년 06월 02일
[WinCE 5.0/6.0] Hive-Based Registry 사용하기
RAM기반의 Object Store가 구현되어 있는 CE기기에서는 Registry 설정이 Object Store(RAM)에 저장되기 때문에 전원공급이 중단될 경우(cold boot) 모든 설정이 기본값으로 돌아가게 됩니다. 따라서 사용자가 변경한 Registry 설정을 보존해야 할 경우 Hive-based Registry를 사용 하여야 합니다.
Hive-Based Registry를 사용하기 위해서는 Hive-based Registry Catalog아이템을 OS에 포함시켜야 하고 Registry가 저장될 장치에 대한 드라이버 컴포넌트와 파일 시스템에 대한 component도 추가합니다.
먼저 Hive-based Registry를 구현하기 위한 세부 설정들에 대해 알아보고, 실제 x86기반 보드의 USB Flash memory에 Registry를 저장시키는 방법을 적용해 보겠습니다.
1. Hive-Based Registry 시작 순서
Registry를 외장 파일 시스템에 저장하는 것은 시스템이 부팅되는 동안 발생되는 이벤트들의 순서를 복잡하게 만듭니다. 예를 들어, Registry 설정이 저장되어 있는 미디어(HDD, Flash등)에서 Registry 설정을 가져오기 위해서는 해당 미디어에 대한 드라이버가 로드 되어야 하는데, 드라이버가 로드 되기 위해서는 반대로 Registry 설정이 필요합니다. 이 문제에 대한 해결 방법으로 Hive-Based Registry환경에서는 미디어에 저장된 시스템 하이브(System.hv)에 접근하기 위해 부트 하이브(Boot.hv)를 이용해 필요한 일부 드라이버들을 먼저 로드 하는 방법을 사용합니다.
부트 하이브는 ROM(OS image: NK.bin)에 저장되어 있고 따라서 boot되는 동안 변경될 수 없습니다. 부팅 과정에서 드라이버가 부트 하이브를 변경시키면, 이 변경은 시스템 하이브에 적용되게 됩니다. 하지만 다음 부팅 때, 부트 Registry는 ROM에 있는 기본값으로 되돌려 질 것입니다.
Hive-Based Registry환경에서는 시스템이 드라이버를 로딩하는 것을 두 개의 부트 단계(boot phase)로 나눌 수 있습니다. 첫 번째 부트 단계에서 부트 Registry에 정의된 작은 드라이버들의 묶음이 로드 됩니다. 이 드라이버들이 바로 시스템 Registry가 저장된 파일시스템에 접근하기 위해 필요한 드라이버들 입니다.
첫 번째 단계에서 필요한 Registry들이 전부 로드 되었을 때, 두 번째 부트 단계가 시작되고 또 다른 드라이버들의 로딩이 시작됩니다. 첫 번째 부트 단계에서 이미 로딩된 드라이버들이 두 번째 부트단계에서 다시 로딩되는 것을 방지하기 위해 특정 flag값을 사용하게 됩니다.
이 드라이버들은 ROM에 위치한 부트 Registry를 통해 시작되기 때문에, 드라이버들은 절대 변하지 않는 기본값들로 시작됩니다. 만약 이 드라이버들을 기본값 이외의 값으로 설정하고자 한다면, 이 드라이버들은 두 번째 단계까지 기다려서 Registry 설정을 다시 읽어야 합니다.
파일 시스템 프로세스(Filesys.exe)는 부트 Registry를 가져오고, Device.exe를 시작하고, 시스템 Registry를 가지고 있는 파일시스템이 준비될 때까지 기다립니다. Device Manager(Device.exe)는 부트Registry에 지정된 몇몇 드라이버들을 로드하고 시스템 Registry가 사용 가능해질 때까지 기다리게 됩니다.
시스템 Registry를 포함하고 있는 파일 시스템의 드라이버는 bootable flag가 설정되어 있어야만 하고, 이것으로 Filesys.exe는 어떤 파일 시스템을 기다려야 하는지 알 수 있습니다. 파일 시스템이 준비가 되면 해당 파일 시스템에 있는 시스템 Registry가 로드 됩니다.
시스템 Registry가 다음 단계를 진행할 준비가 되고, Filesys.exe에 의해 어플리케이션들이 시작될 때가 두 번째 부트 단계의 시작입니다. 이 때 System/BootPhase2 이벤트가 두 번째 단계의 드라이버 로딩하도록 설정합니다. 이 이벤트는 Device.exe가 시스템 Registry 설정에 따라 드라이버들을 re-enumerate하도록 합니다.
아래 그림은 시작 순서를 구체적으로 보여줍니다.


Device.exe는 드라이버들을 re-enumerates하고 시작합니다. Filesys.exe는 나머지 초기화 key에 있는 나머지 어플리케이션들을 시작합니다.
다음으로 해야 할 작업은 하이브 설정이 제대로 적용되기 위해 OS디자인의 Common.reg의 아래 설정을 확인하는 부분입니다.
[HKEY_LOCAL_MACHINE\init\BootVars]
"SystemHive"="<your system hive location>"
"ProfileDir"="<your user hive location>"
"Flags"=dword:<your value>
SystemHive는 시스템 하이브 파일(System.hv)의 위치와 이름에 대한 정보를 가지는 키값입니다. 파일이 저장될 파일시스템의 이름은 포함하지 않습니다. 파일 시스템에 대한 정보는 다른 Registry 키를 사용해 시스템이 결정하게 됩니다.
일반적으로 “System.hv” 또는 "Documents and Settings\System.hv"를 사용합니다.
"SystemHive"="Documents and Settings\\system.hv"
ProfileDir은 사용자 프로파일 파일의 위치를 설정합니다. 일반적으로 "System.hv" 또는 "Documents and Settings\System.hv"를 사용합니다.
"ProfileDir"="Documents and Settings\\system.hv
Flags값은 어느 부팅 단계(boot phase)에서 Storage Manager 또는 Device Manager가 시작될지, 해당 레지스트가 hive-base Registry에서 영향을 받는지, 외장 ROM의 Registry에 영향을 받는지를 알립니다. 이 값은 “Start DevMgr”값을 대체합니다.
<”Flags”값 테이블>
Flag 비트 설명
0x00000001 Storage Manager를 첫 번째 부트 단계에서 시작하고 hive-based Registry를 로드.
0x00000002 Device Manager를 첫 번째 부트 단계에서 시작하고 hive-based Registry를 로드
0x00000004 Storage Manager를 첫 번째 부트 단계에서 시작하고 BINFS같은 외장 ROM의 Registry를 로드.
0x00000008 Device Manager를 첫 번째 부트 단계에서 시작하고 BINFS같은 외장 ROM의 Registry를 로드.
Flags비트는 값들을 조합하여 사용 가능합니다.
예를 들어서 "Flags"=dword:3 은 bit 1과 bit 2의 합이며 "Start DevMgr"=dword:1 설정과 동일한 의미입니다.
만약 Flags값이 설정되어 있지 않은 경우, Device Manager와 Storage Manager는 시작되지 않고 Hive는 Object Store(RAM)에 저장되게 됩니다.
Object Store에 저장된 Hive데이터들은 시스템이 cold boot하면 전부 사라지기 때문에 hive데이터들은 보통 RAM이외의 저장장치에 저장하며, 이를 위해 Device Manager를 이용해야 합니다.
HKEY_LOCAL_MACHINE\init\BootVars에 위치하게 되는 DefaultUser값은 불러올 기본 사용자 하이브를 결정하게 됩니다.
DefaultUser는 시스템이 부팅되었을 때 기본 profile로 사용될 사용자 이름으로 설정됩니다.
만약 사용자 이름이 이미 존재한다면, 해당 사용자 하이브를 불러옵니다. 새로운 사용자라면 해당 사용자 profile이 생성되게 됩니다.
[HKEY_LOCAL_MACHINE\init\BootVars]
"DefaultUser"="<username>"
첫 번째 부팅 단계에서 로딩될 드라이버들이 제대로 HIVE BOOT SECTION으로 묶여있는지 확인합니다.
; HIVE BOOT SECTION
<your Registry settings>
; END HIVE BOOT SECTION
첫 번째 부팅 단계에서 로딩되는 각 드라이버의 flag 비트를 설정합니다.
[HKEY_LOCAL_MACHINE\Drivers\...]
"Flags"=dword:1000
이 flag는 기존 설정에 대한 OR 비트마스크 입니다. Device Manager는 이 값으로 첫 번째 부팅 단계에서 드라이버를 로드하고 두 번째 부팅단계에서 다시 로딩하여 드라이버가 두 번 로딩되는 것을 막아줍니다.
마운트 파티션 flag를 bootable로 설정하여야 합니다.
Windows CE 5.0이후 버전에서는, MountAsBootable Registry를 DWORD:1 로 설정합니다. 이전 버전에서는 MountFlags Registry 값을 DWORD:2로 설정합니다.
이 값을 파일시스템 드라이버의 Storage Manager 프로파일에 설정함으로써 해당 저장장치에 Registry가 저장되게 됩니다.
예를 들어, 만약 MyFileSystem드라이버를 사용하는 MyProfile 저장 장치에 하이브를 설정하고 싶다면 MountAsBootable 또는 MountFlags를 아래 Registry 키에 설정하면 됩니다.
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\<MyProfile>\<MyFileSystem>]
Hive-based Registry를 적용한 상태라면 시스템이 shutdown될 때 자동적으로 Registry의 내용을 저장장치에 flush합니다. 그럼에도 불구하고 시스템의 전원이 갑자기 꺼져서 flushing이벤트가 발생하지 못했다면 설정된 데이터를 날려버릴 수 있습니다.
이를 방지하기 위해서는 개발자가 필요하다고 생각되는 때마다 RegFlushKey함수를 호출하거나, HKEY_LOCAL_MACHINE\init\BootVars의 “RegistryFlags” 키를 이용하는 Aggressive Registry를 통해 Aggressive flushing을 할 수 있습니다.
Aggressive flushing은 또한 flush-on-close라고 불리는데, OS가 RegCloseKey가 호출될 때마다 RegFlushKey를 호출하게 됩니다. RegCloseKey는 시스템이 Registry를 참조하거나 변경한 후 Registry Handle을 닫을 때 호출되는 API입니다.
“RegistryFlags”=dword:1로 설정하여 flush-on-close를 설정할 수 있습니다. 만약 이 키 값이 설정되어 있지 않다면 기본적으로 Aggressive flush를 수행하지 않습니다.
이 글과 관련있는 글을 자동검색한 결과입니다 [?]
- 보다 빠른 리눅스 부팅을 위한 애플리케이션 병렬화 (한글) by 붉은돼지
- 레지스트리 권한 변경 명령어 by IntoTheSec
- [Tip] Home Screen에서 Soft Key mapping 바꾸는 방법 by spec
- 리눅스 부팅 by kanemochi
- Windows Server 2008 Test Driving by 쌍부라
# by | 2009/06/02 00:57 | 직장 | 트랙백 | 덧글(0)




☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]