Three Easy Pieces ์ค ๋ง์ง๋ง Persistence(์์์ฑ) ํ๋ ๋จ์๋ค. ์์์ฑ์ ๋ํด ์๊ฐํ๊ธฐ ์ , ์ ์ถ๋ ฅ ์ฅ์น์ ๊ฐ๋ ์ ์๊ฐํ๊ณ , ์ด์์ฒด์ ๊ฐ ์ด๋ป๊ฒ ์ด๋ค๊ณผ ์ํธ์์ฉ ํ๋์ง ์์ ๋ณด๋๋ก ํ์.
1. ์์คํ ๊ตฌ์กฐ (System Architecture)
์ฐ์ ์ผ๋ฐ์ ์ธ ์์คํ ๊ตฌ์กฐ์ ๋ํด ์์์ผ ํ๋ค.

CPU์ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ๊ฐ Memory Bus๋ก ์ฐ๊ฒฐ๋์ด ์๋ค. ๋ ๋ช ๊ฐ์ง ์ฅ์น๋ค์ด ๋ฒ์ฉ I/O Bus์ ์ฐ๊ฒฐ๋์ด ์๋ค. ๋ณดํต PCI๋ฅผ ์ฌ์ฉํ๊ณ , ์ฌ๊ธฐ์ ๊ทธ๋ํฝ ์นด๋๋ ๋ค๋ฅธ ๊ณ ์ฑ๋ฅ I/O ์ฅ์น๋ค์ด ์ฐ๊ฒฐ๋๋ค. ๋ง์ง๋ง์ผ๋ก, SCSI, SATA, USB๊ฐ์ Peripheral I/O Bus (์ฃผ๋ณ์ฅ์น์ฉ ๋ฒ์ค) ๊ฐ ์๋ค. ์ด ๋ฒ์ค๋ค์ ํตํด ๋์คํฌ๋ ๋ง์ฐ์ค๊ฐ์ด ๊ฐ์ฅ ๋๋ฆฐ ์ฃผ๋ณ ์ฅ์น๊ฐ ์ฐ๊ฒฐ๋๋ค.

โPCIโ๋ โPeripheral Component Interconnectโ์ ์ฝ์๋ก, 1990๋ ๋ ์ค๋ฐ๋ถํฐ 2000๋ ๋ ์ด๋ฐ๊น์ง ์ปดํจํฐ์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ IO Bus ํ์ค ์ค ํ๋์ ๋๋ค.
PCI์ ๋ํ ๋ช ๊ฐ์ง ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
ํ๋ฌ๊ทธ ์ค ํ๋ ์ด: ์ฅ์น๋ฅผ ์ปดํจํฐ์ ์ฐ๊ฒฐํ๋ฉด ์ด์ ์ฒด์ ๊ฐ ์๋์ผ๋ก ์ฅ์น๋ฅผ ๊ฐ์งํ๊ณ ์ค์ ํฉ๋๋ค.
32๋นํธ์ 64๋นํธ ๋ฒ์ : ์ด๊ธฐ PCI ๋ฒ์ค๋ 32๋นํธ ๋ฐ์ดํฐ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์ง๋ง, ๋์ค์ 64๋นํธ ๋ฒ์ ๋ ์ถ์๋์์ต๋๋ค.
๋์ ๋ฐ์ดํฐ ์ ์ก ์๋: PCI ๋ฒ์ค๋ ๊ทธ ๋น์ ๋ค๋ฅธ ๋ฒ์ค ํ์ค์ ๋นํด ๋์ ๋ฐ์ดํฐ ์ ์ก ์๋๋ฅผ ์ ๊ณตํ์ต๋๋ค.
๋ฒ์ฉ์ฑ: ์ฌ๋ฌ ์ข ๋ฅ์ ์ฅ์น (๊ทธ๋ํฝ ์นด๋, ๋คํธ์ํฌ ์นด๋, ์ฌ์ด๋ ์นด๋ ๋ฑ)์ ํธํ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ PCI๋ ์ค๋๋ ๊ธฐ์ ์ด๊ธฐ ๋๋ฌธ์ ํ๋์ PC๋ ์๋ฒ์์๋ ๋ ๋น ๋ฅธ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ์ ๊ณตํ๋ PCI Express (PCIe)์ ๊ฐ์ ์๋ก์ด ํ์ค์ ์ํด ๋์ฒด๋์์ต๋๋ค. PCIe๋ PCI์ ํ์ ํ์ค์ผ๋ก, ๋ฐ์ดํฐ ์ ์ก ์๋์ ํ์ฅ์ฑ, ๊ทธ๋ฆฌ๊ณ ์ธ๋ฐํ ์ ๋ ฅ ๊ด๋ฆฌ ๊ธฐ๋ฅ ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ํฅ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ด๋ ๊ฒ ๊ณ์ธต์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋ง๋ ์ด์ ๋ ๋ฌด์์ผ๊น? ๋ฒ์ค๊ฐ ๊ณ ์ํ๋๋ ค๋ฉด ์งง์์ผ ํ๋ค. ๋๋ฌธ์ ๊ณ ์์ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ค๋ ์ฌ๋ฌ ์ฅ์น๋ค์ ์์ฉํ ๊ณต๊ฐ์ด ์๊ณ , ๊ทธ๋ฐ ๊ณ ์์ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ค๋ ๊ต์ฅํ ๋น์ธ๋ค. ๋๋ฌธ์ ๊ทธ๋ํฝ ์นด๋์ ๊ฐ์ ๊ณ ์ฑ๋ฅ ์ฅ์น๋ CPU์ ๊ฐ๊น๊ฒ ๋ฐฐ์นํ๊ณ , ๋์คํฌ์ ๊ฐ์ ๋๋ฆฐ ์ฅ์น๋ค์ ์ฃผ๋ณ ์ฅ์น I/O ๋ฒ์ค์ ์ฐ๊ฒฐํ๋ค. ์ด๋ฐ ๋๋ฆฐ ์ฅ์น๋ค์ ์ฌ๋ฌ ๊ฐ ์ฐ๊ฒฐํ ์ ์๋ค.
2. ํ์ค ์ฅ์น (A Canonical Device)

ํ์ค ์ฅ์น์๋ ๋ ๊ฐ์ ์ค์ํ ๊ตฌ์ฑ ์์๊ฐ ์๋ค. ์ฒซ ๋ฒ์งธ๋ ์ธํฐํ์ด์ค(Interface) ์ด๋ค. ์ํํธ์จ์ด๊ฐ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ฏ, ํ๋์จ์ด๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ฌ ์์คํ ์ํํธ์จ์ด๊ฐ ๋์์ ์ ์ดํ ์ ์๋๋ก ํด์ผ ํ๋ค.
๋ ๋ฒ์งธ ๊ตฌ์ฑ ์์๋ ๋ด๋ถ ๊ตฌ์กฐ(Internals) ์ด๋ค. ์์คํ ์๊ฒ ์ ๊ณตํ๋ ์ฅ์น์ ๋ํ ์ถ์ํ๋ฅผ ์ ์ํ๋ ์ฑ ์์ ๊ฐ์ง๊ณ ์๋ค. ๋ด๋ถ ๊ตฌ์กฐ ์์๋ ์ฅ์น์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง ํ๋๊ฐ์ ํ๋์จ์ด ์นฉ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์๊ณ , CPU์ ๋ฒ์ฉ ๋ฉ๋ชจ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ์ฅ์น์ ํนํ๋ ์นฉ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ต์ RAID ์ปจํธ๋กค๋ฌ๋ ์์ญ๋ง ์ค์ ๋ฌํ๋ ํ์จ์ด ๋ผ๋ ์ํํธ์จ์ด๊ฐ ํ๋์จ์ด ๋ด๋ถ์ ๋์์ ์ ์ํ๊ณ ์๋ค.
3. ํ์ค ๋ฐฉ์ (The Canonical Protocol)
์์ ๊ทธ๋ ค์ง ํ์ค ์ฅ์น ๊ทธ๋ฆผ์ ๋ณด๋ฉด, ์ธ ๊ฐ์ ๋ ์ง์คํฐ๊ฐ ์กด์ฌํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
- ์ํ(status) ๋ ์ง์คํฐ๋ ์ฅ์น์ ํ์ฌ ์ํ๋ฅผ ์ฝ์ ์ ์๋ค.
- ๋ช ๋ น์ด(command) ๋ ์ง์คํฐ๋ ์ฅ์น๊ฐ ํน์ ๋์์ ์ํํ๋๋ก ์์ฒญํ ๋ ์ฌ์ฉ๋๋ค.
- ๋ฐ์ดํฐ(data) ๋ ์ง์คํฐ๋ ์ฅ์น์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ฑฐ๋ ๋ฐ์ ๋ ์ฌ์ฉ๋๋ค.
์ด๋ฒ์๋ ์ฅ์น๊ฐ ์ด์์ฒด์ ๋ฅผ ๋์ ํ์ฌ ์ด๋ค ๋์์ ํ ๋, ์ด์์ฒด์ ์ ์ฅ์น ๊ฐ์ ์ผ์ด๋ ์ ์๋ ์ํธ ์์ฉ ๊ณผ์ ์ ์ดํด๋ณด์.
While (STATUS == BUSY)
; // ์ฅ์น๊ฐ ๋ฐ์ ์ํ๊ฐ ์๋ ๋๊น์ง ๋๊ธฐ
๋ฐ์ดํฐ๋ฅผ DATA ๋ ์ง์คํฐ์ ์ฐ๊ธฐ
๋ช
๋ น์ด๋ฅผ COMMAND ๋ ์ง์คํฐ์ ์ฐ๊ธฐ
(์ฅ์น๊ฐ ๋ช
๋ น์ด ์คํ)
While (STATUS == BUSY)
; // ์์ฒญ์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐ
ํ์ค ๋ฐฉ์ (Canonical Protocol)์ ๋ค ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
- ๋ฐ๋ณต์ ์ผ๋ก ์ฅ์น์ ์ํ ๋ ์ง์คํฐ๋ฅผ ์ฝ์ด์ ๋ช ๋ น์ ์์ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค. -> ์ฅ์น์ ๋ํด ํด๋ง(polling) ํ๋ค๊ณ ํํํจ
- ์ด์์ฒด์ ๊ฐ ๋ฐ์ดํฐ ๋ ์ง์คํฐ์ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค. ex) ๋์คํฌ ๋ธ๋ญ. ๋ฐ์ดํฐ ์ ์ก์ ๋ฉ์ธ CPU๊ฐ ๊ด์ฌํ๋ ๊ฒฝ์ฐ๋ฅผ programmed I/O ๋ผ๊ณ ํ๋ค.
- ์ด์์ฒด์ ๊ฐ ๋ช ๋ น์ด ๋ ์ง์คํฐ์ ๋ช ๋ น์ด๋ฅผ ๊ธฐ๋กํ๋ค. ๋ช ๋ น์ด๊ฐ ๊ธฐ๋ก๋๋ฉด ๋ฐ์ดํฐ๋ ์ด๋ฏธ ์ค๋น๋์๋ค๊ณ ๊ฐ์ ํ๊ณ ๋ช ๋ น์ด๋ฅผ ์ฒ๋ฆฌํ๋ค.
- ์ฅ์น๊ฐ ์ฒ๋ฆฌ๋ฅผ ์๋ฃํ๋์ง๋ฅผ ํ์ธํ๋ค. ์ฌ๊ธฐ์๋ ํด๋งํ๋ค.
์ด ํ์ค ๋ฐฉ์ (Canonical Protocol)์ ๊ณ์ polling์ ํ๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ด๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค์๊ฒ CPU๋ฅผ ์๋ํ์ง ์๊ณ ์ฅ์น๊ฐ ๋์์ ์๋ฃํ๋ ๋์ ๊ณ์ ๋ฐ๋ณต๋ฌธ์ ๋๋ฉฐ ์ํ๋ฅผ ํ์ธํ๋ค.
ํด๋ง ์ฌ์ฉ์ ๋ํ cost๋ฅผ ์ด๋ป๊ฒ ํผํ ์ ์์๊น?
4. ์ธํฐ๋ฝํธ๋ฅผ ์ด์ฉํ CPU ์ค๋ฒํค๋ ๊ฐ์
๋๋ฐ์ด์ค๋ฅผ ๊ณ์ polling ํ๋ ๋์ ์ด์์ฒด์ ๋ ์ ์ถ๋ ฅ ์์ ์ ์์ฒญํ ํ๋ก์ธ์ค๋ฅผ block ์ํค๊ณ , CPU๋ฅผ ๋ค๋ฅธ ํ๋ก์ธ์ค์๊ฒ ์๋ํ๋ค. ์ฅ์น๊ฐ ์์ ์ ๋๋ง์น๋ฉด, ํ๋์จ์ด ์ธํฐ๋ฝํธ๋ฅผ ๋ฐ์์ํค๊ณ , CPU๋ ์ด์์ฒด์ ๊ฐ ๋ฏธ๋ฆฌ ์ ์ํด๋์ ์ธํฐ๋ฝํธ ์๋น์ค ๋ฃจํด(interrupt service routine(ISR)) ๋๋ ๊ฐ๋จํ๊ฒ ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ(interrupt handler) ๋ฅผ ์คํํ๋ค. ์ด ํธ๋ค๋ฌ๋ ์ด์์ฒด์ ์ฝ๋์ ์ผ๋ถ๋ถ์ด๋ค.
์ธํฐ๋ฝํธ ํธ๋ค๋ฌ๋ ์ ์ถ๋ ฅ ์์ฒญ์ ์๋ฃ, I/O ๋๊ธฐ์ค์ธ ํ๋ก์ธ์ค ๊นจ์ฐ๊ธฐ ๋ฑ์ ๋ด๋นํ๋ค.
์ฌ์ฉ๋ฅ ์ ๋์ด๊ธฐ ์ํ ํต์ฌ ๋ฐฉ๋ฒ ์ค ํ๋๋ ์ธํฐ๋ฝํธ๋ฅผ ํ์ฉํ์ฌ CPU ์ฐ์ฐ๊ณผ I/O ์ฐ์ฐ์ ์ค์ฒฉ์ํค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆผ์ผ๋ก ์์๋ณด์.

์ด ์์ ๋ CPU๊ฐ ์ฅ์น์ ์์ ์ด ๋๋ ๋ ๊น์ง polling ํ๋ ๊ฒ์ด๊ณ ,

์ด ์์ ๋ ์ฅ์น๊ฐ ์์ ์ ํ๋ ๋์ CPU๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค 2๋ฅผ ์คํํ๋ ๊ฒ์ด๋ค. ๋์คํฌ ์์ฒญ์ด ์๋ฃ๋์ด ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ๋ฉด ์ด์์ฒด์ ๊ฐ ๋ค์ ํ๋ก์ธ์ค 1์ ๊นจ์ ์คํ์ํจ๋ค.
์ธํฐ๋ฝํธ๊ฐ ํญ์ ์ต์ ์ ํด๋ฒ์ ์๋๋ค. ์์ ์ด ํ ๋ฒ์ ํด๋ง๋ง์ผ๋ก ๋๋๋ ๋งค์ฐ ๋น ๋ฅธ ์์ ์ด๋ผ๋ฉด, ์ธํฐ๋ฝํธ๊ฐ ์์คํ ์ ๋๋ฆฌ๊ฒ ํ ๊ฒ์ด๋ค. Context Switching, ์ธํฐ๋ฝํธ ์ฒ๋ฆฌ๋ ๋งค์ฐ ๋น์ผ ์์ ์ด๋ค. ๋น ๋ฅธ ์ฅ์น์ ๋ํด์๋ polling, ๋๋ฆฐ ์ฅ์น์ ๋ํด์๋ ์ธํฐ๋ฝํธ๊ฐ ์ข์ ํด๋ฒ์ด ๋ ๊ฒ์ด๋ค.
๋ง์ฝ ์ฅ์น์ ์๋๋ฅผ ์ ๋ชจ๋ฅด๊ฑฐ๋, ๋น ๋ฅผ ๋๋ ์๊ณ ๋๋ฆด ๋๋ ์๋ ์ฅ์น๋ผ๋ฉด ์ด๋ป๊ฒ ํ๋๊ฒ ์ข์๊น? ์งง์ ์๊ฐ ๋์ ํด๋ง์ ํ๋ค ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋์ง ์์ผ๋ฉด ์ธํฐ๋ฝํธ๋ฅผ ์ฌ์ฉํ๋ ํ์ด๋ธ๋ฆฌ๋ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์๋ค.
๋คํธ์ํฌ ํ๊ฒฝ์์๋, ๋๋์ผ๋ก ํจํท์ด ๋์ฐฉํ๋ ๊ฒฝ์ฐ ์ธํฐ๋ฝํธ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, live lock์ ๋น ์ง ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ง์ด ๋ชฐ๋ฆฌ๋ฉด ์น ์๋ฒ๊ฐ ํด๋ง์ ์ฌ์ฉํด์ ์ข ๋ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
๋ ๋ค๋ฅธ ์ธํฐ๋ฝํธ ์ต์ ํ ๊ธฐ๋ฒ์ ๋ณํฉ(coalescing) ์ด๋ค. CPU์๊ฒ ์ธํฐ๋ฝํธ๋ฅผ ์ ๋ฌํ๊ธฐ ์ ์ ์ ์ ๊ธฐ๋ค๋ฆฐ ํ, ํ ๋ฒ์ ๋ชจ์์ ์ธํฐ๋ฝํธ๋ฅผ ์ ๋ฌํ๋ค. ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ธํฐ๋ฝํธ ์ฒ๋ฆฌ์ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์๋ค.
5. DMA๋ฅผ ์ด์ฉํ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ด๋
๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ๋ก ์ ๋ฌํ๊ธฐ ์ํด programmed I/O (PIO)๋ฅผ ์ฌ์ฉํ๋ฉด CPU๊ฐ ๋ ๋ค์ ๋จ์ ์์ ์ฒ๋ฆฌ์ ์๋ชจ๋๋ค.

์ด๋ฐ ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ๋์คํฌ๋ก ํ ์๋์ฉ copyํ๋ค. ๊ทธ๋ฆผ์์ c๋ก ํ์๋ ๋ถ๋ถ์ด๋ค.
์ด ๋ฌธ์ ์ ๋ํ ํด๋ฒ์ ์ง์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ๋ฐฉ์(Direct Memory Access, DMA) ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. DMA ์์ง์ ์์คํ ๋ด์ ์๋ ํน์ ์ฅ์น๋ก์, CPU์ ๊ฐ์ญ ์์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฅ์น ๊ฐ์ ๋ฐ์ดํฐ ์ ์ก์ ๋ด๋นํ๋ค.

๋ฐ์ดํฐ๋ฅผ ์ฅ์น๋ก ์ ์กํ๋ค๊ณ ํ์ ๋, ์ด์์ฒด์ ๋ DMA ์์ง์ ๋ฉ๋ชจ๋ฆฌ ์์ ๋ฐ์ดํฐ ์์น์ ์ ์กํ ๋ฐ์ดํฐ์ ํฌ๊ธฐ, ๊ทธ๋ฆฌ๊ณ ๋์ ์ฅ์น๋ฅผ ํ๋ก๊ทธ๋จํ๋ค. ๊ทธ๋ฌ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ ์ก๋๋ ๋์ ์ด์์ฒด์ ๋ ๋ค๋ฅธ ์ผ์ ์งํํ ์ ์๋ค. DMA ๋์์ด ๋๋๋ฉด DMA ์ปจํธ๋กค๋ฌ๊ฐ ์ธํฐ๋ฝํธ๋ฅผ ๋ฐ์์ํค๊ณ , ์ด์์ฒด์ ๋ ์ ์ก์ด ์๋ฃ๋์์์ ์ ์ ์๋ค.
6. ์ฅ์น์ ์ํธ์์ฉํ๋ ๋ฐฉ๋ฒ
์ฅ์น์ ์ด์์ฒด์ ๊ฐ ์ค์ ๋ก ์ ๋ณด๋ฅผ ์ด๋ป๊ฒ ๊ตํํ ๊น?
์ฒซ ๋ฒ์งธ๋ ๊ฐ์ฅ ์ค๋๋ ๋ฐฉ๋ฒ์ผ๋ก, I/O ๋ช ๋ น์ ๋ช ์์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ์ด ๋ช ๋ น์ด๋ค์ ์ด์์ฒด์ ๊ฐ ํน์ ์ฅ์น ๋ ์ง์คํฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
์๋ฅผ ๋ค์ด x86์ ๊ฒฝ์ฐ in๊ณผ out ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ฅ์น๋ค๊ณผ ํต์ ํ ์ ์๋ค. ์ด ๋ช
๋ น์ด๋ค์ ๋๋ถ๋ถ ํน๊ถ ๋ช
๋ น์ด๋ค์ด๋ค. ๋๋ฌธ์ ์ด์์ฒด์ ๋ง์ด ์ฅ์น๋ค๊ณผ ์ง์ ํต์ ํ ์ ์๋ค.
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ memory mapped I/O ์ด๋ค. ํ๋์จ์ด๋ ์ฅ์น์ ๋ ์ง์คํฐ๋ค์ด ๋ง์น ๋ฉ๋ชจ๋ฆฌ ์์ ์กด์ฌํ๋ ๊ฒ ์ฒ๋ผ ๋ง๋ ๋ค. ํน์ ๋ ์ง์คํฐ๋ฅผ ์ ๊ทผํ๊ธฐ ์ํด์ ์ด์์ฒด์ ๋ ํด๋น ์ฃผ์์ load, store๋ฅผ ํ๋ฉด ๋๋ค. ํ๋์จ์ด๋ load, store ๋ช
๋ น์ด๊ฐ ์ฃผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฅํ๋ ๋์ ์ฅ์น๋ก ์ฐ๊ฒฐ๋๊ฒ ํ๋ค.
7. ์ด์์ฒด์ ์ ์ฐ๊ฒฐํ๊ธฐ: ์ฅ์น ๋๋ผ์ด๋ฒ
์ต์ข ์ ์ผ๋ก ๋ค๋ฃฐ ๋ฌธ์ ๋ ์๋ก ๋ค๋ฅธ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๋ ์๋ง์ ์ฅ์น๋ค๊ณผ ์ด์์ฒด์ ๋ฅผ ์ฐ๊ฒฐ์ํค๋ ์ผ๋ฐํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒ์ด๋ค.
SCSI ๋์คํฌ, IDE ๋์คํฌ, USB ๋ฑ๊ณผ ๊ฐ์ ๊ธฐ๊ธฐ ์์์ ๋์ํ๋ ํ์ผ ์์คํ ์ ๋ง๋ค๊ณ ์ ํ๋๋ฐ, ๊ฐ ์ฅ์น๋ค์ ๊ตฌ์ฒด์ ์ธ ์ ์ถ๋ ฅ ๋ช ๋ น์ด ํ์์ ์ข ์๋๊ฒ ๋ง๋ค๊ณ ์ถ์ง ์๋ค.
์ด๋ป๊ฒ ์ฅ์น ์ค๋ฆฝ์ ์ธ ์ด์์ฒด์ ๋ฅผ ๋ง๋ค ์ ์์๊น?
์ถ์ํ(abstraction)๋ผ๋ ๊ณ ์ ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.

ํ์ผ ์์คํ
์ ์ด๋ค ๋์คํฌ ์ข
๋ฅ๋ฅผ ์ฌ์ฉํ๋์ง ์ ํ ์์ง ๋ชปํ๋ค. ํ์ผ ์์คํ
์ ๋ฒ์ฉ ๋ธ๋ก ๊ณ์ธต์ ๋ธ๋ญ read, write๋ฅผ ์์ฒญํ ๋ฟ์ด๋ค. ๋ฒ์ฉ ๋ธ๋ญ ๊ณ์ธต์ ์ ์ ํ ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ๋ก ๋ฐ์ ์์ฒญ์ ์ ๋ฌํ๋ฉฐ, ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ๋ ํน์ ์์ฒญ์ ์ฅ์น์ ๋ด๋ฆฌ๊ธฐ ์ํด ํ์ํ ์ผ๋ค์ ์ฒ๋ฆฌํ๋ค. ์ด ๊ทธ๋ฆผ์ ํตํด ์ฅ์น์ ๋ํ ๊ตฌ์ฒด์ ์ธ ๋์์ด ์ด๋ป๊ฒ ์ด์์ฒด์ ์ ๋๋ถ๋ถ์๊ฒ ์จ๊ฒจ์ง๋์ง ์ ์ ์๋ค.
์ด๋ฐ ์บก์ํ๋ ๋จ์ ๋ ์๋ค. ์ปค๋์ด ๋ฒ์ฉ์ ์ธ ์ธํฐํ์ด์ค๋ง์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ, ํน์ ๊ธฐ๋ฅ์ ๋ง์ด ๊ฐ์ง ์ฅ์น๋ ์ฌ์ฉํ๊ธฐ ํ๋ค ๊ฒ์ด๋ค.
์ด๋ค ์ฅ์น๋ฅผ ์์คํ ์ ์ฐ๊ฒฐํ๋ ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์, ์๊ฐ์ด ์ง๋๋ฉด์ ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ ์ฝ๋๊ฐ ์ปค๋ ์ฝ๋์ ๋๋ถ๋ถ์ ์ฐจ์งํ๊ฒ ๋์๋ค. ๋๋ผ์ด๋ฒ๋ค์ด ๋๋ถ๋ถ ์ ์ ์ปค๋ ๊ฐ๋ฐ์๊ฐ ์๋ ๊ฐ๋ฐ์๋ค์ ์ํด ๋ง๋ค์ด์ง๊ธฐ ๋๋ฌธ์ ์๋นํ ๋ฒ๊ทธ๋ฅผ ํฌํจํ๊ณ ์๊ณ , ์ปค๋ ํฌ๋์์ ์ฃผ๋ฒ์ด ๋๊ณ ์๋ค.
8. ์ฌ๋ก ์ฐ๊ตฌ: ๊ฐ๋จํ IDE ๋์คํฌ ๋๋ผ์ด๋ฒ
IDE ๋์คํฌ๋ ์์คํ ์ Control, Command block, Status, Error 4๊ฐ์ ๋ ์ง์คํฐ๋ก ์ด๋ฃจ์ด์ง ๋จ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
์ด ๋ ์ง์คํฐ๋ค์ x86์ in, out I/O ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ํน์ I/O์ ์ฃผ์๋ค์ ์ฝ๊ฑฐ๋ ์์ผ๋ก์จ ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฆผ์ ๋ณด์ด๋ 0x3F6๊ณผ ๊ฐ์ ์ฃผ์๋ฅผ ์ฝ๋ ๊ฒ์ด๋ค.

- ์ฅ์น๊ฐ ์ค๋น๋ ๋๊น์ง ๋๊ธฐ -> ๋๋ผ์ด๋ธ๊ฐ ์ฌ์ฉ ์ค์ด์ง ์๊ณ READY ์ํ๊ฐ ๋ ๋๊น์ง Status ๋ ์ง์คํฐ
0x1F7์ ์ฝ๋๋ค. - Command ๋ ์ง์คํฐ์ ์ธ์ ๊ฐ ์ฐ๊ธฐ -> ์นํฐ์ ์์ ์ ๊ทผํด์ผ ํ ์นํฐ๋ค์ ๋
ผ๋ฆฌ ๋ธ๋ญ ์ฃผ์ (LBA), ๊ทธ๋ฆฌ๊ณ ๋๋ผ์ด๋ธ ๋ฒํธ๋ฅผ Command ๋ ์ง์คํฐ
0x1F2~0x1F6์ ๊ธฐ๋กํ๋ค. - I/O ์์ -> Command ๋ ์ง์คํฐ์ ์ฝ๊ธฐ, ์ฐ๊ธฐ๋ฅผ ์ ๋ฌํ๋ค.
READ-WRITE๋ช ๋ น์ด๋ฅผ Command ๋ ์ง์คํฐ์ ๊ธฐ๋กํ๋ค.0x1F7 - ๋ฐ์ดํฐ ์ ์ก (์ฐ๊ธฐ) -> ๋๋ผ์ด๋ธ์ ์ํ๊ฐ READY์ด๊ณ DRQ(Drive Request for Data)์ผ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. ๋ฐ์ดํฐ ํฌํธ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ๋ค.
- ์ธํฐ๋ฝํธ ์ฒ๋ฆฌ -> ๊ฐ๋จํ๊ฒ๋ ๊ฐ ์นํฐ๊ฐ ์ ์ก๋์์ ๋๋ง๋ค ์ธํฐ๋ฝํธ๋ฅผ ์ฒ๋ฆฌํ๊ฒ ํ๊ณ , ๋ณต์กํ๊ฒ๋ ์ผ๊ด์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋๋ก ๋ง๋ค์ด์ ๋ชจ๋ ์ ์ก์ด ์๋ฃ๋์์ ๋ ์ต์ข ์ ์ผ๋ก ํ ๋ฒ๋ง ์ธํฐ๋ฝํธ๋ฅผ ๋ฐ์์ํค๋๋ก ํ๋ค.
- ์๋ฌ ์ฒ๋ฆฌ -> ๊ฐ ๋์ ์ดํ์ Status ๋ ์ง์คํฐ๋ฅผ ์ฝ๋๋ค. ๋ง์ฝ ERROR ๋นํธ๊ฐ ์ค์ ๋์ด ์๋ค๋ฉด Error ๋ ์ง์คํฐ๋ฅผ ์ฝ์ด์ ์์ธ ์ ๋ณด๋ฅผ ํ์ธํ๋ค.
// ์์ ์์ฒญ ๋ฃจํด์ ์ด ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ์ ๋ช
๋ นํ๊ธฐ ์ ์ ๋๋ผ์ด๋ธ๊ฐ ์ค๋น๋์๋์ง ํ์ธํ๋ค.
static int ide_wait_ready() {
while (((int r = inb(0x1f7)) & IDE_BSY) || ! ( r & IDE_DRDY))
; // ๋๋ผ์ด๋ฒ๊ฐ ๋ฐ์์ง ์์ ๋๊น์ง ๋ฐ๋ณต๋ฌธ ์ํ
}
// ์์ฒญ์ ๋์คํฌ๋ก ๋ด๋ ค ๋ณด๋ธ๋ค.
// x86์ in, out ๋ช
๋ น์ด๊ฐ ์ฅ์น ๋ ์ง์คํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๋๋ฐ ์ฌ์ฉ๋๋ค
static void ide_start_request(struct buf *b) {
ide_wait_ready();
outb(0x3f6, 0); // ์ธํฐ๋ฝํธ ๋ฐ์
outb(0x1f2, 1); // ์นํฐ ๋ช๊ฐ?
outb(0x1f3, bโ>sector & 0xff); // LBA ๊ธฐ๋ก
outb(0x1f4, (bโ>sector >> 8) & 0xff); // LBA ๊ธฐ๋ก
outb(0x1f5, (bโ>sector >> 16) & 0xff); // LBA ๊ธฐ๋ก
outb(0x1f6, 0xe0 | ((bโ>dev&1)<<4) | ((bโ>sector>>24)&0x0f));
if(bโ>flags & B_DIRTY) {
outb(0x1f7, IDE_CMD_WRITE); // WRITE
outsl(0x1f0, bโ>data, 512/4); // ๋ฐ์ดํฐ ์ ์ก
} else {
outb(0x1f7, IDE_CMD_READ); // READ
}
}
// ๋๊ธฐ ์ค์ธ ๋ค๋ฅธ ์์ฒญ๋ค์ด ์๋ค๋ฉด ์์ฒญ์ ํ์ ์ฝ์
ํ๊ฑฐ๋ ๋์คํฌ์ ์ง์ ๋ช
๋ นํ๋ค.
// ์ด๋ ๊ฒฝ์ฐ๊ฑด ์์ฒญ์ด ์ฒ๋ฆฌ ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ, ํธ์ถํ ํ๋ก์ธ์ค๋ ์ฌ์ด๋ค.
void ide_rw(struct buf *b) {
acquire(&ide_lock);
for (struct buf **pp = &ide_queue; *pp; pp=&(*pp)โ>qnext)
; // ํ๋ฅผ ์ํ
*pp = b; // ์์ฒญ์ ๋งจ ๋ค์ ์ถ๊ฐ
if (ide_queue == b) // ํ๊ฐ ๋น์๋ค๋ฉด
ide_start_request(b); // ๋์คํฌ์ request ๋ณด๋
while ((bโ>flags & (B_VALID|B_DIRTY)) != B_VALID)
sleep(b, &ide_lock); // ์๋ฃ ๋๊ธฐ
release(&ide_lock);
}
// ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ์ ๋ ํธ์ถ๋๋ค
// ์ฅ์น์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ , I/O๊ฐ ์ข
๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ํ๋ก์ธ์ค๋ฅผ ๊นจ์ด๋ค
// ๊ทธ๋ฆฌ๊ณ ์์ฒญ์ด ๋ ํ์ ์๋ค๋ฉด ide_start_request๋ฅผ ์ด์ฉํ์ฌ ๋ค์ ์์ฒญ ์ฒ๋ฆฌ๋ฅผ ์์ํ๋ค.
void ide_intr() {
struct buf *b;
acquire(&ide_lock);
if (! (bโ>flags & B_DIRTY) && ide_wait_ready() >= 0)
insl(0x1f0, bโ>data, 512/4); // READ์ธ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
bโ>flags |= B_VALID;
bโ>flags &= .B_DIRTY;
wakeup(b); // ๋๊ธฐ ์ค์ธ ํ๋ก์ธ์ค ๊นจ์ฐ๊ธฐ
if ((ide_queue = bโ>qnext) != 0) // ๋ค์ ์์ฒญ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ ์์ฒญ ์์
ide_start_request(ide_queue);
release(&ide_lock);
}
์ด๋ ๊ฒ 4๊ฐ์ ๊ธฐ๋ณธ ํจ์๋ฅผ ํตํ์ฌ ๋์ํ๋ค.
9. ์์ฝ
๋ ๊ฐ์ง ๊ธฐ์ ์ธ ์ธํฐ๋ฝํธ์ DMA๋ ์ฅ์น์ ํจ์จ์ ๋์ด๊ธฐ ์ํด ๋์ ๋์์ผ๋ฉฐ ๋ช ์์ I/O ๋ช ๋ น์ด์ ๋ฉ๋ชจ๋ฆฌ ๋งต I/O๋ฅผ ์ฌ์ฉํ์ฌ ์ฅ์น์ ๋ ์ง์คํฐ์ ์ ๊ทผํ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
๋ง์ง๋ง์ผ๋ก ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ์ ๊ฐ๋ ์ ์๊ฐํ๋ฉด์ ํ์ ๊ณ์ธต์ ์ธ๋ถ์ ์ธ ๋ด์ฉ์ ์ด์์ฒด์ ๊ฐ ์บก์ํ ํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํ์ฉํ์ฌ ์ด์์ฒด์ ์ ๋๋จธ์ง๋ฅผ ์ฅ์น ์ค๋ฆฝ์ ์ผ๋ก ๊ตฌํํ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.