Maystyle :
Admin : New post
Guestbook
Local
media
Catergories
Recent Articles
Recent Comments
Recent Trackbacks
Calendar
Tag
Archive
Link
Search
 
  윈도우즈 시작 (NTLDR, ntdetect.com, boot.ini) 
작성일시 : 2009. 9. 3. 00:25 | 분류 : Windows Server/Kernel

제 블로그 통계를 보니 NTLDR에 대해 궁금해 하는 분들이 꽤 많이 찾아오셨군요.
그래서 오늘은 이전 http://maystyle.tistory.com/463 에 이어서 글을 씁니다.
(제 미비한 영어 실력으로 인해 저자의 원 글을 100% 완역이 불가능하여 나름대로 해석하여 글을 씁니다. 잘못된 내용이 있을 가능성이 많으니 지적해 주시기 바랍니다.)

저번에는 POST 과정과 디스크 초기화 까지 다뤘죠?
디스크 초기화에서는 부팅 파티션을 찾아서 실행을 위한 정보까지를 준비해 줍니다.
자 이제 NTNDR 차례가 왔습니다. (Windows Vista 이후 버전에서는 winload.exe 로 변경 되었습니다.)

원문 : http://blogs.msdn.com/ntdebugging/archive/2007/06/28/how-windows-starts-up-part-the-second.aspx

이번에는 부트 로더 단계에 대해 이야기 하도록 하겠습니다. 이전에 다뤘던 내용을 한번 다시 상기해 보도록 하겠습니다. 먼저 컴퓨터는 POST 과정을 거친 후, MBR 코드를 실행 합니다. 해당 MBR의 활성 파티션을 정보를 확인 한 후 활성 파티션의 부트 섹터 코드를 실행 하고, NTLDR을 메모리에 로드 합니다.

부트 로더 단계는 NTLDR 실행 시 시작하게 됩니다.

1. NTLDR 은 프로세서를 Real mode 에서 32비트 flat memory mode로 변경합니다.
NTLDR은 16비트 컴포넌트(프로세서의 Protected mode 변환을 담당) 와 32비트 컴포넌트 (NTLDR의 나머지 Role들 담당) 로 이루어져 있습니다.

NTLDR은 Processor는 Real-Mode로 불리는 x86 실행 모드에서 실행됩니다. Real-Mode 에서는 가상 메모리 주소 변환이 일어나지 않습니다. 이는 모든 메모리 주소가 16bit 세그먼트 및 offset 포맷을 사용함을 의미합니다. 즉 이때는 오직 1MB 의 물리 메모리만이 접근 가능합니다. (16bit 세그먼트 주소 64KB 까지 표현할 수 있는 공간에 추가로 4bit offset이 붙어서 1MB까지 메모리 접근 공간이 확장됨) NTLDR은 이 Real-Mode 에서 Protected-Mode (32bit 메모리 접근 가능)로 CPU를 변환합니다.

*Trivia Alert* Protected-Mode로 들어가기전 우리는 A20 라인을 활성화 합니다. (시스템 bus 중 21번째 라인을 말함) IBM 친구들은 제가 무슨 말을 하는지 알 것입니다.

여전히 가상 메모리 주소 변환은 일어나지 않지만, 4GB의 물리 메모리에 대한 접근은 가능합니다.

2. NTLDR은 메모리 접근 및 페이징을 위한 16M 정도의 페이지 테이블을 만듭니다.

3. NTLDR은 페이징을 활성화 합니다. “Protected-Mode with Paging Enabled”는 Windows 가 정상 실행이 가능한 모드입니다.

4. NTLDR은 FAT 와 NTFS 미니 파일 시스템 드라이버를 시작합니다. 이는 부트 섹터의 파일 시스템 코드와는 다른데 NTLDR은 서브 디렉토리까지 읽을 수 있을 정도로 정교한 수준의 드라이버를 제공합니다.

Note: NTLDR에서는 IDE 장치만 지원 합니다. 즉 SCSI 장치 등은 지원 하지 않죠. SCSI 장치는 13h 인터럽트가 발생하게 되면 ntbootdd.sys 로드되어 접근이 가능하게 됩니다. ntbootdd.sys는 Windows의 미니 SCSI 포트 드라이버와 같습니다.

5. 만약 Windows 가 부팅되는 것이 아니고 이전의 hibernation 모드에서 살아나는 것이라면 NTLDR은 hibernator file (Hiberfil.sys) 를 찾게 되어 해당 내용을 메모리에 로드 하여 실행하게 됩니다.

Hyberbation 파일은 좀 흥미로운데, 일반적으로는 Hybernation이 되는 당시의 메모리 이미지를 갖고 있으나, Hiberfil.sys 다른 위치에 있는 경우 부팅 파티션의 Hiberfil.sys는 ARC Path 즉 진짜 Hybernation 파일의 위치를 가르키는 Path가 기록됩니다. ARC path 는 아래와 같은 Syntaxs를 사용합니다.

- linkmulti()disk()rdisk()partition()
- linksignature()disk()rdisk()partition()
- linkscsi()disk()rdisk()partition()

6. Hiberfil.sys가 발견되지 않은 경우 NTLDRT은 Boot.ini 단계를 실행합니다. 만약 Boot.ini에 1개 이상의 OS 및 부팅 옵션이 있는 경우 이는 부트 로더 화면에 Display 됩니다.

다음은 Windows 2000서버의 Boot.ini 샘플입니다.

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Windows 2000 Server" /fastdetect

ARC(http://support.microsoft.com/kb/102873) 는 ‘Advanced ROSC Computing’을 의미합니다.
ARC 는 “Multi”, “SCSI” 또는 “Signature” Syntax를 사용합니다.

“Multi” Syntax는 (IDE 장치에서 유효) Windows 에서 시스템 파일을 로드하려면 컴퓨터 BIOS를 사용해야 함을 나타냅니다. 즉, 운영 체제가 인터럽트(INT) 13 BIOS 호출을 사용하여 Windows NT 부팅에 필요한 NTOSKRNL.EXE 및 다른 파일을 찾고 로드하게 된다는 것을 의미합니다.

“SCSI” Syntax는 RISC와 x86 기반 컴퓨터 둘 모두에서 사용되며 Windows의 모든 버전에서 사용됩니다. SCSI() 표기법은 Windows가 부팅 장치 드라이버를 로드하고 해당 드라이버를 사용하여 부팅 파티션에 액세스하는 것을 나타냅니다. x86 기반 컴퓨터에서 사용되는 장치 드라이버는 NTBOOTDD.SYS이며, 이 파일은 시스템 드라이브(일반적으로 C 드라이브)의 루트에 있고 사용 중인 드라이브 컨트롤러용 장치 드라이버의 복사본입니다.

“Signature” Syntax는 SCSI 문법과 구문이 동일합니다. 다만 MBR의 Signature 값을 이용하여 OS를 지정한다는 점이 차이 입니다. Signature() 문법은 다음의 조건 중 하나가 존재할 때에만 사용됩니다.

- Windows 2000이 설치된 파티션이 ~7.8 GB 보다 크거나 해당 파티션 마지막 실린더 번호가 1024 보다 크고 시스템 BIOS 또는 부트 컨트롤러 BIOS가 INT13 익스텐션을 지원하지 않는 경우
- BIOS가 사용 불가능한 SCSI 컨트롤러에 Windows 2000이 설치된 드라이브가 연결되어 있어서 INT13 BIOS 호출이 부트 과정 동안에 사용될 수 없는 경우

7. 만약 Boot.ini를 찾지 못한 경우 NTLDR은 동일 파티션의 기본 위치 (C:\Windows)에 Windows가 인스톨 되어 있는 것으로 간주하고 부팅 프로세스를 진행합니다. 만약 C:\Windows 디렉토리가 없는 경우 다음과 같은 에러메세지를 화면에 표시 합니다. “Windows could not start because the following file is missing or corrupt: \winnt root\system32\ntoskrnl.exe”

8. 만약 Boot Loader 가 화면에 표시되면 부팅할 OS를 선택하여야 합니다.
a. 만약 사용자가 Windows XP/2003 이 아닌 Windows 95/98 이나 DOS를 선택한 경우 NTLDR은 Bootsect.dos 파일을 실행합니다.
(1) bootsect.dos 파일을 찾으면 NTLDR은 해당 파일을 RAM에 로드하고 Control을 넘깁니다.
(2) (1) 단계 이후 bootsect.dos 는 IO.sys, MSDOS.sys, Command.com 등등 하위 레벨의 OS을 위한 모듈을 실행 합니다.
(3) 만약 해당 파일을 못 찾은 경우 NTLDR은 아래의 오류를 화면에 표시 합니다.
”I/O Error accessing boot sector file multi(0)disk(0)rdisk(0)partition(1): \bootsect.dos”
b. 사용자가 Windows NT 베이스의 OS를 선택한 경우 NTLDR은 Ntdetect.com 을 실행합니다.
(1) 만약 ARC 경로가 시스템에 없는 하드디스크나 파티션을 가르키면 아래와 같은 메세지를 화면에 표시 합니다.
”Windows could not start because of a computer disk hardware configuration problem.  Could not read from the selected boot disk.  Check boot path and disk hardware.  Please check the Windows documentation about hardware disk configuration and your hardware reference manuals for additional information.”
(2) Signature() 구문을 이용한 경우 MBR이 바이러스 따위로 덮어 씌워 지거나 Corrupt되어 변경되면 Boot.ini의 Signature() 값과 같지 않을 수 있고, 이 경우에는 아래와 같은 메세지도 표시될 수 있습니다.
”Windows could not start because of the following ARC firmware boot configuration problem: did not properly generate ARC name for HAL and system paths. Please check the Windows documentation about ARC configuration options and your hardware reference manuals for additional information.”

9. Ntdetect.com은 모든 지원되는 하드웨어를 Detect 하고 초기화 합니다.
(문재 해결 팁: 윈도우즈 리소스킷 시디 않의 Debug.cab 파일에는 Ntdect.chk 라는 파일이 있습니다. 이 파일의 이름을 Ntdect.com 으로 변경하고 컴퓨터를 시작하면 Detecting 되는 모듈들을 확인 할 수 있습니다.)

Ntdetect.com 은 아래와 같은 모듀을 Detect 합니다.

a)    Computer ID
b)    Bus/adapter type
c)    Video adapter
d)    Keyboard
e)    Communications ports
f)     Floppy disks
g)    Mouse or other pointing devices
h)    Parallel ports

10. Ntdetect.com 은 로딩된 하드웨어 목록을 NTLDR에 넘깁니다.

11. 만약 /SOS 스위치가 있는 경우 NTLDR은 로드 되는 드라이버들의 이름을 화면에 표시합니다. 단 해당 목록이 초기화 되어 있지는 않습니다. 단지 메모리에 로딩 되었을 뿐입니다. 종종 MUP.sys가 로드된 후 Windows 가 Hang이 걸린다는 애기를 하는데 이는 사실이 아닙니다. 단지 화면의 마지막에 표시되는 모듈일 뿐입니다. 물론 /SOS를 통해 확인 할 수 있는 리스트들은 로딩될 잠제적인 멜웨어등을 확인 하게 해주는 등 매우 유용합니다.

12. NTLDR은 Ntoskrnl.exe 와 Hal.dll를 메모리에 로딩합니다. 다시 한번 강조하지만 로딩이 초기화를 의미 하지 않습니다.

13. NTLDR은 System registry hive를 메모리에 로드합니다. 만약 Windows 가 레지스트리 하이브를 로드하지 못할 경우에는 ERD (긴급 복구용 디스크) 나 윈도우즈 복구 콘솔을 통해 Windows\Repair 또는 Windows\Repair\RegBack 폴더에서 파일을 복구해야 합니다.

14. NTLDR은 HKLM\System\Select 키를 읽습니다.
a. 만약 Last Known Good 옵션이 선택되어 있지 않으면 NTLDR은 Control Set을 이용하기 위하여, Select Key의 “Default” 값을 찾습니다.
(0x1 = ControlSet001, 0x2 = ContolSet002, 0x3 = ControlSet003)
b. 만약 Last Known Good이 선택되어 있으면 NTLDR은 Control Set 을 사용하기 위하여 Last Known Good 을 찾습니다.

15. NTLDR 은 현재 사용하고 있는 HKLM\System\Select 키에 Current 값을 셋팅합니다.

Note: 이 시점에서 NTLDR이 어떤 ControlSet을 사용할 것인지 판단 됩니다. 그러나 “CurrentControlSet”에 대한 심볼릭 링크를 초기화 전까지는 사실 상 만들어진 것은 아닙니다. (초기화는 커널 부팅 시 일어납니다.) 그래서 전 NTLDR이 사용하기로 한 Controlset을 언급하기 위하여 “Active Control Set” 을 사용하겠습니다.

image

16. NTLDR은 HKLM\System\*ActiveControlSet*\Control\Nls\Codepage 의 “Acp”, “Oemcp”, 과 “Oemhal” 값을 스켄합니다. 이 엔트트리들은 동일 키단의 언어 정보 테이블을 가르키는 포인터 입니다. 그리고 이 포인터 값을 찾아가 필요한 nls 파일을 로딩합니다.

 image

코드 페이지는 특정 OS나 플랫폼의 문자열 셋입니다. 이 코드 페이지들은 문자들의 문자 코드로 구성되어 있습니다.

17. NTLDR 은 HKLM\System\*ActiveControlSet*\Control\Nls\Language 의 “Default” 값을 스켄합니다. 이 값도 역시 동일키의 언어정보 테이블을 가르키는 포인터 입니다.  NTLDR은 해당 파일을 로딩합니다. 기본 값은 L_intl.nls입니다.

18. NTLDR 은 HKLM\System\*ActiveControlSet*\Services 의 “Start” 값이 0x0 디바이스 드라이버를 스켄합니다. 또한 이 드라이버들의 Group 과 Tag 값도 찾습니다.

19 NTLDR 은 HKLM\System\*ActiveControlSet*\Control\ServiceGroupOrder 의 값을 확인하여 반드시 실행 되어야 될 서비스들을 정열합니다.

20. NTLDR은 드라이버들은 Group과 Tag 값으로 정렬합니다. 각각의 서비스나 드라이버는 자신이 속해야할 그룹이 지정되어 있습니다. 모든 드라이버는 Tag로 정렬된 특정 그룹에 속하게 됩니다.

21. NTLDR은 0x0 드라이버를 메모리에 로드 합니다.

22. 자 장기판은 이제 셋팅이 완료 됐습니다. 이제 장기 알들이 나서야 할 차례가 됐습니다. NTLDR은 Ntoskrnl.exe를 실행합니다.

|