Skip to content

day 20: 유저 모드와 콜 게이트

1
2
3
4
5
6
7
# src/init.inc
SysCodeSelector     equ 0x08
SysDataSelector     equ 0x10
VideoSelector           equ 0x18
TSSSelector             equ 0x20
UserCodeSelector    equ 0x28+3
UserDataSelector    equ 0x30+3
 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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# src/boot.asm
%include "init.inc"

[org 0]
    jmp 07C0h:start

start:
    mov ax, cs
    mov ds, ax
    mov es, ax
    mov ax, 0xB800
    mov es, ax
    mov di, 0
    mov ax, word [msgBack]
    mov cx, 0x7FF

paint:
    mov word [es:di], ax
    add di, 2
    dec cx
    jnz paint

read:
    mov ax, 0x1000      ; ES:BX = 1000:0000
    mov es, ax
    mov bx, 0

    mov ah, 2                   ; 디스크에 있는 데이터를 es:bx의 주소로
    mov al, 2                   ; 2섹터를 읽을 것이다.
    mov ch, 0                   ; 0번째 실린더
    mov cl, 2                   ; 2번째 섹터부터 읽기 시작한다.
    mov dh, 0                   ; Head=0
    mov dl, 0                   ; Drive=0, A: 드라이브
    int 13h                     ; Read!

    jc read                     ; 에러가 나면 다시 함

    mov dx, 0X3F2           ; 플로피디스크 드라이브의
    xor al, al              ; 모터를 끈다
    out dx, al

    cli

    mov al, 0x11            ; PIC의 초기화
    out 0x20, al            ; 마스터 PIC
    dw 0x00eb, 0x00eb   ; jmp $+2, jmp $+2
    out 0xA0, al            ; 슬레이브 PIC
    dw 0x00eb, 0x00eb

    mov al, 0x20            ; 마스터 PIC 인터럽트 시작점
    out 0x21, al
    out 0x00eb, 0x00eb
    mov al, 0x28            ; 슬레이브 PIC 인터럽트 시작점
    out 0xA1, al
    dw 0x00eb, 0x00eb

    mov al, 0x04            ; 마스터 PIC의 IRQ 2번에
    out 0x21, al            ; 슬레이브 PIC가 연결되어 있다
    dw 0x00eb, 0x00eb
    mov al, 0x02            ; 슬레이브 PIC가 마스터 PIC의
    out 0xA1, al            ; IRQ 2번에 연결되어 있다.
    dw 0x00eb, 0x00eb

    mov al, 0x01            ; 8086 모드를 사용한다.
    out 0x21, al
    dw 0x00eb, 0x00eb
    out 0xA1, al
    dw 0x00eb, 0x00eb

    mov al, 0xFF            ; 슬레이브 PIC의 모든 인터럽트를
    out 0xA1, al            ; 막아둔다.
    dw 0x00eb, 0x00eb
    mov al, 0xFB            ; 마스터 PIC의 IRQ 2번을 제외한
    out 0x21, al            ; 모든 인터럽트를 막아둔다.

    jmp 0x1000:0000

msgBack db '.', 0x67

times 510-($-$$) db 0
dw 0AA55h

p. 214 부트코드까지 복습했음.

오랜만에 다시 운영체제를 하려고 하니까 기억이 잘 안 납니다..ㅠㅠ