'만들면서 배우는 OS커널의 구조와 원리/제1장 부트스랩'에 해당되는 글 2건

  1. 2013.06.02 1. OS 없이 프로그램을 시행시킨다
  2. 2013.06.02 Boot Record Signature AA55 Not Found




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
            [org 0]
            [bits 16]
 
            jmp     0x07c0:start                    ; far jump
 
start:
            mov     ax, cs                          ; cs에는 0x07c0이 들어있다.
            mov     ds, ax                          ; ds = cs
 
            mov     ax, 0xb800                      ; 비디오 메모리의 세그먼트를
            mov     es, ax                          ; es 레지스터에 넣는다.
            mov     di, 0                           ; 제일 윗줄 처음에 쓸 것이다.
            mov     ax, word [msgBack]              ; 써야 할 데이터의 주소 값을 지정한다.
            mov     cx, 0x07ff                      ; 0x07ff (10진수 2047)개의
                                                    ; word가 필요하다.
 
paint:
            mov     word [es:di], ax                ; 비디오 메모리에 쓴다.
            add     di, 2                           ; 한 word를 썼으므로 2를 더한다.
            dec     cx                              ; 한 word를 썼으므로 cx의 값을 하나 줄인다.
            jnz     paint                           ; cx가 0이 아니면 다시 나머지를 쓴다.
 
            mov     edi, 0                          ; 제일 윗줄의 처음에 쓸 것이다.
            mov     byte [es:edi], 'D'
            inc     edi
            mov     byte [es:edi], 0x16
            inc     edi
            mov     byte [es:edi], 'o'
            inc     edi
            mov     byte [es:edi], 0x16
            inc     edi
            mov     byte [es:edi], 'n'
            inc     edi
            mov     byte [es:edi], 0x16
            inc     edi
            mov     byte [es:edi], '1'
            inc     edi
            mov     byte [es:edi], 0x06
            inc     edi
            mov     byte [es:edi], '2'
            inc     edi
            mov     byte [es:edi], 0x06
            inc     edi
            mov     byte [es:edi], '3'
            inc     edi
            mov     byte [es:edi], 0x06
;           inc     edi
 
            jmp     $                               ; 이 번지에서 무한루프를 돈다.
 
msgBack     db      '.', 0x67
 
times 510-($-$$)    db      0                       ; 여기서부터 509번지까지 0으로 채운다.
            dw      0xaa55                          ; 510번지에 0x55를, 511번지에 0xaa를 넣어둔다.


실행 결과



Posted by 쿨한넘

원문 : http://support.microsoft.com/kb/149877/en-us


Intel 기반 컴퓨터는 시스템 BIOS에 따라 부트스트랩 코드를 로드하고 실행합니다. BIOS 부트스트랩 루틴은 플로피 또는 하드 디스크의 첫 번째 섹터(CHS에서 0:0:1)를 메모리의 세그먼트 주소 0000:7C00H에 로드하는 int 0x19를 생성합니다. 마스터 부트 레코드(MBR)라고 하는 첫 번째 실제(Physical) 섹터는 주 부트스트랩 로더 코드를 포함합니다.


섹터 0을 로드한 후 BIOS는 그 섹터의 마지막 2바이트가 디스크에 나타나는 대로 55AA인지 확인합니다. 이 55AA를 부트 레코드 서명이라고 하는데 이는 섹터를 읽을 때 일종의 EOF와 같은 역할을 합니다. 부팅할 때 BIOS는 이 부트 레코드 서명을 요구합니다. 부트 레코드 서명이 없으면 BIOS에 따라 다르지만 아래와 같은 메시지가 나타납니다.


부트 레코드 서명 AA55를 찾을 수 없습니다. xxyy 발견.


또는 아래와 같은 메시지가 나타나거나


시스템 디스크 또는 부팅 가능한 디스크가 아닙니다.


아래와 같은 메시지가 나타나거나


F1 키를 눌러 다시 부팅하십시오.


또는 시스템이 응답하지 않습니다. 

Posted by 쿨한넘