Skip to content

jschang0215/OS-Tutorial

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

2 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

OS from Scratch

Carlos Fenollosa @cfenollosa๋‹˜์˜ os-tutorial, University of Birmingham์˜ Nick Blundell๋‹˜์˜ Writing a Simple Operating System - from Scratch, OS-Dev Wiki์˜ Creating an Operating System์„ ์ฐธ๊ณ ํ•ด ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ๋…ธํŠธ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” cfenollosa๋‹˜์˜ os-tutorial์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  os-tutorial์—์„œ ์„ค๋ช…ํ•˜์ง€ ์•Š์€ ํ•„์š”ํ•œ ์ด๋ก ๋“ค์„ Nick Blundell๋‹˜์˜ ์ž๋ฃŒ์™€, OS-Dev Wiki๋ฅผ ์ฐธ๊ณ ํ•ด ์ €์˜ ํ‹ฐ์Šคํ† ๋ฆฌ์— ํ•œ๊ตญ์–ด๋กœ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Requirements

๋ณธ ์ž๋ฃŒ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ ์ง€์‹์ด ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ์ดˆ์ ์ธ C์–ธ์–ด ์ง€์‹ (ํ•จ์ˆ˜, ํฌ์ธํ„ฐ, ๋ฉ”๋ชจ๋ฆฌ)
  • ์•ฝ๊ฐ„์˜ Assembly ์ง€์‹ (mov, ๋ ˆ์ง€์Šคํ„ฐ, Label ์‚ฌ์šฉ, jmp, loop)
    • ์ž์„ธํ•œ ๋‚ด์šฉ๋“ค์€ ์ฝ”๋“œ๊ฐ€ ๋“ฑ์žฅํ•  ๋•Œ๋งˆ๋‹ค ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค
  • ์—ด์ •!

How to use this tutorial

๋ณธ ์ž๋ฃŒ๋ฅผ 100% ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ‹ฐ์Šคํ† ๋ฆฌ์˜ ํฌ์ŠคํŠธ ๋ฒˆํ˜ธ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ผ ์ด๋ก ๊ณผ ์ฝ”๋“œ๋ฅผ ์ตํžˆ๊ณ , ๋” ์ž์„ธํ•œ ์ฝ”๋“œ๋Š” ํ•ด๋‹น ํฌ์ŠคํŠธ ๋ฒˆํ˜ธ์˜ cfenollosa๋‹˜์˜ os-tutorial ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด๋ก 

๋ณธ ์ž๋ฃŒ์— ์‚ฌ์šฉ๋˜๋Š” ์ด๋ก ๋“ค์„ ๋ชจ๋‘ ๋ชจ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ๋“ค์€ ์ €์˜ ํ‹ฐ์Šคํ† ๋ฆฌ์—์— ํ•œ๊ตญ์–ด๋กœ ์ •๋ฆฌ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

BIOS

BIOS๋Š” ๋ถ€ํŒ… ์‹œ ํ•˜๋“œ์›จ์–ด๋ฅผ ํ™•์ธํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ปดํ“จํ„ฐ๊ฐ€ ๋ถ€ํŒ…ํ•  ๋•Œ ์งง๊ฒŒ ๋ฒจ์†Œ๋ฆฌ๊ฐ€ ๋“ค๋ฆฌ๋Š” ๊ฒƒ์ด BIOS๊ฐ€ ํ•˜๋“œ์›จ์–ด์— ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ธ์‹ํ•œ ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค.

Boot Sector

Boot Sector๋Š” Kernel์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. Boot Sector๋Š” ๋””์Šคํฌ์—์„œ ๊ฐ€์žฅ ์•ž์—๋Š” 512byteํฌ๊ธฐ๋กœ ์žˆ์Šต๋‹ˆ๋‹ค. Boot Sector์˜ ๋งˆ์ง€๋ง‰์€ 0xAA55๋กœ ๋ผ์žˆ๋Š”๋ฐ, ์ด๋Š” BIOS๊ฐ€ ๋””์Šคํฌ๊ฐ€ ๋ถ€ํŒ… ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ฐ•์˜์—์„œ ๋‹ค๋ฃฐ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ์˜ Boot Sector๋Š” ์ฒ˜์Œ 3๊ฐœ byte๋Š” ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ๋งˆ์ง€๋ง‰ 2byte๋Š” 0xAA55์ž…๋‹ˆ๋‹ค. ๊ฐ€์šด๋ฐ ์žˆ๋Š” ๊ฐ’์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ค๋‹ˆ๋‹ค.

Little Endian

x86์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ปดํ“จํ„ฐ๋Š” Little Endian๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Little Endian์€ ํ•œ ๋‹จ์œ„์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋ ๋•Œ ๊ฑฐ๊พธ๋กœ ๋ฐฐ์—ด๋˜๋Š” ํ˜•ํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด 0xAA55๋ฅผ ์ €์žฅํ•˜๋ฉด 55 AA๋กœ ์ €์žฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋งํฌ ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Assembly $, $$ ๋ช…๋ น์–ด

$๋Š” Assembly์—์„œ ํ˜„์žฌ ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, $$๋Š” ์ฒ˜์Œ ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

times 510-($-$$) db 0

์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์œ„ ์ฝ”๋“œ์˜ ์˜๋ฏธ๋ฅผ ๋ถ„์„ํ•ด๋ด…์‹œ๋‹ค. times๋Š” ์–ด๋–ค ๊ฐ’์„ ๋ฐ˜๋ณตํ•ด ์ƒ์„ฑํ•˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค. ($-$$)๋Š” ์ฒ˜์Œ ์œ„์น˜์—์„œ ํ˜„์žฌ ์œ„์น˜๊ฐ€ ๋–จ์–ด์ง„ ๊ฑฐ๋ฆฌ, ์ฆ‰ ํ˜„์žฌ ์œ„์น˜ ์•ž์— ์กด์žฌํ•˜๋Š” byte๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Boot Sector๋Š” ์ด 512byte์ด๊ณ  ๋งˆ์ง€๋ง‰ 2byte๋Š” 0xAA55์ด๋ฏ€๋กœ, 510byte์—์„œ ๋ฌดํ•œ ๋ฃจํ”„ ์ฝ”๋“œ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€๋Š” 0์œผ๋กœ ์ฑ„์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌดํ•œ ๋ฃจํ”„ ์ฝ”๋“œ์˜ ๊ธธ์ด๊ฐ€ $-$$์ด๋ฏ€๋กœ 510-($-$$) ๋งŒํผ 0์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

TTY Mode

TTY Mode๋Š” ์ผ๋ฐ˜ CLI ์ฝ˜์†” ํ™˜๊ฒฝ์„ ์˜๋ฏธํ•˜๋ฉฐ, ah ๋ ˆ์ง€์Šคํ„ฐ์— 0x0e๋ฅผ ๋Œ€์ž…ํ•˜๋ฉด TTY Mode๋กœ ์ง„์ž…ํ•œ๋‹ค.

Interrupt

Interrupt๋Š” ์žฅ์น˜๋‚˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ OS๋กœ ๋ณด๋‚ด๋Š” ์‹ ํ˜ธ๋กœ OS์—๊ฒŒ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์„œ๋น„์Šค๋ฅผ ๋ฉˆ์ถ”๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ปดํ“จํ„ฐ๋Š” ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ ๋ฐ–์— ์‹คํ–‰ํ•˜์ง€ ๋ชปํ•˜๋Š”๋ฐ, Interrupt๋ฅผ ํ†ตํ•ด Multi Taskingํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ๊ฐ•์ขŒ์—์„œ๋Š” ๋ฌธ์ž๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด 0x10 Interrupt๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. al ๋ ˆ์ง€์Šคํ„ฐ์— ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  int 0x10๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด interrupt๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด al ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ๋œ ๊ฐ’์ด ๋น„๋””์˜ค ์„œ๋น„์Šค๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

BIOS๋Š” Boot Sector๋ฅผ 0x7c00์ฃผ์†Œ๋ถ€ํ„ฐ ์ฑ„์šฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ณ ๋ คํ•ด Boot Sector๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Assembly org ๋ช…๋ น์–ด

[org 0x7c00]

์œ„ Assembly ์ฝ”๋“œ๋Š” ๋ชจ๋“  Assembly์ฝ”๋“œ์—์„œ 0x7c00๋งŒํผ offset์„ ์„ค์ •ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด ์ดํ›„ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์—์„œ 0x7c00๋งŒํผ์˜ ์ฃผ์†Œ๊ฐ€ ๋”ํ•ด์ ธ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.

Assembly Stack

bp๋ ˆ์ง€์Šคํ„ฐ๋Š” Stack์˜ Bottom์„ ์˜๋ฏธํ•˜๋ฉฐ, sp๋ ˆ์ง€์Šคํ„ฐ๋Š” stack์˜ top์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ Stack์€ bp์—์„œ ์‹œ์ž‘ํ•ด ์•„๋ž˜๋กœ sp๊นŒ์ง€ ์ž๋ผ๋‚˜๋Š” ๊ตฌ์กฐ์ด๋ฉฐ, Stack์— ์›์†Œ๋ฅผ ๋„ฃ์„์ˆ˜๋ก sp๊ฐ€ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. Stack์˜ ์›์†Œ๋Š” push, pop์„ ์ด์šฉํ•ด ๋„ฃ๊ณ  ๋นผ๋ฉฐ, words, doublewords ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Assembly pusha, popa

pusha๋Š” ๋ชจ๋“  ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ๋œ ๊ฐ’์„ Stack์— ์ €์žฅ, popa๋Š” Stack์— ์ €์žฅ๋๋˜ ๋ชจ๋“  ๊ฐ’์„ ์›๋ž˜ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์— ์˜ฎ๊ฒจ ์›๋ž˜ ์ƒํƒœ๋กœ ๋Œ๋ ค๋†“๋Š” ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.

Assembly ๋ฌธ์ž์—ด

Assembly์—์„œ ๋ฌธ์ž์—ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

HELLO:
    db 'Hello World',0x00

์ด๋•Œ ๋ฌธ์ž์—ด์˜ ๋์—๋Š” 0x00 Null ๋ฌธ์ž๋ฅผ ์‚ฝ์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Assembly์—์„œ newline์€ 0x0a (Newline) + 0x0d (Carriage Return)์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

mov ah, 0x0e
; newline ๋ฌธ์ž 
mov al, 0x0a
int 0x10
; carriage return ๋ฌธ์ž 
mov al, 0x0d
int 0x10

Assembly์—์„œ ๋‹ค๋ฅธ ํŒŒ์ผ ์‚ฌ์šฉ

Assembly ์ฝ”๋“œ์—์„œ ๋‹ค๋ฅธ ํŒŒ์ผ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

%include โ€œํŒŒ์ผ๋ช….asmโ€
์ด๋•Œ ์ฝ”๋“œ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” Label์˜ ์œ„์น˜๋ฅผ ์ฃผ์˜ํ•˜๋ฉฐ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Assembly ror

0x1234์„ ror ์—ฐ์‚ฐํ•˜๋ฉด ๊ฐ’์€ 0x4123๋กœ ๋ณ€ํ™˜๋˜๊ณ  ror ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•˜๋ฉด 0x3412, 0x2341, 0x1234๋กœ ๋ฉ๋‹ˆ๋‹ค.

Segmentation

Segmentation์€ 03. Boot Sector Memory์—์„œ ์„ค๋ช…ํ–ˆ๋˜ offset์„ ์„ค์ •ํ•˜๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. Segmentation์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ์— offset์„ ์„ค์ •ํ•˜๋ฉฐ Segment๋ฅผ ์ €์žฅํ•˜๋Š” ๋ ˆ์ง€์Šคํ„ฐ๋กœ๋Š” cs, ds, ss, es๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ž์„ธํ•œ ์ •๋ณด๋Š” https://wiki.osdev.org/Segmentation ์„ ์ฐธ์กฐํ•ด๋ณด์„ธ์š”.

Segment์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์€ ์•ฝ๊ฐ„ ํŠน์ดํ•ฉ๋‹ˆ๋‹ค. Segment๊ฐ€ 0x4d, ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ 0x20์ด๋ฉด, Segment์„ ๋ฐ˜์˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋Š” (0x4d*0x10)+0x20=0x4f0 ์œผ๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, Segment์— 0x10์„ ๊ณฑํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 0x7c00์„ offset์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 0x7c0์„ segment๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Segment๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ [es:๋ณ€์ˆ˜ ์ฃผ์†Œ]์ž…๋‹ˆ๋‹ค. es๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ๋œ offset์œผ๋กœ ๋ณ€์ˆ˜์˜ ์‹ค์ œ ์ฃผ์†Œ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Disk ๊ตฌ์กฐ

๋จผ์ € ๋””์Šคํฌ ๊ตฌ์กฐ๋ฅผ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•œ ๋™์˜์ƒ์„ ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. https://www.youtube.com/watch?v=gd5vKobmZ3Q ๋””์Šคํฌ์— ๋Œ€ํ•ด ํ•„์š”ํ•œ ์ง€์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Sector: ๋””์Šคํฌ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” 512byte์”ฉ sector๋กœ ์ €์žฅ๋จ
  • Platter: ํ•˜๋“œ ๋””์Šคํฌ์— ์žˆ๋Š” ํ•˜๋‚˜์˜ ๋””์Šคํฌ ํŒ
  • Head: head๊ฐ€ platter ํ‘œ๋ฉด ์›€์ง์—ฌ ๋ฐ์ดํ„ฐ ์“ฐ๊ฑฐ๋‚˜ ์ฝ์Œ
  • Cylinder: ํ•˜๋“œ ๋””์Šคํฌ์—์„œ ์—ฌ๋Ÿฌ platter์— ์žˆ๋Š” ๊ฐ™์€ ์œ„์น˜์˜ track์„ ๋ชจ์•„์„œ cylinder๋ผ ํ•จ
  • Track: sector์˜ ๋ชจ์ž„ (ํ•˜๋“œ ๋””์Šคํฌ ์›ํŒ์—์„œ ํ•œ ๋‘˜๋ ˆ์— ์žˆ์Œ) ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ https://jhnyang.tistory.com/105์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Carry Bit

Carry bit๋Š” ๋‚˜๋จธ์ง€ bit๊ฐ€ ๋‹ค ์ฐจ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋‚จ๊ฒจ์ง„ bit์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ bit๋“ค์ด ๋ชจ๋‘ 1๋กœ ์ฐจ์žˆ๋Š” ์ƒํƒœ์—์„œ 1์„ ๋”ํ•˜๋ฉด Carry bit๊ฐ€ 1 ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Carry bit๋ฅผ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•œ ์ž๋ฃŒ๋ฅผ ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. https://www.quora.com/Can-you-explain-in-an-easy-way-what-is-a-carry-bit

Int 0x13

๋””์Šคํฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด์„œ ์ง์ ‘ ๋””์Šคํฌ๋ฅผ ์กฐ์ž‘ํ•  ํ•„์š”์—†์ด BIOS์— ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด int 0x13 Interrupt์ž…๋‹ˆ๋‹ค. ah๋ ˆ์ง€์Šคํ„ฐ๋ฅผ 0x02๋กœ ์„ค์ •ํ•˜๋ฉด ๋””์Šคํฌ 'read' ๋ชจ๋“œ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๊ณ , cl ๋ ˆ์ง€์Šคํ„ฐ์— ์ฝ์„ sector์„ ์ง€์ •ํ•˜๋ฉฐ, ch ๋ ˆ์ง€์Šคํ„ฐ์—๋Š” cylinder ๋ฒˆํ˜ธ๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. dh ๋ ˆ์ง€์Šคํ„ฐ์—๋Š” head number๊ฐ€ ์ €์žฅ๋˜๊ณ , dl ๋ ˆ์ง€์Šคํ„ฐ์—๋Š” drive number๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋Š” BIOS์— ์˜ํ•ด disk number๊ฐ€ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋˜๋ฉฐ, dl๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ๋˜๋Š” ๊ฐ’์— ๋”ฐ๋ผ ์ฝ๋Š” ๋””์Šคํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • 0 = floppy
  • 1 = floppy2
  • 0x80 = hdd
  • 0x81 = hdd2 int 0x13 Interrupt๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด es:bx ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Interrupt๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ์ „์— bx ๋ ˆ์ง€์Šคํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ load ํ•  ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•ด๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ Interrupt ๋ฐœ์ƒ ํ›„ ๋””์Šคํฌ๋ฅผ ์ฝ๋Š” ๊ณผ์ •์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Carry bit์— ๊ฐ’์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. jc ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด Carry bit์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋  ๊ฒฝ์šฐ error๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ah ๋ ˆ์ง€์Šคํ„ฐ์—๋Š” ์ด๋•Œ์˜ error code๊ฐ€ ์ €์žฅ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋””์Šคํฌ๋ฅผ ์ฝ๋Š” ๊ณผ์ •์„ ์™„๋ฃŒํ•˜๋ฉด BIOS๋Š” al ๋ ˆ์ง€์Šคํ„ฐ์— ์ฝ์€ sector์˜ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” sector๋ฅผ ์ œ๋Œ€๋กœ ์ฝ์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

32 bit protected mode

Protected ๋ชจ๋“œ๋Š” 80286 ์ดํ›„์˜ ์ธํ…” CPU์—์„œ ์‚ฌ์šฉํ•˜๋Š” Opertating ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. 32bit protected ๋ชจ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ์™€ ํ•˜๋“œ์›จ์–ด์˜ IO๋ณดํ˜ธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. https://wiki.osdev.org/Protected_Mode

VGA Memory

์ด๋ฒˆ ๊ฐ•์˜๋ถ€ํ„ฐ๋Š” BIOS Interrupt๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  VGA ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์„ค์ •ํ•ด ํ™”๋ฉด์— ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. VGA ๋ฉ”๋ชจ๋ฆฌ๋Š” 0xb8000๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ณ , VGA ๋ฉ”๋ชจ๋ฆฌ์—์„œ๋Š” ๋ฌธ์ž๋ฅผ 2byte๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. 2byte๋Š” ํ•ด๋‹น ๋ฌธ์ž์˜ ASCII์ฝ”๋“œ์™€ ์ƒ‰ ๋“ฑ์˜ ํŠน์„ฑ์„ ์ง€๋‹ˆ๋Š” byte๋กœ ๊ตฌ์„ฑ๋ผ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ rowํ–‰ col์—ด ํ”ฝ์…€์— ํŠน์ • ๋ฌธ์ž๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์œผ๋ฉด 0xb8000 + 2*(row*(ํ™”๋ฉด ์„ธ๋กœ ํฌ๊ธฐ) + col)์— ๋ฌธ์ž๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Assembly ์ƒ์ˆ˜ ์„ ์–ธ

Assembly ์—์„œ ์ƒ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<์ƒ์ˆ˜๋ช…> equ <๊ฐ’>

GDT

GDT (Global Descriptor Table)์€ ๋ฉ”๋ชจ๋ฆฌ์˜ Segment์™€ Protected ๋ชจ๋“œ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‹ด์€ ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ธ”๋กœ๊ทธ์— GDT์— ๋Œ€ํ•ด ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ์œผ๋ฉฐ https://itguava.tistory.com/14 University of Birmingham์˜ Nick Blundell์ด ์“ฐ์‹  Writing a Simple Operating System-from Scratch๋„ ๊ผญ ์ฐธ๊ณ ํ•ด๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Boot Sector Segmentation ๊ฐ•์˜์—์„œ๋Š” 16bit offset์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹ค๋ฃจ๊ฒŒ ํ•˜๋Š” ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด Segment๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, 16bit์—์„œ 0x4fe56๊ณผ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ segment๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ 16bit๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋Š”๋ฐ segment๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด์šฉํ•˜๋ฉด:

mov bx, 0x4000
mov es, bx
mov [es:0xfe56], ax

0x4fe56๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

32 bit ๋ชจ๋“œ์—์„œ๋„ segmenting ์ด์šฉํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฒ”์œ„๋ฅผ ๋„“ํ˜€์ฃผ์ง€๋งŒ, ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ˜•์‹์€ ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. 16bit ์—์„œ ๋‹จ์ˆœํžˆ segment ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ๋œ ๊ฐ’์— 16์„ ๊ณฑํ•œ ํ›„ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ๋”ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, segment ๋ ˆ์ง€์Šคํ„ฐ๋Š” GDT์•ˆ์˜ Segment Descriptor (SD)์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. Segment Descriptor๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  • Base Address (32bits): Segment๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๋ฌผ๋ฆฌ์  ์ฃผ์†Œ
  • Segment Limit (20bits): Segment์˜ ํฌ๊ธฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค
  • ๊ธฐํƒ€ Flag, Privilige ๋“ฑ CPU๊ฐ€ Segment๋ฅผ ํ•ด์„ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ •๋ณด

์‹ค์ œ๋กœ Segment Desciptor์—์„œ Base Address์™€ Segment Limit์€ ์—ฐ์†์ ์œผ๋กœ ์ €์žฅ๋˜์ง€ ์•Š๊ณ  ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์ €์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ CPU๋Š” GDT์˜ ์ดˆ๊ธฐ๊ฐ’์ด Null Descriptor, ์ฆ‰ 8byte๊ฐ€ ๋ชจ๋‘ 0์œผ๋กœ ๋˜์–ด ์žˆ๋„๋ก ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด protected ๋ชจ๋“œ์— ์ง„์ž…ํ•œ ํ›„ Segment Descriptor์˜ ์„ค์ •์„ ์žŠ์€ ์ƒํƒœ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ‘๊ทผํ•  ์‹œ CPU๊ฐ€ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฒŒ ํ•ด ๋ฌธ์ œ์ ์„ ์ฐพ์•„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Code Segment์˜ Segment Descriptor์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Base: 0x0

  • Limit: 0xffff

  • Present: 1 (๋ฉ”๋ชจ๋ฆฌ์— Segment๊ฐ€ ์กด์žฌํ•จ์„ ์˜๋ฏธ, ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์— ์‚ฌ์šฉ๋จ)

  • Privilige: 0 (0์ด ๊ฐ€์žฅ ๋†’์€ ๊ถŒํ•œ)

  • Descriptor Type: 1 (1์€ Code๋‚˜ Data Segment์„ ์˜๋ฏธ)

  • Type

    • Code: 1
    • Conforming: 0 (0์œผ๋กœ ์„ค์ •ํ•จ์œผ๋กœ์จ ๋” ๋‚ฎ์€ ๊ถŒํ•œ์„ ๊ฐ€์ง„ Segment์—์„œ๋Š” ํ•ด๋‹น Segment์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๊ฒŒ ํ•จ)
    • Readable: 1 (Readable ํ•˜๋ฉด ์ฝ”๋“œ์— ์ •์˜๋œ ๋ชจ๋“  ์ƒ์ˆ˜๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Œ)
    • Accessed: 0 (๋””๋ฒ„๊น…์— ์‚ฌ์šฉ๋จ)
  • ๊ธฐํƒ€ Flag

    • Granularity: 1 (Limit์— 16x16x16์„ ๊ณฑํ•จ, ์ฆ‰ 0xffff์€ 0xffff0000์œผ๋กœ ๋จ)
    • 32-bit default: 1
    • 64-bit code segment: 0
    • AVL: 0 (๋””๋ฒ„๊น… ๋“ฑ์— ์‚ฌ์šฉ) Data Segment์˜ Segment Descriptor์€ Code Segment์™€ ๊ฐ™์€ ๊ตฌ์„ฑ์š”์†Œ์™€ ๋‚ด์šฉ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ Flag๋ถ€๋ถ„๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • ๊ธฐํƒ€ Flag

    • Code: 0
    • Expand down: 0 (์–ด๋ ค์šด ๋‚ด์šฉ)
    • Writable: 1
    • Accessed: 0 ์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋œ GDT๋ฅผ CPU์—์„œ ์ ‘๊ทผํ•  ๋•Œ๋Š” GDT Descriptor์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. GDT Descriptor๋Š” 6byte ํฌ๊ธฐ์˜ ๊ตฌ์กฐ๋กœ
  • GDT Size (16bits)

  • GDT Address (32bits) ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Pipelining

์ด ๋ธ”๋กœ๊ทธ์—์„œ Pipelining์— ๋Œ€ํ•ด ์•Œ๊ธฐ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด ๋†“์•˜์Šต๋‹ˆ๋‹ค. Pipelining์€ ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋„์ค‘ ๋™์‹œ์— ๋‹ค๋ฅธ ๋ช…๋ น์–ด๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์‹œ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

32 bit mode๋กœ ์ง„์ž…ํ•˜๋Š” ์ˆœ์„œ

32bit ๋ชจ๋“œ๋กœ ์ง„์ž…ํ•˜๋Š” ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. Interrupt ๋น„ํ™œ์„ฑํ™”
  2. GDT Load
  3. CPU์˜ control ๋ ˆ์ง€์Šคํ„ฐ cr0์— ๊ฐ’ ์„ค์ •
  4. CPU Pipeline Flush
  5. Segment ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’ ์„ค์ •
  6. Stack ์„ค์ •
  7. 32 bit ์ฝ”๋“œ์˜ Label ์‹คํ–‰

Cross Compiler

Cross Compiler๋Š” ํ•œ ํ”Œ๋žซํผ์—์„œ ๋‹ค๋ฅธ ํ”Œ๋žซํผ์˜ ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Linuxํ™˜๊ฒฝ์—์„œ Embeddedํ™˜๊ฒฝ์˜ ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ค ๋•Œ Cross Compiler๋ฅผ ์ด์šฉํ•ด ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

Linking

์ด ๋ธ”๋กœ๊ทธ์—์„œ Linking์— ๋Œ€ํ•ด ์•Œ๊ธฐ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด ๋†“์•˜์Šต๋‹ˆ๋‹ค. A.cpp๋ผ๋Š” ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๋ฉด A.o๋ผ๋Š” Object Code๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๋ฐ, ์ด Object Code๋Š” ๊ธฐ๊ณ„์–ด๋กœ ์ž‘์„ฑ๋œ ๋กœ์ง๊ณผ ๋””๋ฒ„๊น…, Symbol ์ •๋ณด ๋“ฑ์˜ ๋ถ€๊ฐ€์ ์ธ ์ •๋ณด๋“ค์ด ์žˆ๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ Object Code๋“ค์€ Linker์— ์˜ํ•ด Linking ๋˜์–ด ์‹คํ–‰ํŒŒ์ผ์ด ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ Object Code๋“ค์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๊ณ , ์—ฌ๊ธฐ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ๋“ค์„ ํ•ฉ์ณ ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Kernel

Kernel์€ ํ•˜๋“œ์›จ์–ด ๋ฐ”๋กœ ์œ„ ๋‹จ๊ณ„์—์„œ ์ž‘๋™ํ•˜๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์˜ CPU์™€ ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ํ•ญ์ƒ ์ƒ์ฃผํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. Kernel์—๋Š” ์—ฌ๋Ÿฌ ๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ฒ„๋“ค์ด ์žˆ์–ด ๋ธ”๋ฃจํˆฌ์Šค๋‚˜ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Kernel์„ ์ด์šฉํ•ด ์ ‘๊ทผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ELF (Excuatble and Linkable Format)

ELF ํฌ๋งท์€ ๋ฆฌ๋ˆ…์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์‹คํ–‰ ํŒŒ์ผ์˜ ํ˜•์‹์ž…๋‹ˆ๋‹ค. ELF ํฌ๋งท์€ ์ฃผ๋กœ ๋ฆฌ๋ˆ…์Šค์—์„œ ์‹คํ–‰ ํŒŒ์ผ, ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, Object ํŒŒ์ผ, Coredump ํŒŒ์ผ, Kernel boot ์ด๋ฏธ์ง€์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์„ค๋ช…์€ ์ด ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Makefile

๋ฆฌ๋ˆ…์Šค๋‚˜ OSX์˜ Shell์—์„œ Makefile์ด ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์—์„œ make ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Makefile์— ์ ํžŒ ๋Œ€๋กœ ํŒŒ์ผ ๊ฐ„์˜ ์ข…์† ๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•ด Shell์— ๋ช…๋ น์–ด๋“ค์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผ์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Makefile์— ๋Œ€ํ•ด์„œ๋Š” ์ด ๋ธ”๋กœ๊ทธ์— ์ž์„ธํžˆ ์„ค๋ช…๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

Makefile์—๋Š” ๋‹ค์–‘ํ•œ ๋ช…๋ น์–ด๋“ค์ด ์žˆ์ง€๋งŒ, ๋ณธ ๊ฐ•์˜์—์„œ๋Š” ๋‹ค์Œ ๋ช…๋ น์–ด๋“ค๋งŒ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • target: dependency1, dependency2, ... : target ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ตฌ์„ฑ์š”์†Œ (dependency)
  • command: ํ•ด๋‹น target ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด
  • all: Makefile์— ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ž…๋ ฅ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ์‹คํ–‰ํ•  ํƒ€๊ฒŸ์ ˆ
  • clean: make clean ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒฝ์šฐ make๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ๋ชจ๋“  ํŒŒ์ผ์„ ์‚ญ์ œ
  • $@: Target ํŒŒ์ผ
  • $<: ์ฒซ ๋ฒˆ์งธ dependency
  • $^: ๋ชจ๋“  dependency

Shell์—์„œ ํŒŒ์ผ ํ•ฉ์น˜๊ธฐ

๋‘ ํŒŒ์ผ bootsect.bin, kernel.bin์„ ์ด์–ด ๋ถ™์–ด os-image.bin์ด๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

cat bootsect.bin kernel.bin > os-image.bin

Monolithic/Micro Kernel

Monolithic Kernel์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์‹œ์Šคํ…œ ๊ธฐ๋Šฅ๋“ค์ด ์ปค๋„์˜ ๊ฐ ์˜์—ญ์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ํ˜•ํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Linux Kernel์ด Monolithic Kernel์˜ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด Micro Kernel์€ Monolithic Kernel์ด ๊ด€๋ฆฌํ•˜๋˜ ์‹œ์Šคํ…œ ๊ธฐ๋Šฅ๋“ค์ด Kernel์œ„์— ์„œ๋ฒ„์˜ ํ˜•ํƒœ๋กœ ์กด์žฌํ•˜๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ ์„œ๋น„์Šค๊ฐ€ ๋‹ค์šด๋ผ๋„ Kernel ์ „์ฒด์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ OSX์˜ Darwin Kernel๊ณผ Windows์˜ Windows NT Kernel์ด Micro Kernel์ž…๋‹ˆ๋‹ค.

I/O Programming

Input/Output์„ ๋‹ด๋‹นํ•˜๋Š” ํ•˜๋“œ์›จ์–ด ์žฅ์น˜๋Š” Controller Chip์„ ํ†ตํ•ด CPU์™€ ์ƒํ˜ธ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. Controller Chip์—๋Š” CPU๊ฐ€ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ ˆ์ง€์Šคํ„ฐ๋“ค์ด ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ๋ ˆ์ง€์Šคํ„ฐ๋“ค์˜ ์ƒํƒœ๋กœ ์žฅ์น˜์—๊ฒŒ ๋ฌด์—‡์„ ํ•ด์•ผ ํ• ์ง€ ๋ช…๋ นํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. Controller์˜ ๋ ˆ์ง€์Šคํ„ฐ๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ์˜ I/O Address Space์— ๋งตํ•‘๋˜์–ด ์žˆ์–ด Assembly์˜ in, out ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด I/O Address์— ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๊ณ  ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Floppy Disk๋ฅผ ํšŒ์ „์‹œํ‚ค๊ฒŒ ํ•˜๋Š” DOR๋ ˆ์ง€์Šคํ„ฐ๋Š” 0x3F2 I/O Address์— ๋งตํ•‘๋˜์–ด ์žˆ๋Š”๋ฐ, Floppy Disk์„ ํšŒ์ „์‹œํ‚ค๊ธฐ ์œ„ํ•œ Assembly ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

mov dx, 0x3f2
; DOR port์˜ ๊ฐ’์„ AL๋ ˆ์ง€์Šคํ„ฐ์— ์ฝ์Œ
in al, dx
; motor bit ํ‚ด
or al, 00001000b
; DOR ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’ ์—…๋ฐ์ดํŠธ
out dx, al

Inline Assembly

C Code์—์„œ Assembly๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ Inline Assembly๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

__asm__( "assembly code" : ์ถœ๋ ฅ๋ณ€์ˆ˜ : ์ž…๋ ฅ๋ณ€์ˆ˜);

GCC ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉํ•œ NASM๊ณผ ๋‹ฌ๋ฆฌ GAS ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. GAS์—์„œ๋Š” target๊ณผ desitination operand๊ฐ€ ๋ฐ”๋€ ํ˜•ํƒœ๋กœ ํ‘œ๊ธฐ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ':'๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ถœ๋ ฅ ๋ณ€์ˆ˜์™€ ์ž…๋ ฅ๋˜๋Š” ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

unsigned char result;
unsigned short port;
__asm__("in %%dx, %%al" : "=a" (result) : "d" (port));

Inline Assembly์—์„œ๋Š” ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” %%al๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉฐ, %%dx๋Š” EDX๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. "=a" (result)๋Š” ๋ช…๋ น์–ด ์‹คํ–‰ ํ›„ AL๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’์„ result๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•˜๋ผ๋Š” ์˜๋ฏธ์ด๊ณ , "d" (port)๋Š” EDX๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’์„ port๋ณ€์ˆ˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์œ„ ์ฝ”๋“œ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. EDX๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’์„ port ๋ณ€์ˆ˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
  2. (NASM ๊ธฐ์ค€) in al, edx: EDX๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” port์˜ ๊ฐ’์„ AL๋ ˆ์ง€์Šคํ„ฐ์— ์ฝ๋Š”๋‹ค.
  3. AL๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’์„ result ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.

ISR (Interrupt Service Routine)

CPU๊ฐ€ A ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ํ‚ค๋ณด๋“œ ์ž…๋ ฅ๊ณผ ๊ฐ™์€ Interrupt์„ ๋ฐ›์œผ๋ฉด CPU๋Š” ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ A ์ž‘์—…์„ ๋ฉˆ์ถ”๊ณ  Interrupt Sercie Routine์œผ๋กœ ์ ํ”„ํ•ด Interrupt์— ๊ด€ํ•œ Routine์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Interrupt๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋ฉด ์›๋ž˜ A ์ž‘์—…์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

IDT (Interrupt Descriptor Table)

GDT์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” IDT๋Š” CPU์—๊ฒŒ 256๊ฐœ์˜ Interrupt์— ๋Œ€ํ•œ Handler์„ ์ฐพ๊ฒŒ ํ•˜๋ฉฐ, ์ค‘์š”ํ•œ ์ฒซ 32๊ฐœ Interrupt๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

0 - Division by zero exception 1 - Debug exception 2 - Non maskable interrupt 3 - Breakpoint exception 4 - 'Into detected overflow' 5 - Out of bounds exception 6 - Invalid opcode exception 7 - No coprocessor exception 8 - Double fault (pushes an error code) 9 - Coprocessor segment overrun 10 - Bad TSS (pushes an error code) 11 - Segment not present (pushes an error code) 12 - Stack fault (pushes an error code) 13 - General protection fault (pushes an error code) 14 - Page fault (pushes an error code) 15 - Unknown interrupt exception 16 - Coprocessor fault 17 - Alignment check exception 18 - Machine check exception 19-31 - Reserved

#ifndef, #define

๋ณต์žกํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ํ—ค๋” ํŒŒ์ผ์ด ๊ผฌ์—ฌ, ํ—ค๋” ํŒŒ์ผ์˜ ์ค‘๋ณต ์„ ์–ธ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ํ—ค๋” ํŒŒ์ผ์ด ์ด๋ฏธ ์„ ์–ธ๋œ ๊ฒฝ์šฐ, ์ค‘๋ณต๋œ ์„ ์–ธ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด #ifndef, #define์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

#ifndef TYPES_H
#define TYPES_H

... ์ •์˜

#endif

์œ„ ์ฝ”๋“œ(types.h)์—์„œ ๋งŒ์•ฝ types.h๊ฐ€ ์ด๋ฏธ ์„ ์–ธ๋œ ๊ฒฝ์šฐ ์žฌ์„ ์–ธํ•˜์ง€ ์•Š๊ณ , ์„ ์–ธ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ #define๊ณผ #endif ์‚ฌ์ด์˜ types.h์˜ ๋‚ด์šฉ์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

๋งคํฌ๋กœ ํ•จ์ˆ˜

๋งคํฌ๋กœ ํ•จ์ˆ˜๋Š” #define ๋ถ€๋ถ„์— ์ธ์ž๋ฅผ ์ „๋‹ฌํ•ด ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งคํฌ๋กœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

#define SUM(X,Y) ((X)+(Y))

์ด๋•Œ ๋งคํฌ๋กœ ํ•จ์ˆ˜์˜ ์ธ์ž๋Š” ์–ด๋–ค ํƒ€์ž…์ด๋‚˜ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋งคํฌ๋กœ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ด„ํ˜ธ๋ฅผ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

attribute((packed))

typedef struct {
    char c;
    int x;
} myStruct;

์ƒ์‹์ ์œผ๋กœ, myStruct์˜ ํฌ๊ธฐ๋Š” char 1byte + int 4byte = 5byte์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ sizeof(myStruct)๋Š” 8์ž…๋‹ˆ๋‹ค. ์ด๋Š” CPU๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— 4byte ๋‹จ์œ„๋กœ ์ ‘๊ทผํ•  ์‹œ ๊ฐ€์žฅ ์†๋„๊ฐ€ ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, 4byte ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ char๋Š” 4byte ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ฒŒ ๋˜๊ณ , 1byte๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ 3byte๋Š” ์˜๋ฏธ ์—†๋Š” ๋ฐ์ดํ„ฐ๋กœ ์ฑ„์›Œ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

typedef struct {
    char c;
    int x;
} __attribute__((packed)) myStruct;

myStruct๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚ญ๋น„ํ•˜์ง€ ์•Š๊ณ  5byte๊ฐ€ ๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” attribute((packed)) ํŠน์„ฑ์„ ์„ค์ •ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ตฌ์กฐ์ฒด์˜ ์‹ค์ œ ํฌ๊ธฐ๋งŒํผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

volatile

__volatile__์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜์ง€ ์•Š๊ณ , ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” Inline Assembly์—์„œ ์ดํ›„์˜ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด, ํ•ด๋‹น ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•ด ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. __volatile__์„ ์„ค์ •ํ•˜๋ฉด ์ด์ฒ˜๋Ÿผ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ฝ”๋“œ์˜ ์ตœ์ ํ™”๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

lidtl

lidtl Assembly ๋ช…๋ น์–ด๋Š” IDT๋ฅผ ๋กœ๋”ฉํ•˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค. lidtl ๋ช…๋ น์–ด๋Š” IDT Description Structure์˜ ์ฃผ์†Œ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.

Assembly์—์„œ ์ธ์ž๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜ ์‚ฌ์šฉ

Assembly์—์„œ C ์ฝ”๋“œ์— ์„ ์–ธ๋œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” extern <ํ•จ์ˆ˜ ์ด๋ฆ„> ๋ช…๋ น์–ด๋กœ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์™€ call <ํ•จ์ˆ˜ ์ด๋ฆ„> ๋ช…๋ น์–ด๋กœ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํ•จ์ˆ˜์˜ ์ธ์ž๋“ค์€ Stack์— push ๋˜์–ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜ func๊ฐ€ ์žˆ์„ ๋•Œ,

func(arg1, arg2, arg3)

func์˜ ์ธ์ž๋“ค์€ ์˜ค๋ฅธ์ชฝ ์ธ์ž๋“ค๋ถ€ํ„ฐ Stack์— push ๋˜์–ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

sti, cli

Assembly์—์„œ sti๋Š” Interrupt Flag (IF)๋ฅผ IF=1์ธ ์ƒํƒœ๋กœ ๋งŒ๋“ค๊ณ , cli๋Š” IF=0์ธ ์ƒํƒœ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. IF=0์ด๋ฉด Interrupt๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ์–ต์ œ๋˜๋ฉฐ, IF=1์ด๋ฉด Interrupt๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Computer Buses

๋ฒ„์Šค๋Š” ๋ฐ์ดํ„ฐ ๋ฒ„์Šค, ์ฃผ์†Œ ๋ฒ„์Šค, ์ œ์–ด ๋ฒ„์Šค๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ ๋ฒ„์Šค: ๋ฐ์ดํ„ฐ ๋ฒ„์Šค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉฐ 32, 64๊ฐœ์˜ ์„ ๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

  • ์ฃผ์†Œ ๋ฒ„์Šค: ๋ฐ์ดํ„ฐ์˜ ์ถœ๋ฐœ์ง€๋‚˜ ๋„์ฐฉ์ง€์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

  • ์ œ์–ด ๋ฒ„์Šค: ๋ฐ์ดํ„ฐ ๋ฒ„์Šค์™€ ์ฃผ์†Œ ๋ฒ„์Šค๋ฅผ ์ œ์–ดํ•œ๋‹ค.

    • Read
    • Write
    • Transfer Acknowledgment (๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ๋ณด๋‚ด์กŒ๋Š”์ง€)
    • Clock Signal (์–ธ์ œ ๋ฐ์ดํ„ฐ ๋ณด๋ƒˆ๋Š”์ง€ ํ‘œ์‹œ) ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก๋˜๋Š” ๋ฐฉ์‹์—๋Š” Serial, Parallel ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„๋Œ€ CPU์˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ Serial ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Serial: ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ํ•˜๋‚˜์˜ Channel์„ ํ†ตํ•ด ์ „์†ก๋œ๋‹ค.

  • Parallel: ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ Channel์„ ํ†ตํ•ด ๋™์‹œ์— ์ „์†ก๋œ๋‹ค. ์ด๋•Œ ๊ฐ Channel์„ ํ†ตํ•ด ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋™์‹œ์— ๋„๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.

IRQ (Interrupt Request)

IRQ๋Š” ์ปดํ“จํ„ฐ์˜ ์ฃผ๋ณ€ ๊ธฐ๊ธฐ๊ฐ€ CPU์—๊ฒŒ ์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ฆฌ๋Š” line์ž…๋‹ˆ๋‹ค. ์ฆ‰, CPU๊ฐ€ ์–ด๋–ค ์ผ์ด ์ฒ˜๋ฆฌํ•˜๋‹ค๊ฐ€๋„ ์ฃผ๋ณ€ ๊ธฐ๊ธฐ์—์„œ Interrupt๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ํ•˜๋˜ ์ผ์„ ์ค‘๋‹จํ•˜๊ณ  ํ•ด๋‹น Interrupt์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. IRQ ๋ฒˆํ˜ธ์— ๋”ฐ๋ฅธ Interrupt ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. IRQ ํƒ€์ด๋จธ
  2. ํ‚ค๋ณด๋“œ
  3. IRQ ์บ์Šค ์ผ€์ด๋“œ ๊ณต์œ 
  4. ์‹œ๋ฆฌ์–ผํฌํŠธ 2, COM2, COM4 ( ๋ชจ๋Ž€ / ๋งˆ์šฐ์Šค)
  5. ์‹œ๋ฆฌ์–ผํฌํŠธ 1, COM1, COM3 ( ๋ชจ๋Ž€ / ๋งˆ์šฐ์Šค)
  6. LPT2 ๋ณ‘๋ ฌํฌํŠธ ํ˜น์€
  7. FDD ์ปจํŠธ๋กค๋Ÿฌ
  8. LPT1 ๋ณ‘์—ด ํฌํŠธ ๋“ฑ ํ˜น์€ ์‚ฌ์šด๋“œ์นด๋“œ
  9. RTC( Real Time Clock)
  10. ์˜ˆ๋น„, ์ฃผ๋กœ ๋ฏธ๋”” ์นด๋“œ(MPU401)์—์„œ ์‚ฌ์šฉ , SOUND ,VGA . USB, MPEG II
  11. ์˜ˆ๋น„ , SOUND ,VGA . USB,MPEG II,
  12. ์˜ˆ๋น„, SCSI ์•„๋‹ตํ„ฐ, SOUND ,VGA . USB,MPEG II
  13. PS/2 ๋งˆ์šฐ์Šค
  14. ์ฝ”ํ”„๋กœ์„ธ์„œ (์ˆ˜์น˜์ฒ˜๋ฆฌ๋ณด์กฐ์—ฐ์‚ฐ์ž )
  15. IDE ํ•˜๋“œ ์ปจํŠธ๋กค๋Ÿฌ Primary
  16. IDE ํ•˜๋“œ ์ปจํŠธ๋กค๋Ÿฌ Secondary

PCI (Peripheral Component Interconnect)

PCI๋Š” CPU์™€ ์ปดํ“จํ„ฐ ์ฃผ๋ณ€๊ธฐ๊ธฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” Local Bus์ž…๋‹ˆ๋‹ค. PCI๋Š” Bridge, Master, Slave์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

  • Bridge: ์‹œ์Šคํ…œ๊ณผ PCI ๋ฒ„์Šค๋ฅผ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค
  • Master: ๋ฒ„์Šค ์ „์†ก์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์ฃผ์†Œ, ๋ฐ์ดํ„ฐ ์ „์†ก, ์ œ์–ด ์‹ ํ˜ธ๋“ค์„ ์กฐ์ •ํ•œ๋‹ค
  • Slave: ๋งˆ์Šคํ„ฐ์— ์˜์กดํ•˜๋Š” ์ˆ˜๋™์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋””๋ฐ”์ด์Šค์ด๋‹ค

CPU๊ฐ€ boot ๋˜๋ฉด PIC๋Š” IRQ 0-7์„ INT 0x8-0xF์—, IRQ 8-15์„ INT 0x70-0x77์— ๋งตํ•‘ํ•ฉ๋‹ˆ๋‹ค. ์ง€๋‚œ ๊ฐ•์˜๋“ค์—์„œ ISR๋ฅผ 0-31์— ๋งตํ•‘ํ•˜์˜€์œผ๋ฏ€๋กœ IRQ๋ฅผ ISR 32-47์— ๋งตํ•‘ํ•ด์•ผ ๊ฒน์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

PIC๋Š” I/O port์„ ํ†ตํ•ด ํ†ต์‹ ํ•˜๊ณ , ์ด๋•Œ Master PIC๋Š” 0x20์„ ํ†ตํ•ด ๋ช…๋ น, 0x21์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Slave PIC๋Š” 0xA0์„ ํ†ตํ•ด ๋ช…๋ น, 0xA1์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

PIT (Programmable Interval Timer)

PIT chip(๋ฌธ์„œ)์€ oscillator, prescaler, frequency dividers๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, frequency divider์€ Timer๊ฐ€ IRQ0์™€ ๊ฐ™์€ ์™ธ๋ถ€ Circuitry๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. PIT์˜ oscillator๋Š” ์•ฝ 1.193180 MHz๋กœ ์ž‘๋™ํ•˜๋Š”๋ฐ, freqeuncy divider๋Š” ์ด ์ง„๋™์ˆ˜๋ฅผ divider๋กœ ๋‚˜๋ˆ„์–ด์„œ ๋” ๋А๋ฆฐ ์ง„๋™์ˆ˜๋กœ ์ž‘๋™ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ ์ง„๋™์ˆ˜์— ๋”ฐ๋ผ ํŽ„์Šค๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค counter๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๊ณ , counter๊ฐ€ 0์ด ๋˜๋ฉด counter๊ฐ€ ๋ฆฌ์…‹๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž…๋ ฅ ์ง„๋™์ˆ˜๊ฐ€ 200Hz์ด๊ณ , counter๊ฐ€ 10๋ฒˆ๋งˆ๋‹ค ๋ฆฌ์…‹๋˜๋ฉด, ์ถœ๋ ฅ ์ง„๋™์ˆ˜๋Š” 200/10=20Hz๊ฐ€ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. PIT์˜ frequency divider๋Š” ํฌ๊ธฐ๊ฐ€ 16bit์ด๋ฉฐ, 0๋ถ€ํ„ฐ 65535 ์‚ฌ์ด์˜ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PIT์˜ ์ถœ๋ ฅ์€ 3๊ฐœ์˜ Channel๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์ด์ค‘ Channel 0๋Š” IRQ0์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. PIT chip์˜ command ๋ ˆ์ง€์Šคํ„ฐ๋Š” 0x43 I/O port์ด๋ฉฐ, Channel 0์˜ data I/O port๋Š” 0x40์ด๋ฉฐ, frequency divider๋ฅผ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค. 0x43 port์—๋Š” ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ๋ช…๋ น์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Keyboard Interrupt

ํ‚ค๋ณด๋“œ์˜ Interrupt์€ IRQ1์„ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์ด ์ฃผ์–ด์ง€๋ฉด PIC๋Š” key๊ฐ€ ๋ˆŒ๋ฆฌ๊ฑฐ๋‚˜(key down) ๋• ์„ ๋•Œ์˜(key up) scancode๋ฅผ 0x60 I/O port์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ key up์˜ scancode๋Š” key down์˜ scancode + 0x80์˜ ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋ณธ ๊ฐ•์˜์—์„œ๋Š” ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ scancode๋ฅผ ASCII code๋กœ ๋ณ€ํ™˜ํ•ด ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

Paging ๊ธฐ๋ฒ•

์ปดํ“จํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋กœ์„œ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ, ์ด๋ฅผ ํ†ตํ•ด ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ถ”์ƒํ™”ํ•ด ํ”„๋กœ์„ธ์Šค๋“ค์ด ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์™€ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๋ฐ์— Paging ๊ธฐ๋ฒ•์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Paging ๊ธฐ๋ฒ•์€ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ณต๊ฐ„์„ ์ผ์ •ํ•œ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆˆ ๋ธ”๋ก์ธ Page์„ ๋‹จ์œ„๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ๋„ Page์™€ ๊ฐ™์€ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆˆ ๋ธ”๋ก์ธ Frame ๋‹จ์œ„๋„ ์‚ฌ์šฉ๋˜๋ฉฐ, Page๊ฐ€ ํ•˜๋‚˜์˜ Frame์„ ํ• ๋‹น๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ Page๋Š” ํ”„๋กœ์„ธ์Šค์˜ Page ์ •๋ณด์™€ Page์— ๋Œ€ํ•œ Frame์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ๊ฐ’์œผ๋กœ ํ•˜๋Š” Page Tableํ˜•ํƒœ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ์‚ฌํ•ญ

๋ณธ ์ž๋ฃŒ๋Š” ์ œ๊ฐ€ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ž‘์„ฑํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ์˜ค๊ฐœ๋…์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ์ ์„ ๋ฐœ๊ฒฌํ•ด์ฃผ์‹  ๋ถ„์€ ํ‹ฐ์Šคํ† ๋ฆฌ ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

About

OS from Scratch

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors