9 min read

OSTEP 36 IO Devices

Table of Contents

Three Easy Pieces ์ค‘ ๋งˆ์ง€๋ง‰ Persistence(์˜์†์„ฑ) ํ•˜๋‚˜ ๋‚จ์•˜๋‹ค. ์˜์†์„ฑ์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•˜๊ธฐ ์ „, ์ž…์ถœ๋ ฅ ์žฅ์น˜์˜ ๊ฐœ๋…์„ ์†Œ๊ฐœํ•˜๊ณ , ์šด์˜์ฒด์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ด๋“ค๊ณผ ์ƒํ˜ธ์ž‘์šฉ ํ•˜๋Š”์ง€ ์•Œ์•„ ๋ณด๋„๋ก ํ•˜์ž.

1. ์‹œ์Šคํ…œ ๊ตฌ์กฐ (System Architecture)

์šฐ์„  ์ผ๋ฐ˜์ ์ธ ์‹œ์Šคํ…œ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•œ๋‹ค.

OSTEP 36 IO Devices-1696860281452.jpeg

CPU์™€ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ Memory Bus๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. ๋˜ ๋ช‡ ๊ฐ€์ง€ ์žฅ์น˜๋“ค์ด ๋ฒ”์šฉ I/O Bus์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. ๋ณดํ†ต PCI๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์—ฌ๊ธฐ์— ๊ทธ๋ž˜ํ”ฝ ์นด๋“œ๋‚˜ ๋‹ค๋ฅธ ๊ณ ์„ฑ๋Šฅ I/O ์žฅ์น˜๋“ค์ด ์—ฐ๊ฒฐ๋œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ, SCSI, SATA, USB๊ฐ™์€ Peripheral I/O Bus (์ฃผ๋ณ€์žฅ์น˜์šฉ ๋ฒ„์Šค) ๊ฐ€ ์žˆ๋‹ค. ์ด ๋ฒ„์Šค๋“ค์„ ํ†ตํ•ด ๋””์Šคํฌ๋‚˜ ๋งˆ์šฐ์Šค๊ฐ™์ด ๊ฐ€์žฅ ๋А๋ฆฐ ์ฃผ๋ณ€ ์žฅ์น˜๊ฐ€ ์—ฐ๊ฒฐ๋œ๋‹ค.

OSTEP 36 IO Devices-1696875011175.jpeg

โ€œ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)

OSTEP 36 IO Devices-1696872204065.jpeg

ํ‘œ์ค€ ์žฅ์น˜์—๋Š” ๋‘ ๊ฐœ์˜ ์ค‘์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ์ธํ„ฐํŽ˜์ด์Šค(Interface) ์ด๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋“ฏ, ํ•˜๋“œ์›จ์–ด๋„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์‹œ์Šคํ…œ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๋™์ž‘์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

๋‘ ๋ฒˆ์งธ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‚ด๋ถ€ ๊ตฌ์กฐ(Internals) ์ด๋‹ค. ์‹œ์Šคํ…œ์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ์žฅ์น˜์— ๋Œ€ํ•œ ์ถ”์ƒํ™”๋ฅผ ์ •์˜ํ•˜๋Š” ์ฑ…์ž„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋‚ด๋ถ€ ๊ตฌ์กฐ ์•ˆ์—๋Š” ์žฅ์น˜์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ ํ•œ๋‘๊ฐœ์˜ ํ•˜๋“œ์›จ์–ด ์นฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ณ , CPU์™€ ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ์žฅ์น˜์— ํŠนํ™”๋œ ์นฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

์ตœ์‹  RAID ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ˆ˜์‹ญ๋งŒ ์ค„์— ๋‹ฌํ•˜๋Š” ํŽŒ์›จ์–ด ๋ผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ํ•˜๋“œ์›จ์–ด ๋‚ด๋ถ€์˜ ๋™์ž‘์„ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.

3. ํ‘œ์ค€ ๋ฐฉ์‹ (The Canonical Protocol)

์œ„์— ๊ทธ๋ ค์ง„ ํ‘œ์ค€ ์žฅ์น˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด, ์„ธ ๊ฐœ์˜ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  • ์ƒํƒœ(status) ๋ ˆ์ง€์Šคํ„ฐ๋Š” ์žฅ์น˜์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ช…๋ น์–ด(command) ๋ ˆ์ง€์Šคํ„ฐ๋Š” ์žฅ์น˜๊ฐ€ ํŠน์ • ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์š”์ฒญํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
  • ๋ฐ์ดํ„ฐ(data) ๋ ˆ์ง€์Šคํ„ฐ๋Š” ์žฅ์น˜์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ฑฐ๋‚˜ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

์ด๋ฒˆ์—๋Š” ์žฅ์น˜๊ฐ€ ์šด์˜์ฒด์ œ๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ์–ด๋–ค ๋™์ž‘์„ ํ•  ๋•Œ, ์šด์˜์ฒด์ œ์™€ ์žฅ์น˜ ๊ฐ„์— ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ์ƒํ˜ธ ์ž‘์šฉ ๊ณผ์ •์„ ์‚ดํŽด๋ณด์ž.

While (STATUS == BUSY)
	; // ์žฅ์น˜๊ฐ€ ๋ฐ”์œ ์ƒํƒœ๊ฐ€ ์•„๋‹ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
๋ฐ์ดํ„ฐ๋ฅผ DATA ๋ ˆ์ง€์Šคํ„ฐ์— ์“ฐ๊ธฐ
๋ช…๋ น์–ด๋ฅผ COMMAND ๋ ˆ์ง€์Šคํ„ฐ์— ์“ฐ๊ธฐ
	(์žฅ์น˜๊ฐ€ ๋ช…๋ น์–ด ์‹คํ–‰)
While (STATUS == BUSY)
	; // ์š”์ฒญ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ

ํ‘œ์ค€ ๋ฐฉ์‹ (Canonical Protocol)์€ ๋„ค ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

  1. ๋ฐ˜๋ณต์ ์œผ๋กœ ์žฅ์น˜์˜ ์ƒํƒœ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ฝ์–ด์„œ ๋ช…๋ น์˜ ์ˆ˜์‹  ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค. -> ์žฅ์น˜์— ๋Œ€ํ•ด ํด๋ง(polling) ํ•œ๋‹ค๊ณ  ํ‘œํ˜„ํ•จ
  2. ์šด์˜์ฒด์ œ๊ฐ€ ๋ฐ์ดํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ์— ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. ex) ๋””์Šคํฌ ๋ธ”๋Ÿญ. ๋ฐ์ดํ„ฐ ์ „์†ก์— ๋ฉ”์ธ CPU๊ฐ€ ๊ด€์—ฌํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ programmed I/O ๋ผ๊ณ  ํ•œ๋‹ค.
  3. ์šด์˜์ฒด์ œ๊ฐ€ ๋ช…๋ น์–ด ๋ ˆ์ง€์Šคํ„ฐ์— ๋ช…๋ น์–ด๋ฅผ ๊ธฐ๋กํ•œ๋‹ค. ๋ช…๋ น์–ด๊ฐ€ ๊ธฐ๋ก๋˜๋ฉด ๋ฐ์ดํ„ฐ๋Š” ์ด๋ฏธ ์ค€๋น„๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  4. ์žฅ์น˜๊ฐ€ ์ฒ˜๋ฆฌ๋ฅผ ์™„๋ฃŒํ–ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋„ ํด๋งํ•œ๋‹ค.

์ด ํ‘œ์ค€ ๋ฐฉ์‹ (Canonical Protocol)์€ ๊ณ„์† polling์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ด๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ CPU๋ฅผ ์–‘๋„ํ•˜์ง€ ์•Š๊ณ  ์žฅ์น˜๊ฐ€ ๋™์ž‘์„ ์™„๋ฃŒํ•˜๋Š” ๋™์•ˆ ๊ณ„์† ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉฐ ์ƒํƒœ๋ฅผ ํ™•์ธํ•œ๋‹ค.

ํด๋ง ์‚ฌ์šฉ์— ๋Œ€ํ•œ cost๋ฅผ ์–ด๋–ป๊ฒŒ ํ”ผํ•  ์ˆ˜ ์žˆ์„๊นŒ?

4. ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์ด์šฉํ•œ CPU ์˜ค๋ฒ„ํ—ค๋“œ ๊ฐœ์„ 

๋””๋ฐ”์ด์Šค๋ฅผ ๊ณ„์† polling ํ•˜๋Š” ๋Œ€์‹  ์šด์˜์ฒด์ œ๋Š” ์ž…์ถœ๋ ฅ ์ž‘์—…์„ ์š”์ฒญํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ block ์‹œํ‚ค๊ณ , CPU๋ฅผ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์–‘๋„ํ•œ๋‹ค. ์žฅ์น˜๊ฐ€ ์ž‘์—…์„ ๋๋งˆ์น˜๋ฉด, ํ•˜๋“œ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , CPU๋Š” ์šด์˜์ฒด์ œ๊ฐ€ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋†“์€ ์ธํ„ฐ๋ŸฝํŠธ ์„œ๋น„์Šค ๋ฃจํ‹ด(interrupt service routine(ISR)) ๋˜๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ(interrupt handler) ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด ํ•ธ๋“ค๋Ÿฌ๋Š” ์šด์˜์ฒด์ œ ์ฝ”๋“œ์˜ ์ผ๋ถ€๋ถ„์ด๋‹ค.

์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ์ž…์ถœ๋ ฅ ์š”์ฒญ์˜ ์™„๋ฃŒ, I/O ๋Œ€๊ธฐ์ค‘์ธ ํ”„๋กœ์„ธ์Šค ๊นจ์šฐ๊ธฐ ๋“ฑ์„ ๋‹ด๋‹นํ•œ๋‹ค.

์‚ฌ์šฉ๋ฅ ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ CPU ์—ฐ์‚ฐ๊ณผ I/O ์—ฐ์‚ฐ์„ ์ค‘์ฒฉ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆผ์œผ๋กœ ์•Œ์•„๋ณด์ž.

OSTEP 36 IO Devices-1696873722013.jpeg

์ด ์˜ˆ์ œ๋Š” CPU๊ฐ€ ์žฅ์น˜์˜ ์ž‘์—…์ด ๋๋‚  ๋•Œ ๊นŒ์ง€ polling ํ•˜๋Š” ๊ฒƒ์ด๊ณ ,

OSTEP 36 IO Devices-1696873741066.jpeg

์ด ์˜ˆ์ œ๋Š” ์žฅ์น˜๊ฐ€ ์ž‘์—…์„ ํ•˜๋Š” ๋™์•ˆ CPU๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค 2๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋””์Šคํฌ ์š”์ฒญ์ด ์™„๋ฃŒ๋˜์–ด ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์šด์˜์ฒด์ œ๊ฐ€ ๋‹ค์‹œ ํ”„๋กœ์„ธ์Šค 1์„ ๊นจ์›Œ ์‹คํ–‰์‹œํ‚จ๋‹ค.

์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ํ•ญ์ƒ ์ตœ์ ์˜ ํ•ด๋ฒ•์€ ์•„๋‹ˆ๋‹ค. ์ž‘์—…์ด ํ•œ ๋ฒˆ์˜ ํด๋ง๋งŒ์œผ๋กœ ๋๋‚˜๋Š” ๋งค์šฐ ๋น ๋ฅธ ์ž‘์—…์ด๋ผ๋ฉด, ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ์‹œ์Šคํ…œ์„ ๋А๋ฆฌ๊ฒŒ ํ•  ๊ฒƒ์ด๋‹ค. Context Switching, ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ๋Š” ๋งค์šฐ ๋น„์‹ผ ์ž‘์—…์ด๋‹ค. ๋น ๋ฅธ ์žฅ์น˜์— ๋Œ€ํ•ด์„œ๋Š” polling, ๋А๋ฆฐ ์žฅ์น˜์— ๋Œ€ํ•ด์„œ๋Š” ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ์ข‹์€ ํ•ด๋ฒ•์ด ๋  ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ ์žฅ์น˜์˜ ์†๋„๋ฅผ ์ž˜ ๋ชจ๋ฅด๊ฑฐ๋‚˜, ๋น ๋ฅผ ๋•Œ๋„ ์žˆ๊ณ  ๋А๋ฆด ๋•Œ๋„ ์žˆ๋Š” ์žฅ์น˜๋ผ๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋Š”๊ฒŒ ์ข‹์„๊นŒ? ์งง์€ ์‹œ๊ฐ„ ๋™์•ˆ ํด๋ง์„ ํ•˜๋‹ค ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ๋„, ๋Œ€๋Ÿ‰์œผ๋กœ ํŒจํ‚ท์ด ๋„์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, live lock์— ๋น ์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์ด ๋ชฐ๋ฆฌ๋ฉด ์›น ์„œ๋ฒ„๊ฐ€ ํด๋ง์„ ์‚ฌ์šฉํ•ด์„œ ์ข€ ๋” ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ธํ„ฐ๋ŸฝํŠธ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์€ ๋ณ‘ํ•ฉ(coalescing) ์ด๋‹ค. CPU์—๊ฒŒ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์ „์— ์ž ์‹œ ๊ธฐ๋‹ค๋ฆฐ ํ›„, ํ•œ ๋ฒˆ์— ๋ชจ์•„์„œ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

5. DMA๋ฅผ ์ด์šฉํ•œ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ด๋™

๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด programmed I/O (PIO)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด CPU๊ฐ€ ๋˜ ๋‹ค์‹œ ๋‹จ์ˆœ ์ž‘์—… ์ฒ˜๋ฆฌ์— ์†Œ๋ชจ๋œ๋‹ค.

OSTEP 36 IO Devices-1696874902759.jpeg

์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋””์Šคํฌ๋กœ ํ•œ ์›Œ๋“œ์”ฉ copyํ•œ๋‹ค. ๊ทธ๋ฆผ์—์„œ c๋กœ ํ‘œ์‹œ๋œ ๋ถ€๋ถ„์ด๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๋ฒ•์„ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๋ฐฉ์‹(Direct Memory Access, DMA) ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. DMA ์—”์ง„์€ ์‹œ์Šคํ…œ ๋‚ด์— ์žˆ๋Š” ํŠน์ˆ˜ ์žฅ์น˜๋กœ์„œ, CPU์˜ ๊ฐ„์„ญ ์—†์ด ๋ฉ”๋ชจ๋ฆฌ์™€ ์žฅ์น˜ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๋‹ด๋‹นํ•œ๋‹ค.

OSTEP 36 IO Devices-1696874912204.jpeg

๋ฐ์ดํ„ฐ๋ฅผ ์žฅ์น˜๋กœ ์ „์†กํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ์šด์˜์ฒด์ œ๋Š” DMA ์—”์ง„์— ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ๋ฐ์ดํ„ฐ ์œ„์น˜์™€ ์ „์†กํ•  ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ, ๊ทธ๋ฆฌ๊ณ  ๋Œ€์ƒ ์žฅ์น˜๋ฅผ ํ”„๋กœ๊ทธ๋žจํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก๋˜๋Š” ๋™์•ˆ ์šด์˜์ฒด์ œ๋Š” ๋‹ค๋ฅธ ์ผ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. DMA ๋™์ž‘์ด ๋๋‚˜๋ฉด DMA ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , ์šด์˜์ฒด์ œ๋Š” ์ „์†ก์ด ์™„๋ฃŒ๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

6. ์žฅ์น˜์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

์žฅ์น˜์™€ ์šด์˜์ฒด์ œ๊ฐ€ ์‹ค์ œ๋กœ ์ •๋ณด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตํ™˜ํ• ๊นŒ?

์ฒซ ๋ฒˆ์งธ๋Š” ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๋ฐฉ๋ฒ•์œผ๋กœ, I/O ๋ช…๋ น์„ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๋ช…๋ น์–ด๋“ค์€ ์šด์˜์ฒด์ œ๊ฐ€ ํŠน์ • ์žฅ์น˜ ๋ ˆ์ง€์Šคํ„ฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด x86์˜ ๊ฒฝ์šฐ in๊ณผ out ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฅ์น˜๋“ค๊ณผ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ช…๋ น์–ด๋“ค์€ ๋Œ€๋ถ€๋ถ„ ํŠน๊ถŒ ๋ช…๋ น์–ด๋“ค์ด๋‹ค. ๋•Œ๋ฌธ์— ์šด์˜์ฒด์ œ๋งŒ์ด ์žฅ์น˜๋“ค๊ณผ ์ง์ ‘ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ memory mapped I/O ์ด๋‹ค. ํ•˜๋“œ์›จ์–ด๋Š” ์žฅ์น˜์˜ ๋ ˆ์ง€์Šคํ„ฐ๋“ค์ด ๋งˆ์น˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์กด์žฌํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋งŒ๋“ ๋‹ค. ํŠน์ • ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ ์šด์˜์ฒด์ œ๋Š” ํ•ด๋‹น ์ฃผ์†Œ์— load, store๋ฅผ ํ•˜๋ฉด ๋œ๋‹ค. ํ•˜๋“œ์›จ์–ด๋Š” load, store ๋ช…๋ น์–ด๊ฐ€ ์ฃผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ–ฅํ•˜๋Š” ๋Œ€์‹  ์žฅ์น˜๋กœ ์—ฐ๊ฒฐ๋˜๊ฒŒ ํ•œ๋‹ค.

7. ์šด์˜์ฒด์ œ์— ์—ฐ๊ฒฐํ•˜๊ธฐ: ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„

์ตœ์ข…์ ์œผ๋กœ ๋‹ค๋ฃฐ ๋ฌธ์ œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๋Š” ์ˆ˜๋งŽ์€ ์žฅ์น˜๋“ค๊ณผ ์šด์˜์ฒด์ œ๋ฅผ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ์ผ๋ฐ˜ํ™”๋œ ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค.

SCSI ๋””์Šคํฌ, IDE ๋””์Šคํฌ, USB ๋“ฑ๊ณผ ๊ฐ™์€ ๊ธฐ๊ธฐ ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š”๋ฐ, ๊ฐ ์žฅ์น˜๋“ค์˜ ๊ตฌ์ฒด์ ์ธ ์ž…์ถœ๋ ฅ ๋ช…๋ น์–ด ํ˜•์‹์— ์ข…์†๋˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š๋‹ค.

์–ด๋–ป๊ฒŒ ์žฅ์น˜ ์ค‘๋ฆฝ์ ์ธ ์šด์˜์ฒด์ œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊นŒ?

์ถ”์ƒํ™”(abstraction)๋ผ๋Š” ๊ณ ์ „์  ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

OSTEP 36 IO Devices-1696879226707.jpeg

ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ์–ด๋–ค ๋””์Šคํฌ ์ข…๋ฅ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•œ๋‹ค. ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ๋ฒ”์šฉ ๋ธ”๋ก ๊ณ„์ธต์— ๋ธ”๋Ÿญ read, write๋ฅผ ์š”์ฒญํ•  ๋ฟ์ด๋‹ค. ๋ฒ”์šฉ ๋ธ”๋Ÿญ ๊ณ„์ธต์€ ์ ์ ˆํ•œ ๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ฒ„๋กœ ๋ฐ›์€ ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๋ฉฐ, ๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ฒ„๋Š” ํŠน์ • ์š”์ฒญ์„ ์žฅ์น˜์— ๋‚ด๋ฆฌ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ผ๋“ค์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด ๊ทธ๋ฆผ์„ ํ†ตํ•ด ์žฅ์น˜์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๋™์ž‘์ด ์–ด๋–ป๊ฒŒ ์šด์˜์ฒด์ œ์˜ ๋Œ€๋ถ€๋ถ„์—๊ฒŒ ์ˆจ๊ฒจ์ง€๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ์บก์Аํ™”๋Š” ๋‹จ์ ๋„ ์žˆ๋‹ค. ์ปค๋„์ด ๋ฒ”์šฉ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ, ํŠน์ˆ˜ ๊ธฐ๋Šฅ์„ ๋งŽ์ด ๊ฐ€์ง„ ์žฅ์น˜๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ํž˜๋“ค ๊ฒƒ์ด๋‹ค.

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

8. ์‚ฌ๋ก€ ์—ฐ๊ตฌ: ๊ฐ„๋‹จํ•œ IDE ๋””์Šคํฌ ๋“œ๋ผ์ด๋ฒ„

IDE ๋””์Šคํฌ๋Š” ์‹œ์Šคํ…œ์— Control, Command block, Status, Error 4๊ฐœ์˜ ๋ ˆ์ง€์Šคํ„ฐ๋กœ ์ด๋ฃจ์–ด์ง„ ๋‹จ์ˆœํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์ด ๋ ˆ์ง€์Šคํ„ฐ๋“ค์€ x86์˜ in, out I/O ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • I/O์˜ ์ฃผ์†Œ๋“ค์„ ์ฝ๊ฑฐ๋‚˜ ์”€์œผ๋กœ์จ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ฆผ์— ๋ณด์ด๋Š” 0x3F6๊ณผ ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด๋‹ค.

OSTEP 36 IO Devices-1696876731194.jpeg

  • ์žฅ์น˜๊ฐ€ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ -> ๋“œ๋ผ์ด๋ธŒ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ด์ง€ ์•Š๊ณ  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๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฅ์น˜์˜ ๋ ˆ์ง€์Šคํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ฒ„์˜ ๊ฐœ๋…์„ ์†Œ๊ฐœํ•˜๋ฉด์„œ ํ•˜์œ„ ๊ณ„์ธต์˜ ์„ธ๋ถ€์ ์ธ ๋‚ด์šฉ์„ ์šด์˜์ฒด์ œ๊ฐ€ ์บก์Аํ™” ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์šด์˜์ฒด์ œ์˜ ๋‚˜๋จธ์ง€๋ฅผ ์žฅ์น˜ ์ค‘๋ฆฝ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.