Skip to content

usermode task switching

1
2
3
4
5
6
7
# 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
# 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