[OS만들기] day 20: 유저 모드와 콜 게이트
- basic/운영체제
- 2022. 11. 22.
# src/init.inc
SysCodeSelector equ 0x08
SysDataSelector equ 0x10
VideoSelector equ 0x18
TSSSelector equ 0x20
UserCodeSelector equ 0x28+3
UserDataSelector equ 0x30+3
# 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 부트코드까지 복습했음.
오랜만에 다시 운영체제를 하려고 하니까 기억이 잘 안 납니다..ㅠㅠ
'basic > 운영체제' 카테고리의 다른 글
[OS만들기] day 02: bootloader 만들기 (0) | 2022.11.22 |
---|---|
[OS만들기] day19: usermode task switching (0) | 2022.11.22 |
[OS만들기] day18: protection (0) | 2022.11.22 |
[OS만들기] day17: protection (0) | 2022.11.22 |
[OS만들기] day 16: CALL 명령에 의한 Task Switching (0) | 2022.11.22 |