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๋ฅผ ์ฐธ๊ณ ํด ์ ์ ํฐ์คํ ๋ฆฌ์ ํ๊ตญ์ด๋ก ์ ๋ฆฌํ์์ต๋๋ค.
๋ณธ ์๋ฃ๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ๋ค์ ์ง์์ด ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
- ๊ธฐ์ด์ ์ธ C์ธ์ด ์ง์ (ํจ์, ํฌ์ธํฐ, ๋ฉ๋ชจ๋ฆฌ)
- ์ฝ๊ฐ์ Assembly ์ง์ (mov, ๋ ์ง์คํฐ, Label ์ฌ์ฉ, jmp, loop)
- ์์ธํ ๋ด์ฉ๋ค์ ์ฝ๋๊ฐ ๋ฑ์ฅํ ๋๋ง๋ค ์ค๋ช ํฉ๋๋ค
- ์ด์ !
๋ณธ ์๋ฃ๋ฅผ 100% ํ์ฉํ๊ธฐ ์ํด์๋ ํฐ์คํ ๋ฆฌ์ ํฌ์คํธ ๋ฒํธ ์์๋ฅผ ๋ฐ๋ผ ์ด๋ก ๊ณผ ์ฝ๋๋ฅผ ์ตํ๊ณ , ๋ ์์ธํ ์ฝ๋๋ ํด๋น ํฌ์คํธ ๋ฒํธ์ cfenollosa๋์ os-tutorial ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋ฉ๋๋ค.
๋ณธ ์๋ฃ์ ์ฌ์ฉ๋๋ ์ด๋ก ๋ค์ ๋ชจ๋ ๋ชจ์ ๊ฒ์ ๋๋ค. ์์ธํ ๋ด์ฉ๋ค์ ์ ์ ํฐ์คํ ๋ฆฌ์์ ํ๊ตญ์ด๋ก ์ ๋ฆฌ๋์ด์์ต๋๋ค.
BIOS๋ ๋ถํ ์ ํ๋์จ์ด๋ฅผ ํ์ธํ๋ ์ญํ ์ ํฉ๋๋ค. ์ปดํจํฐ๊ฐ ๋ถํ ํ ๋ ์งง๊ฒ ๋ฒจ์๋ฆฌ๊ฐ ๋ค๋ฆฌ๋ ๊ฒ์ด BIOS๊ฐ ํ๋์จ์ด์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ์ธ์ํ ์ ํธ์ ๋๋ค.
Boot Sector๋ Kernel์ ๋ถ๋ฌ์ค๋ ์ญํ ์ ํฉ๋๋ค. Boot Sector๋ ๋์คํฌ์์ ๊ฐ์ฅ ์์๋ 512byteํฌ๊ธฐ๋ก ์์ต๋๋ค. Boot Sector์ ๋ง์ง๋ง์ 0xAA55๋ก ๋ผ์๋๋ฐ, ์ด๋ BIOS๊ฐ ๋์คํฌ๊ฐ ๋ถํ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ฒ ๊ฐ์์์ ๋ค๋ฃฐ ๊ฐ์ฅ ๊ฐ๋จํ ํํ์ Boot Sector๋ ์ฒ์ 3๊ฐ byte๋ ๋ฌดํ ๋ฃจํ๋ฅผ ์๋ฏธํ๋ฉฐ, ๋ง์ง๋ง 2byte๋ 0xAA55์ ๋๋ค. ๊ฐ์ด๋ฐ ์๋ ๊ฐ์ 0์ผ๋ก ์ด๊ธฐํ ํด์ค๋๋ค.
x86์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ๋ ๋๋ถ๋ถ์ ์ปดํจํฐ๋ Little Endian๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค. Little Endian์ ํ ๋จ์์ ๋ฐ์ดํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๋ ๊ฑฐ๊พธ๋ก ๋ฐฐ์ด๋๋ ํํ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด 0xAA55๋ฅผ ์ ์ฅํ๋ฉด 55 AA๋ก ์ ์ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ๋ ์์ธํ ๋ด์ฉ์ ๋งํฌ ์ ์ฐธ๊ณ ํ์ธ์.
times 510-($-$$) db 0์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์ฝ๋์ ์๋ฏธ๋ฅผ ๋ถ์ํด๋ด
์๋ค. times๋ ์ด๋ค ๊ฐ์ ๋ฐ๋ณตํด ์์ฑํ๋ ๋ช
๋ น์ด์
๋๋ค. (
TTY Mode๋ ์ผ๋ฐ CLI ์ฝ์ ํ๊ฒฝ์ ์๋ฏธํ๋ฉฐ, ah ๋ ์ง์คํฐ์ 0x0e๋ฅผ ๋์ ํ๋ฉด TTY Mode๋ก ์ง์ ํ๋ค.
Interrupt๋ ์ฅ์น๋ ํ๋ก๊ทธ๋จ์์ OS๋ก ๋ณด๋ด๋ ์ ํธ๋ก OS์๊ฒ ํ์ฌ ์คํ ์ค์ธ ์๋น์ค๋ฅผ ๋ฉ์ถ๊ฒ ํฉ๋๋ค. ์ปดํจํฐ๋ ํ๋ฒ์ ํ๋์ ํ๋ก๊ทธ๋จ ๋ฐ์ ์คํํ์ง ๋ชปํ๋๋ฐ, Interrupt๋ฅผ ํตํด Multi Taskingํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํฉ๋๋ค. ๋ณธ ๊ฐ์ข์์๋ ๋ฌธ์๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด 0x10 Interrupt๋ฅผ ์ฌ์ฉํฉ๋๋ค. al ๋ ์ง์คํฐ์ ๊ฐ์ ์ ์ฅํ๊ณ int 0x10๋ช ๋ น์ด๋ฅผ ํตํด interrupt๋ฅผ ๋ฐ์์ํค๋ฉด al ๋ ์ง์คํฐ์ ์ ์ฅ๋ ๊ฐ์ด ๋น๋์ค ์๋น์ค๋ก ์ถ๋ ฅ๋ฉ๋๋ค.
BIOS๋ Boot Sector๋ฅผ 0x7c00์ฃผ์๋ถํฐ ์ฑ์ฐ๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ๊ณ ๋ คํด Boot Sector๋ฅผ ๋ง๋ญ๋๋ค.
[org 0x7c00]์ Assembly ์ฝ๋๋ ๋ชจ๋ Assembly์ฝ๋์์ 0x7c00๋งํผ offset์ ์ค์ ํ๋ ์ฝ๋์ ๋๋ค. ์ ์ฝ๋๋ฅผ ์ฝ์ ํ๋ฉด ์ดํ ๋ํ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์์ 0x7c00๋งํผ์ ์ฃผ์๊ฐ ๋ํด์ ธ ๊ณ์ฐ๋ฉ๋๋ค.
bp๋ ์ง์คํฐ๋ Stack์ Bottom์ ์๋ฏธํ๋ฉฐ, sp๋ ์ง์คํฐ๋ stack์ top์ ์๋ฏธํฉ๋๋ค. ์ด๋ Stack์ bp์์ ์์ํด ์๋๋ก sp๊น์ง ์๋ผ๋๋ ๊ตฌ์กฐ์ด๋ฉฐ, Stack์ ์์๋ฅผ ๋ฃ์์๋ก sp๊ฐ ์ค์ด๋ญ๋๋ค. Stack์ ์์๋ push, pop์ ์ด์ฉํด ๋ฃ๊ณ ๋นผ๋ฉฐ, words, doublewords ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ง ๊ฐ๋ฅํฉ๋๋ค.
pusha๋ ๋ชจ๋ ๋ ์ง์คํฐ์ ์ ์ฅ๋ ๊ฐ์ Stack์ ์ ์ฅ, popa๋ Stack์ ์ ์ฅ๋๋ ๋ชจ๋ ๊ฐ์ ์๋ ๋ ์ง์คํฐ ๊ฐ์ ์ฎ๊ฒจ ์๋ ์ํ๋ก ๋๋ ค๋๋ ๊ธฐ๋ฅ์ ํฉ๋๋ค. ์ด์ ๊ฐ์ ๊ธฐ๋ฅ์ ํ์ฌ ์ํ์์ ๋ค๋ฅธ ์ฝ๋์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ํ์ฉ๋ฉ๋๋ค.
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 0x10Assembly ์ฝ๋์์ ๋ค๋ฅธ ํ์ผ์ ์ฝ๋๋ฅผ ์คํ์ํค๊ธฐ ์ํด์๋ ๋ค์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
%include โํ์ผ๋ช
.asmโ
์ด๋ ์ฝ๋์ ํฌํจ๋์ด ์๋ Label์ ์์น๋ฅผ ์ฃผ์ํ๋ฉฐ ํ์ผ์ ๋ถ๋ฌ์์ผ ํฉ๋๋ค.0x1234์ ror ์ฐ์ฐํ๋ฉด ๊ฐ์ 0x4123๋ก ๋ณํ๋๊ณ ror ์ฐ์ฐ์ ๋ฐ๋ณตํ๋ฉด 0x3412, 0x2341, 0x1234๋ก ๋ฉ๋๋ค.
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์ผ๋ก ๋ณ์์ ์ค์ ์ฃผ์๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค.
๋จผ์ ๋์คํฌ ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ์ค๋ช ํ ๋์์์ ์ฒจ๋ถํฉ๋๋ค. 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๋ ๋๋จธ์ง 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
๋์คํฌ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ์ํด์ ์ง์ ๋์คํฌ๋ฅผ ์กฐ์ํ ํ์์์ด 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๋ฅผ ์ ๋๋ก ์ฝ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
Protected ๋ชจ๋๋ 80286 ์ดํ์ ์ธํ CPU์์ ์ฌ์ฉํ๋ Opertating ๋ชจ๋์ ๋๋ค. 32bit protected ๋ชจ๋๋ฅผ ํตํด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ์ ํ๋์จ์ด์ IO๋ณดํธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ค์ ํ์ด์ง๋ฅผ ์ฐธ๊ณ ํ์ธ์. https://wiki.osdev.org/Protected_Mode
์ด๋ฒ ๊ฐ์๋ถํฐ๋ BIOS Interrupt๋ฅผ ์ฌ์ฉํ์ง ์๊ณ VGA ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์ ํด ํ๋ฉด์ ๋ฌธ์์ด์ ์ถ๋ ฅํฉ๋๋ค. VGA ๋ฉ๋ชจ๋ฆฌ๋ 0xb8000๋ถํฐ ์์ํ๊ณ , VGA ๋ฉ๋ชจ๋ฆฌ์์๋ ๋ฌธ์๋ฅผ 2byte๋ก ์ ์ฅํฉ๋๋ค. 2byte๋ ํด๋น ๋ฌธ์์ ASCII์ฝ๋์ ์ ๋ฑ์ ํน์ฑ์ ์ง๋๋ byte๋ก ๊ตฌ์ฑ๋ผ์์ต๋๋ค. ๋ง์ฝ rowํ col์ด ํฝ์ ์ ํน์ ๋ฌธ์๋ฅผ ์ถ๋ ฅํ๊ณ ์ถ์ผ๋ฉด 0xb8000 + 2*(row*(ํ๋ฉด ์ธ๋ก ํฌ๊ธฐ) + col)์ ๋ฌธ์๋ฅผ ์ง์ ํ๋ฉด ๋ฉ๋๋ค.
Assembly ์์ ์์๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<์์๋ช
> equ <๊ฐ>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], ax0x4fe56๋ฅผ ํํํ ์ ์์์ต๋๋ค.
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์ ํ๋์ ๋ช ๋ น์ด๊ฐ ์คํ๋๋ ๋์ค ๋์์ ๋ค๋ฅธ ๋ช ๋ น์ด๋ฅผ ์์ํ๋ ๋ฐฉ์์ผ๋ก ๋์์ ์ฌ๋ฌ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์คํํด ์ฒ๋ฆฌ๋์ ์ฌ๋ฆฌ๋ ๊ฒ์ ๋๋ค.
32bit ๋ชจ๋๋ก ์ง์ ํ๋ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Interrupt ๋นํ์ฑํ
- GDT Load
- CPU์ control ๋ ์ง์คํฐ cr0์ ๊ฐ ์ค์
- CPU Pipeline Flush
- Segment ๋ ์ง์คํฐ ๊ฐ ์ค์
- Stack ์ค์
- 32 bit ์ฝ๋์ Label ์คํ
Cross Compiler๋ ํ ํ๋ซํผ์์ ๋ค๋ฅธ ํ๋ซํผ์ ์คํ ํ์ผ์ ๋ง๋ค์ด์ฃผ๋ ์ปดํ์ผ๋ฌ ์ ๋๋ค. ์๋ฅผ ๋ค์ด Linuxํ๊ฒฝ์์ Embeddedํ๊ฒฝ์ ์คํ ํ์ผ์ ๋ง๋ค ๋ Cross Compiler๋ฅผ ์ด์ฉํด ์คํ ํ์ผ์ ๋ง๋ค์ด์ค๋๋ค.
์ด ๋ธ๋ก๊ทธ์์ Linking์ ๋ํด ์๊ธฐ ์ฝ๊ฒ ์ค๋ช ํด ๋์์ต๋๋ค. A.cpp๋ผ๋ ํ์ผ์ ์ปดํ์ผํ๋ฉด A.o๋ผ๋ Object Code๊ฐ ์์ฑ๋๋๋ฐ, ์ด Object Code๋ ๊ธฐ๊ณ์ด๋ก ์์ฑ๋ ๋ก์ง๊ณผ ๋๋ฒ๊น , Symbol ์ ๋ณด ๋ฑ์ ๋ถ๊ฐ์ ์ธ ์ ๋ณด๋ค์ด ์๋ ํ์ผ์ ๋๋ค. ์์ฑ๋ Object Code๋ค์ Linker์ ์ํด Linking ๋์ด ์คํํ์ผ์ด ๋ง๋ค์ด์ง๋๋ค. ์ด ๊ณผ์ ์์ ์ฌ๋ฌ Object Code๋ค์ ํ๋๋ก ํฉ์น๊ณ , ์ฌ๊ธฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ๋ค์ ํฉ์ณ ์คํ ํ์ผ์ ๋ง๋ค๊ฒ ๋ฉ๋๋ค.
Kernel์ ํ๋์จ์ด ๋ฐ๋ก ์ ๋จ๊ณ์์ ์๋ํ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ CPU์ ๋ฉ๋ชจ๋ฆฌ ๋ฑ์ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ ๋ฉ๋ชจ๋ฆฌ์ ํญ์ ์์ฃผํ๊ณ ์๋ ํ๋ก๊ทธ๋จ์ ๋๋ค. Kernel์๋ ์ฌ๋ฌ ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ๋ค์ด ์์ด ๋ธ๋ฃจํฌ์ค๋ ํ์ผ ์์คํ ๋ฑ์ ์ฌ์ฉํ๋ ค๋ฉด Kernel์ ์ด์ฉํด ์ ๊ทผํ๊ฒ ๋ฉ๋๋ค.
ELF ํฌ๋งท์ ๋ฆฌ๋ ์ค์์ ์ฌ์ฉํ๋ ์คํ ํ์ผ์ ํ์์ ๋๋ค. ELF ํฌ๋งท์ ์ฃผ๋ก ๋ฆฌ๋ ์ค์์ ์คํ ํ์ผ, ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, Object ํ์ผ, Coredump ํ์ผ, Kernel boot ์ด๋ฏธ์ง์ ์ฌ์ฉ๋ฉ๋๋ค. ์์ธํ ์ค๋ช ์ ์ด ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋ฆฌ๋ ์ค๋ OSX์ Shell์์ Makefile์ด ์๋ ๋๋ ํ ๋ฆฌ์์ make ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด Makefile์ ์ ํ ๋๋ก ํ์ผ ๊ฐ์ ์ข ์ ๊ด๊ณ๋ฅผ ํ์ ํด Shell์ ๋ช ๋ น์ด๋ค์ด ์์ฐจ์ ์ผ๋ก ์คํ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ปดํ์ผ์ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค. Makefile์ ๋ํด์๋ ์ด ๋ธ๋ก๊ทธ์ ์์ธํ ์ค๋ช ๋์ด์์ต๋๋ค.
Makefile์๋ ๋ค์ํ ๋ช ๋ น์ด๋ค์ด ์์ง๋ง, ๋ณธ ๊ฐ์์์๋ ๋ค์ ๋ช ๋ น์ด๋ค๋ง ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
- target: dependency1, dependency2, ... : target ํ์ผ์ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ๊ตฌ์ฑ์์ (dependency)
- command: ํด๋น target ํ์ผ์ ๋ง๋ค๊ธฐ ์ํ ๋ช ๋ น์ด
- all: Makefile์ ํ๋ผ๋ฏธํฐ๊ฐ ์ ๋ ฅ๋์ง ์์์ ๋ ์คํํ ํ๊ฒ์
- clean: make clean ๋ช ๋ น์ด๋ฅผ ์คํ์ํค๋ ๊ฒฝ์ฐ make๋ฅผ ํตํด ๋ง๋ค์ด์ง ๋ชจ๋ ํ์ผ์ ์ญ์
- $@: Target ํ์ผ
- $<: ์ฒซ ๋ฒ์งธ dependency
- $^: ๋ชจ๋ dependency
๋ ํ์ผ bootsect.bin, kernel.bin์ ์ด์ด ๋ถ์ด os-image.bin์ด๋ผ๋ ํ์ผ์ ๋ง๋ค๊ธฐ ์ํ ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
cat bootsect.bin kernel.bin > os-image.binMonolithic Kernel์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ธํ ๋ชจ๋ ์์คํ ๊ธฐ๋ฅ๋ค์ด ์ปค๋์ ๊ฐ ์์ญ์ ๋ค์ด๊ฐ ์๋ ํํ๋ฅผ ์๋ฏธํฉ๋๋ค. Linux Kernel์ด Monolithic Kernel์ ํํ์ ๋๋ค.
๋ฐ๋ฉด Micro Kernel์ Monolithic Kernel์ด ๊ด๋ฆฌํ๋ ์์คํ ๊ธฐ๋ฅ๋ค์ด Kernel์์ ์๋ฒ์ ํํ๋ก ์กด์ฌํ๋ ํํ์ ๋๋ค. ์ด๋ฅผ ํตํด ํ๋์ ์์คํ ์๋น์ค๊ฐ ๋ค์ด๋ผ๋ Kernel ์ ์ฒด์ ๋ฌธ์ ๊ฐ ์๊ธฐ์ง ์์ต๋๋ค. ๋ํ์ ์ผ๋ก OSX์ Darwin Kernel๊ณผ Windows์ Windows NT Kernel์ด Micro Kernel์ ๋๋ค.
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, alC 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๋ณ์ ๊ฐ์ผ๋ก ์ค์ ํ๋ผ๋ ์๋ฏธ์ ๋๋ค. ์ฆ, ์ ์ฝ๋์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- EDX๋ ์ง์คํฐ์ ๊ฐ์ port ๋ณ์ ๊ฐ์ผ๋ก ์ค์ ํ๋ค.
- (NASM ๊ธฐ์ค) in al, edx: EDX๋ ์ง์คํฐ๊ฐ ๊ฐ๋ฆฌํค๋ port์ ๊ฐ์ AL๋ ์ง์คํฐ์ ์ฝ๋๋ค.
- AL๋ ์ง์คํฐ์ ๊ฐ์ result ๋ณ์์ ์ ์ฅํ๋ค.
CPU๊ฐ A ์์ ์ ํ๊ณ ์๋ค๊ฐ ํค๋ณด๋ ์ ๋ ฅ๊ณผ ๊ฐ์ Interrupt์ ๋ฐ์ผ๋ฉด CPU๋ ํ์ฌ ์งํ ์ค์ธ A ์์ ์ ๋ฉ์ถ๊ณ Interrupt Sercie Routine์ผ๋ก ์ ํํด Interrupt์ ๊ดํ Routine์ ์ฒ๋ฆฌํฉ๋๋ค. Interrupt๊ฐ ์ฒ๋ฆฌ๋๋ฉด ์๋ A ์์ ์ผ๋ก ๋์๊ฐ๋๋ค.
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 TYPES_H
#define TYPES_H
... ์ ์
#endif์ ์ฝ๋(types.h)์์ ๋ง์ฝ types.h๊ฐ ์ด๋ฏธ ์ ์ธ๋ ๊ฒฝ์ฐ ์ฌ์ ์ธํ์ง ์๊ณ , ์ ์ธ๋์ง ์๋ ๊ฒฝ์ฐ #define๊ณผ #endif ์ฌ์ด์ types.h์ ๋ด์ฉ์ ์ ์ธํฉ๋๋ค.
๋งคํฌ๋ก ํจ์๋ #define ๋ถ๋ถ์ ์ธ์๋ฅผ ์ ๋ฌํด ํจ์์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ ๋งคํฌ๋ก๋ฅผ ์๋ฏธํฉ๋๋ค.
#define SUM(X,Y) ((X)+(Y))์ด๋ ๋งคํฌ๋ก ํจ์์ ์ธ์๋ ์ด๋ค ํ์ ์ด๋ ๊ฐ๋ฅํ๋ฉฐ, ๋งคํฌ๋ก ํจ์ ๋ด๋ถ์์ ์ธ์๋ฅผ ์ฌ์ฉํ ๋๋ ๊ดํธ๋ฅผ ๋ฐ๋์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
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__์ ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋๋ฅผ ์ต์ ํํ์ง ์๊ณ , ์๋ ๊ทธ๋๋ก ์คํํ๊ฒ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ปดํ์ผ๋ฌ๋ Inline Assembly์์ ์ดํ์ ์ฝ๋์์ ์ฌ์ฉํ์ง ์๋ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๋ฉด, ํด๋น ๋ถ๋ถ์ ์ฝ๋๋ฅผ ์ต์ ํํด ์ํํ์ง ์์ต๋๋ค. __volatile__์ ์ค์ ํ๋ฉด ์ด์ฒ๋ผ ์ปดํ์ผ๋ฌ์ ์ํด ์ฝ๋์ ์ต์ ํ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
lidtl Assembly ๋ช ๋ น์ด๋ IDT๋ฅผ ๋ก๋ฉํ๋ ๋ช ๋ น์ด์ ๋๋ค. lidtl ๋ช ๋ น์ด๋ IDT Description Structure์ ์ฃผ์๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค.
Assembly์์ C ์ฝ๋์ ์ ์ธ๋ ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ extern <ํจ์ ์ด๋ฆ> ๋ช ๋ น์ด๋ก ํด๋น ํจ์๋ฅผ ๋ถ๋ฌ์ call <ํจ์ ์ด๋ฆ> ๋ช ๋ น์ด๋ก ํจ์๋ฅผ ์คํํฉ๋๋ค. ์ด๋ ํจ์์ ์ธ์๋ค์ Stack์ push ๋์ด ์ ๋ฌ๋ฉ๋๋ค. ์ฆ, ๋ค์๊ณผ ๊ฐ์ ํจ์ func๊ฐ ์์ ๋,
func(arg1, arg2, arg3)func์ ์ธ์๋ค์ ์ค๋ฅธ์ชฝ ์ธ์๋ค๋ถํฐ Stack์ push ๋์ด ์ฌ์ฉํฉ๋๋ค.
Assembly์์ sti๋ Interrupt Flag (IF)๋ฅผ IF=1์ธ ์ํ๋ก ๋ง๋ค๊ณ , cli๋ IF=0์ธ ์ํ๋ฅผ ๋ง๋ญ๋๋ค. IF=0์ด๋ฉด Interrupt๊ฐ ๋ฐ์ํ์ง ์๊ฒ ์ต์ ๋๋ฉฐ, IF=1์ด๋ฉด Interrupt๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
๋ฒ์ค๋ ๋ฐ์ดํฐ ๋ฒ์ค, ์ฃผ์ ๋ฒ์ค, ์ ์ด ๋ฒ์ค๋ก ๋๋ฉ๋๋ค.
-
๋ฐ์ดํฐ ๋ฒ์ค: ๋ฐ์ดํฐ ๋ฒ์ค๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ํ ์ ์๋๋ก ํ๋ฉฐ 32, 64๊ฐ์ ์ ๋ค๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
-
์ฃผ์ ๋ฒ์ค: ๋ฐ์ดํฐ์ ์ถ๋ฐ์ง๋ ๋์ฐฉ์ง์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ๋ฌํ๋ค.
-
์ ์ด ๋ฒ์ค: ๋ฐ์ดํฐ ๋ฒ์ค์ ์ฃผ์ ๋ฒ์ค๋ฅผ ์ ์ดํ๋ค.
- Read
- Write
- Transfer Acknowledgment (๋ฐ์ดํฐ๊ฐ ์ ๋ณด๋ด์ก๋์ง)
- Clock Signal (์ธ์ ๋ฐ์ดํฐ ๋ณด๋๋์ง ํ์) ๋ฐ์ดํฐ๊ฐ ์ ์ก๋๋ ๋ฐฉ์์๋ Serial, Parallel ๋ฐฉ์์ด ์์ต๋๋ค. ํ๋ CPU์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ Serial ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
-
Serial: ๋ฐ์ดํฐ๊ฐ ์์ฐจ์ ์ผ๋ก ํ๋์ Channel์ ํตํด ์ ์ก๋๋ค.
-
Parallel: ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ Channel์ ํตํด ๋์์ ์ ์ก๋๋ค. ์ด๋ ๊ฐ Channel์ ํตํด ๋ค์ด์ค๋ ๋ฐ์ดํฐ๊ฐ ๋์์ ๋๋ฌํด์ผ ํ๋ค.
IRQ๋ ์ปดํจํฐ์ ์ฃผ๋ณ ๊ธฐ๊ธฐ๊ฐ CPU์๊ฒ ์ด๋ค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ์๋ฆฌ๋ line์ ๋๋ค. ์ฆ, CPU๊ฐ ์ด๋ค ์ผ์ด ์ฒ๋ฆฌํ๋ค๊ฐ๋ ์ฃผ๋ณ ๊ธฐ๊ธฐ์์ Interrupt๊ฐ ๋ค์ด์ค๋ฉด ํ๋ ์ผ์ ์ค๋จํ๊ณ ํด๋น Interrupt์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค. IRQ ๋ฒํธ์ ๋ฐ๋ฅธ Interrupt ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- IRQ ํ์ด๋จธ
- ํค๋ณด๋
- IRQ ์บ์ค ์ผ์ด๋ ๊ณต์
- ์๋ฆฌ์ผํฌํธ 2, COM2, COM4 ( ๋ชจ๋ / ๋ง์ฐ์ค)
- ์๋ฆฌ์ผํฌํธ 1, COM1, COM3 ( ๋ชจ๋ / ๋ง์ฐ์ค)
- LPT2 ๋ณ๋ ฌํฌํธ ํน์
- FDD ์ปจํธ๋กค๋ฌ
- LPT1 ๋ณ์ด ํฌํธ ๋ฑ ํน์ ์ฌ์ด๋์นด๋
- RTC( Real Time Clock)
- ์๋น, ์ฃผ๋ก ๋ฏธ๋ ์นด๋(MPU401)์์ ์ฌ์ฉ , SOUND ,VGA . USB, MPEG II
- ์๋น , SOUND ,VGA . USB,MPEG II,
- ์๋น, SCSI ์๋ตํฐ, SOUND ,VGA . USB,MPEG II
- PS/2 ๋ง์ฐ์ค
- ์ฝํ๋ก์ธ์ (์์น์ฒ๋ฆฌ๋ณด์กฐ์ฐ์ฐ์ )
- IDE ํ๋ ์ปจํธ๋กค๋ฌ Primary
- IDE ํ๋ ์ปจํธ๋กค๋ฌ Secondary
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 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์๋ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ํตํด ๋ช ๋ น์ ์ค ์ ์์ต๋๋ค.
ํค๋ณด๋์ 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 ๊ธฐ๋ฒ์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๊ณต๊ฐ์ ์ผ์ ํ ํฌ๊ธฐ๋ก ๋๋ ๋ธ๋ก์ธ Page์ ๋จ์๋ก ์ฌ์ฉํฉ๋๋ค. ์ค์ ๋ฉ๋ชจ๋ฆฌ๋ Page์ ๊ฐ์ ํฌ๊ธฐ๋ก ๋๋ ๋ธ๋ก์ธ Frame ๋จ์๋ ์ฌ์ฉ๋๋ฉฐ, Page๊ฐ ํ๋์ Frame์ ํ ๋น๋ฐ์ต๋๋ค. ์ด ๊ณผ์ ์์ Page๋ ํ๋ก์ธ์ค์ Page ์ ๋ณด์ Page์ ๋ํ Frame์ ์์ ์ฃผ์๋ฅผ ๊ฐ์ผ๋ก ํ๋ Page Tableํํ๋ก ๊ด๋ฆฌ๋ฉ๋๋ค.
๋ณธ ์๋ฃ๋ ์ ๊ฐ ๊ณต๋ถํ๋ฉด์ ์์ฑํ ๊ฒ์ด๋ฏ๋ก ์ค๊ฐ๋ ์ด ์์ ์ ์์ต๋๋ค. ์๋ชป๋ ์ ์ ๋ฐ๊ฒฌํด์ฃผ์ ๋ถ์ ํฐ์คํ ๋ฆฌ ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.