Ver3.0
์ ์ฒด ์ด๋
Ver3.0 ๐ C์ธ์ด๋ก ์ธ์์ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ

๐ C์ธ์ด๋ก ์ธ์์ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ
์คํ์์ค ๊ธฐ์ฌ๋ถํฐ Linux ์ปค๋ ๊ฐ๋ฐ๊น์ง
GNU ํ๋ก์ ํธ์ ํจ๊ปํ๋ ๊ฐ๋ฐ์์ ์ฌ์
GNU ํ๋ก์ ํธ์ ํจ๊ปํ๋ ๊ฐ๋ฐ์์ ์ฌ์
๐ ์คํ์์ค์ ์ธ๊ณ๋ก ์ด๋ํฉ๋๋ค
์๋ ! ํน์ ๋๋ ๋งค์ผ ์ฌ์ฉํ๋ Linux๋ GNU ๋๊ตฌ๋ค์ด ์ด๋ป๊ฒ ๋ง๋ค์ด์ง๋์ง ๊ถ๊ธํ๋ ์ ์์ด? ๐ค ๊ทธ๋ฆฌ๊ณ "๋๋ ์ ๋ฐ ๋ฉ์ง ํ๋ก์ ํธ์ ๊ธฐ์ฌํ ์ ์์๊น?"๋ผ๋ ์๊ฐ ํด๋ณธ ์ ์์ง?์ค๋์ ๊ทธ ๊ถ๊ธ์ฆ์ ์ ์์ํ๊ฒ ํ์ด์ค๊ฒ. C์ธ์ด๋ก ์คํ์์ค์ ๊ธฐ์ฌํ๋ ๋ฐฉ๋ฒ, ํนํ GNU ํ๋ก์ ํธ์ Linux ์ปค๋ ๊ฐ๋ฐ์ ์ฐธ์ฌํ๋ ์ค์ ๋ ธํ์ฐ๋ฅผ ์น๊ตฌ์ฒ๋ผ ํธํ๊ฒ ์๋ ค์ค ๊ฑฐ์ผ. ๐ช
์ฌ์ค ์คํ์์ค ๊ธฐ์ฌ๋ผ๋ ๊ฒ ์ฒ์์ ์์ฒญ ์ด๋ ต๊ณ ๋ฉ๊ฒ๋ง ๋๊ปด์ง์์? ๋๋ ์ฒ์์ ๊ทธ๋ฌ์ด. ํ์ง๋ง ๋ง์ ์์ํด๋ณด๋ฉด ์๊ฐ๋ณด๋ค ํจ์ฌ ์ฌ๋ฏธ์๊ณ , ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค๊ณผ ํ์ ํ๋ฉด์ ์ฑ์ฅํ๋ ๊ฒฝํ์ ์ ๋ง ๊ฐ์ง ๊ฑฐ๋๋ผ๊ณ . โจ
๐ฏ ์ C์ธ์ด๋ก ์คํ์์ค๋ฅผ ํด์ผ ํ ๊น?
๋จผ์ ์ด ์ง๋ฌธ๋ถํฐ ์์ํด๋ณด์. ์์ฆ Python, JavaScript, Rust ๊ฐ์ ์ธ์ด๋ค๋ ์ธ๊ธฐ ๋ง์๋ฐ, ์ ๊ตณ์ด C์ธ์ด๋ก ์คํ์์ค ๊ธฐ์ฌ๋ฅผ ํด์ผ ํ ๊น? ๐คทโโ๏ธ๐ C์ธ์ด๊ฐ ํน๋ณํ ์ด์ C์ธ์ด๋ ์์คํ ํ๋ก๊ทธ๋๋ฐ์ ์์ด์ผ. Linux ์ปค๋, GNU ๋๊ตฌ๋ค, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง, ์๋ฒ ๋๋ ์์คํ ... ์ฐ๋ฆฌ๊ฐ ๋งค์ผ ์ฌ์ฉํ๋ ํต์ฌ ์ธํ๋ผ์ ๋๋ถ๋ถ์ด C๋ก ์์ฑ๋์ด ์์ด. ๐
1972๋ Dennis Ritchie๊ฐ ๋ง๋ ์ดํ๋ก 50๋ ์ด ๋์์ง๋ง, C์ธ์ด๋ ์ฌ์ ํ ํ์ญ์ด์ผ. ์ ๊ทธ๋ด๊น? ๋ฐ๋ก ์ฑ๋ฅ, ์ด์์ฑ, ํ๋์จ์ด ์ ์ด๋ ฅ ๋๋ฌธ์ด์ง. C์ธ์ด๋ ์ด์ ๋ธ๋ฆฌ์ด์ ๊ณ ๊ธ ์ธ์ด์ ์๋ฒฝํ ์ค๊ฐ ์ง์ ์ ์์ด์, ํ๋์จ์ด๋ฅผ ์ง์ ์ ์ดํ๋ฉด์๋ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฑฐ๋ .
๐ ์ค์ ์ฌ๋ก๋ก ๋ณด๋ C์ธ์ด์ ์๋ ฅ
Linux ์ปค๋์ ์ฝ 2,800๋ง ์ค์ ์ฝ๋๋ก ์ด๋ฃจ์ด์ ธ ์๋๋ฐ, ๊ทธ ์ค 98% ์ด์์ด C์ธ์ด๋ก ์์ฑ๋์ด ์์ด. ์ ์ธ๊ณ ์๋ฒ์ 96.3%, ์๋๋ก์ด๋ ์ค๋งํธํฐ, ์ํผ์ปดํจํฐ์ 100%๊ฐ Linux๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฑธ ์๊ฐํ๋ฉด... C์ธ์ด๋ก ์์ฑ๋ ์ฝ๋๊ฐ ์ผ๋ง๋ ๋ง์ ๋๋ฐ์ด์ค์์ ๋์๊ฐ๊ณ ์๋์ง ์์์ด ๊ฐ์ง? ๐
๐ ์คํ์์ค ๊ธฐ์ฌ๊ฐ ์ฃผ๋ ๊ฒ๋ค
์คํ์์ค์ ๊ธฐ์ฌํ๋ค๋ ๊ฑด ๋จ์ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ ์ด์์ ์๋ฏธ๊ฐ ์์ด:Linux ์ปค๋์ ์ฝ 2,800๋ง ์ค์ ์ฝ๋๋ก ์ด๋ฃจ์ด์ ธ ์๋๋ฐ, ๊ทธ ์ค 98% ์ด์์ด C์ธ์ด๋ก ์์ฑ๋์ด ์์ด. ์ ์ธ๊ณ ์๋ฒ์ 96.3%, ์๋๋ก์ด๋ ์ค๋งํธํฐ, ์ํผ์ปดํจํฐ์ 100%๊ฐ Linux๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฑธ ์๊ฐํ๋ฉด... C์ธ์ด๋ก ์์ฑ๋ ์ฝ๋๊ฐ ์ผ๋ง๋ ๋ง์ ๋๋ฐ์ด์ค์์ ๋์๊ฐ๊ณ ์๋์ง ์์์ด ๊ฐ์ง? ๐
1. ์ค์ ๊ฒฝํ์ ๋ณด๊ณ
ํ๊ต๋ ๊ฐ์ธ ํ๋ก์ ํธ์์๋ ๊ฒฝํํ๊ธฐ ํ๋ ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃจ๊ฒ ๋ผ. ์๋ฐฑ๋ง ์ค์ ์ฝ๋๋ฅผ ์ฝ๊ณ , ์ดํดํ๊ณ , ์์ ํ๋ ๊ณผ์ ์์ ์ง์ง ์ค๋ ฅ์ด ๋์ด๋์ง. ๐
2. ๊ธ๋ก๋ฒ ๋คํธ์ํน
์ ์ธ๊ณ์ ๋ฐ์ด๋ ๊ฐ๋ฐ์๋ค๊ณผ ํ์ ํ๋ฉด์ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ๊ณ , ํ ๋ก ํ๊ณ , ๋ฐฐ์ธ ์ ์์ด. ์ด๋ฐ ๊ฒฝํ์ ๋์ผ๋ก๋ ์ด ์ ์๋ ๊ฑฐ์ผ. ๐ค
3. ํฌํธํด๋ฆฌ์ค ๊ฐํ
"Linux ์ปค๋์ ํจ์น๋ฅผ ์ ์ถํ์ต๋๋ค"๋ผ๋ ํ ์ค์ด ์ด๋ ฅ์์ ์๋ค๋ฉด? ๊ทธ ์์ฒด๋ก ์์ฒญ๋ ์ ๋ขฐ๋๋ฅผ ์ฃผ์ง. ์ค์ ๋ก ๋ง์ ๊ธฐ์ ๋ค์ด ์คํ์์ค ๊ธฐ์ฌ ๊ฒฝํ์ ๋์ด ํ๊ฐํด. ๐ผ
4. ์ธ์์ ๊ธฐ์ฌํ๋ ๋ฟ๋ฏํจ
๋ค๊ฐ ์์ฑํ ์ฝ๋๊ฐ ์ ์ธ๊ณ ์์ต ๋ช ์ ์ฌ๋๋ค์ด ์ฌ์ฉํ๋ ์์คํ ์ ํฌํจ๋๋ค๋ ๊ฑด... ๋ง๋ก ํํํ ์ ์๋ ์ฑ์ทจ๊ฐ์ด์ผ. โจ
๐๏ธ GNU ํ๋ก์ ํธ: ์์ ์ํํธ์จ์ด์ ์์
์คํ์์ค ์ด์ผ๊ธฐ๋ฅผ ํ๋ ค๋ฉด GNU ํ๋ก์ ํธ๋ฅผ ๋นผ๋์ ์ ์์ด. 1983๋ Richard Stallman์ด ์์ํ ์ด ํ๋ก์ ํธ๋ ํ๋ ์คํ์์ค ์ด๋์ ๊ทผ๊ฐ์ด ๋์๊ฑฐ๋ . ๐ญ๐ GNU์ ํ์ ๋ฐฐ๊ฒฝ 1980๋ ๋ ์ด, ์ํํธ์จ์ด ์ฐ์ ์ ์ ์ ๋ ํ์์ ์ผ๋ก ๋ณํ๊ณ ์์์ด. ์์ ์๋ ์์ค ์ฝ๋๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๋ ๋ฌธํ๊ฐ ์์๋๋ฐ, ๊ธฐ์ ๋ค์ด ์ํํธ์จ์ด๋ฅผ ์ํํํ๋ฉด์ ์์ค ์ฝ๋๋ฅผ ๊ฐ์ถ๊ธฐ ์์ํ ๊ฑฐ์ง.
MIT ์ธ๊ณต์ง๋ฅ ์ฐ๊ตฌ์์์ ์ผํ๋ Stallman์ ์ด๋ฐ ๋ณํ์ ๋ฐ๋ฐํ์ด. ๊ทธ๋ ์ํํธ์จ์ด๋ ์์ ๋ก์์ผ ํ๋ค๋ ์ฒ ํ์ ๊ฐ์ง๊ณ ์์๊ฑฐ๋ . ๊ทธ๋์ ์์ ํ ์์ ๋ก์ด Unix ํธํ ์ด์์ฒด์ ๋ฅผ ๋ง๋ค๊ธฐ๋ก ๊ฒฐ์ฌํ๊ณ , ์ด๊ฒ ๋ฐ๋ก GNU ํ๋ก์ ํธ์ผ. ๐
์ฐธ๊ณ ๋ก GNU๋ "GNU's Not Unix"์ ์ฌ๊ท์ ์ฝ์์ผ. ํ๋ก๊ทธ๋๋จธ๋ค์ ์ ๋จธ ๊ฐ๊ฐ์ด ๋๊ปด์ง์ง? ๐
๐ก ์์ ์ํํธ์จ์ด์ 4๊ฐ์ง ์์
Stallman์ด ์ ์ํ ์์ ์ํํธ์จ์ด์ 4๊ฐ์ง ํต์ฌ ์์ :
์์ 0: ์ด๋ค ๋ชฉ์ ์ผ๋ก๋ ํ๋ก๊ทธ๋จ์ ์คํํ ์์
์์ 1: ํ๋ก๊ทธ๋จ์ ์๋ ์๋ฆฌ๋ฅผ ์ฐ๊ตฌํ๊ณ ๋ณ๊ฒฝํ ์์
์์ 2: ๋ณต์ฌ๋ณธ์ ์ฌ๋ฐฐํฌํ ์์
์์ 3: ์์ ํ ๋ฒ์ ์ ๋ฐฐํฌํ ์์
์ด 4๊ฐ์ง ์์ ๊ฐ ๋ณด์ฅ๋์ด์ผ ์ง์ ํ ์์ ์ํํธ์จ์ด๋ผ๊ณ ํ ์ ์์ด!
๐ ๏ธ GNU ํ๋ก์ ํธ์ ์ฃผ์ ๋๊ตฌ๋ค
GNU ํ๋ก์ ํธ๋ ์ด์์ฒด์ ๋ฅผ ๊ตฌ์ฑํ๋ ์๋ง์ ๋๊ตฌ๋ค์ ๋ง๋ค์ด๋์ด. ๋๋ ๋ถ๋ช
์ด ์ค ๋ช ๊ฐ๋ ์ฌ์ฉํด๋ดค์ ๊ฑฐ์ผ:Stallman์ด ์ ์ํ ์์ ์ํํธ์จ์ด์ 4๊ฐ์ง ํต์ฌ ์์ :
์์ 0: ์ด๋ค ๋ชฉ์ ์ผ๋ก๋ ํ๋ก๊ทธ๋จ์ ์คํํ ์์
์์ 1: ํ๋ก๊ทธ๋จ์ ์๋ ์๋ฆฌ๋ฅผ ์ฐ๊ตฌํ๊ณ ๋ณ๊ฒฝํ ์์
์์ 2: ๋ณต์ฌ๋ณธ์ ์ฌ๋ฐฐํฌํ ์์
์์ 3: ์์ ํ ๋ฒ์ ์ ๋ฐฐํฌํ ์์
์ด 4๊ฐ์ง ์์ ๊ฐ ๋ณด์ฅ๋์ด์ผ ์ง์ ํ ์์ ์ํํธ์จ์ด๋ผ๊ณ ํ ์ ์์ด!
GCC (GNU Compiler Collection)
C, C++, Objective-C ๋ฑ์ ์ปดํ์ผํ๋ ์ปดํ์ผ๋ฌ์ผ. ์ ์ธ๊ณ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์ปดํ์ผ๋ฌ ์ค ํ๋์ง. GCC ์์ด๋ Linux ์ปค๋๋ ์ปดํ์ผํ ์ ์์ด! โ๏ธ
GNU Coreutils
ls, cp, mv, cat ๊ฐ์ ๊ธฐ๋ณธ ๋ช ๋ น์ด๋ค์ ๋ชจ์์ด์ผ. ํฐ๋ฏธ๋์์ ๋งค์ผ ์ฌ์ฉํ๋ ๊ทธ ๋ช ๋ น์ด๋ค์ด ๋ฐ๋ก GNU Coreutils์ ์ผ๋ถ์ผ. ๐
GNU Bash
๊ฐ์ฅ ์ธ๊ธฐ ์๋ Unix ์ ธ์ด์ง. ์คํฌ๋ฆฝํธ ์์ฑ๋ถํฐ ์์คํ ๊ด๋ฆฌ๊น์ง, Bash ์๋ Linux๋ ์์ํ๊ธฐ ํ๋ค์ด. ๐ป
GNU Make
๋๊ท๋ชจ ํ๋ก์ ํธ์ ๋น๋ ์๋ํ ๋๊ตฌ์ผ. Makefile์ ์์ฑํด๋ณธ ์ ์๋ค๋ฉด ์ด๋ฏธ GNU Make๋ฅผ ์ฌ์ฉํ ๊ฑฐ์ผ. ๐๏ธ
GDB (GNU Debugger)
C/C++ ํ๋ก๊ทธ๋จ ๋๋ฒ๊น ์ ํ์ค ๋๊ตฌ. ๋ฒ๊ทธ๋ฅผ ์ก์ ๋ ์์ด์๋ ์ ๋ ์น๊ตฌ์ง. ๐
glibc (GNU C Library)
C ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ GNU ๊ตฌํ์ฒด์ผ. printf, malloc ๊ฐ์ ํจ์๋ค์ด ์ฌ๊ธฐ์ ๊ตฌํ๋์ด ์์ด. ๐
๐ ์ฌ๋ฏธ์๋ ์ฌ์ค
GNU ํ๋ก์ ํธ๋ ์ด์์ฒด์ ์ ๊ฑฐ์ ๋ชจ๋ ๋ถ๋ถ์ ์์ฑํ์ง๋ง, ์ ์ ๊ฐ์ฅ ํต์ฌ์ธ ์ปค๋ ๊ฐ๋ฐ์์๋ ์ด๋ ค์์ ๊ฒช์์ด. GNU Hurd๋ผ๋ ์ปค๋์ ๊ฐ๋ฐํ๊ณ ์์์ง๋ง ์์ฑ์ด ๋ฆ์ด์ก์ง. ๊ทธ ์ฌ์ด์ Linus Torvalds๊ฐ Linux ์ปค๋์ ๋ง๋ค์ด์ ๋ฐํํ๊ณ , GNU ๋๊ตฌ๋ค๊ณผ Linux ์ปค๋์ด ๊ฒฐํฉ๋๋ฉด์ ์์ ํ ์ด์์ฒด์ ๊ฐ ํ์ํ ๊ฑฐ์ผ. ๊ทธ๋์ ์๋ฐํ ๋งํ๋ฉด "GNU/Linux"๋ผ๊ณ ๋ถ๋ฌ์ผ ํ๋ค๊ณ Stallman์ ์ฃผ์ฅํ์ง. ๐ค
๐ฑ GNU ํ๋ก์ ํธ์ ๊ธฐ์ฌํ๋ ๋ฐฉ๋ฒ
GNU ํ๋ก์ ํธ๋ ์ฌ์ ํ ํ๋ฐํ๊ฒ ๊ฐ๋ฐ๋๊ณ ์๊ณ , ์๋ก์ด ๊ธฐ์ฌ์๋ฅผ ํ์ํด. ์์ํ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ค๊ฒ:GNU ํ๋ก์ ํธ๋ ์ด์์ฒด์ ์ ๊ฑฐ์ ๋ชจ๋ ๋ถ๋ถ์ ์์ฑํ์ง๋ง, ์ ์ ๊ฐ์ฅ ํต์ฌ์ธ ์ปค๋ ๊ฐ๋ฐ์์๋ ์ด๋ ค์์ ๊ฒช์์ด. GNU Hurd๋ผ๋ ์ปค๋์ ๊ฐ๋ฐํ๊ณ ์์์ง๋ง ์์ฑ์ด ๋ฆ์ด์ก์ง. ๊ทธ ์ฌ์ด์ Linus Torvalds๊ฐ Linux ์ปค๋์ ๋ง๋ค์ด์ ๋ฐํํ๊ณ , GNU ๋๊ตฌ๋ค๊ณผ Linux ์ปค๋์ด ๊ฒฐํฉ๋๋ฉด์ ์์ ํ ์ด์์ฒด์ ๊ฐ ํ์ํ ๊ฑฐ์ผ. ๊ทธ๋์ ์๋ฐํ ๋งํ๋ฉด "GNU/Linux"๋ผ๊ณ ๋ถ๋ฌ์ผ ํ๋ค๊ณ Stallman์ ์ฃผ์ฅํ์ง. ๐ค
1. ํ๋ก์ ํธ ์ ํํ๊ธฐ
GNU ํ๋ก์ ํธ๋ 400๊ฐ ์ด์์ ํจํค์ง๋ก ๊ตฌ์ฑ๋์ด ์์ด. ์ฒ์์๋ ๋ค๊ฐ ์์ฃผ ์ฌ์ฉํ๊ฑฐ๋ ๊ด์ฌ ์๋ ๋๊ตฌ๋ฅผ ์ ํํ๋ ๊ฒ ์ข์. ์๋ฅผ ๋ค์ด Bash๋ฅผ ์์ฃผ ์ด๋ค๋ฉด Bash ํ๋ก์ ํธ์ ๊ธฐ์ฌํ๋ ์์ผ๋ก. ๐ฏ
2. ๋ฉ์ผ๋ง ๋ฆฌ์คํธ ๊ฐ์
GNU ํ๋ก์ ํธ๋ ์ฃผ๋ก ๋ฉ์ผ๋ง ๋ฆฌ์คํธ๋ฅผ ํตํด ์ํตํด. ๊ฐ ํ๋ก์ ํธ๋ง๋ค ๊ฐ๋ฐ์ ๋ฉ์ผ๋ง ๋ฆฌ์คํธ๊ฐ ์์ผ๋ ๊ฐ์ ํด์ ํ ๋ก ์ ์ง์ผ๋ณด๋ ๊ฒ๋ถํฐ ์์ํด๋ด. ๐ง
3. ๋ฒ๊ทธ ๋ฆฌํฌํธ ์ฝ๊ธฐ
GNU Savannah(savannah.gnu.org)์์ ๋ฒ๊ทธ ๋ฆฌํฌํธ๋ฅผ ํ์ธํ ์ ์์ด. ์ด๋ณด์๋ ํด๊ฒฐํ ์ ์๋ ๊ฐ๋จํ ๋ฒ๊ทธ๋ค์ด ์์ผ๋ ์ฐพ์๋ด. ๐
4. ๋ฌธ์ํ ๊ธฐ์ฌ
์ฝ๋ ์์ฑ์ด ๋ถ๋ด์ค๋ฝ๋ค๋ฉด ๋ฌธ์ํ๋ถํฐ ์์ํด๋ ์ข์. ๋งค๋ด์ผ ๊ฐ์ , ํํ ๋ฆฌ์ผ ์์ฑ, ๋ฒ์ญ ๋ฑ๋ ์ค์ํ ๊ธฐ์ฌ์ผ. ๐
5. ํจ์น ์ ์ถ
GNU ํ๋ก์ ํธ๋ ์ ํต์ ์ผ๋ก ์ด๋ฉ์ผ์ ํตํด ํจ์น๋ฅผ ์ ์ถํด. Git format-patch ๋ช ๋ น์ด๋ก ํจ์น๋ฅผ ๋ง๋ค๊ณ , ๋ฉ์ผ๋ง ๋ฆฌ์คํธ๋ก ๋ณด๋ด๋ฉด ๋ผ. ๐ฎ
๐ง Linux ์ปค๋: ์คํ์์ค์ ์๊ด
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก Linux ์ปค๋ ์ด์ผ๊ธฐ๋ฅผ ํด๋ณผ๊น? Linux๋ ์ธ๊ณ์์ ๊ฐ์ฅ ์ฑ๊ณต์ ์ธ ์คํ์์ค ํ๋ก์ ํธ ์ค ํ๋์ผ. ๐๐ Linux์ ํ์ 1991๋ 8์ 25์ผ, ํ๋๋ ํฌ์ฑํค ๋ํ์ 21์ด ํ์ Linus Torvalds๊ฐ comp.os.minix ๋ด์ค๊ทธ๋ฃน์ ์ด๋ฐ ๋ฉ์์ง๋ฅผ ์ฌ๋ ธ์ด:
"I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones."
"๋๋ 386(486) AT ํด๋ก ์ ์ํ (๋ฌด๋ฃ) ์ด์์ฒด์ ๋ฅผ ๋ง๋ค๊ณ ์์ด์ (๊ทธ๋ฅ ์ทจ๋ฏธ๋ก, GNU์ฒ๋ผ ํฌ๊ณ ์ ๋ฌธ์ ์ด์ง ์์ ๊ฑฐ์์)."
์ฌ๋ฏธ์๋ ๊ฑด, Linus ๋ณธ์ธ๋ ์ด๊ฒ ์ด๋ ๊ฒ ์ปค์ง ์ค์ ๋ชฐ๋๋ค๋ ๊ฑฐ์ผ. ๐
์ฒ์์ ์ ๋ง ๊ฐ์ธ ํ๋ก์ ํธ๋ก ์์ํ๋๋ฐ, ์์ค ์ฝ๋๋ฅผ ๊ณต๊ฐํ์ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ๊ด์ฌ์ ๊ฐ์ง๊ณ ๊ธฐ์ฌํ๊ธฐ ์์ํ์ง."๋๋ 386(486) AT ํด๋ก ์ ์ํ (๋ฌด๋ฃ) ์ด์์ฒด์ ๋ฅผ ๋ง๋ค๊ณ ์์ด์ (๊ทธ๋ฅ ์ทจ๋ฏธ๋ก, GNU์ฒ๋ผ ํฌ๊ณ ์ ๋ฌธ์ ์ด์ง ์์ ๊ฑฐ์์)."
์ด๊ธฐ ๋ฒ์ 0.01์ ๊ฒจ์ฐ 10,239์ค์ ์ฝ๋์์ด. ์ง๊ธ์ 2,800๋ง ์ค์ด ๋์ผ๋... 30๋ ๋์ ์ผ๋ง๋ ์ฑ์ฅํ๋์ง ์ ์ ์์ง? ๐
๐๏ธ Linux ์ปค๋์ ๊ตฌ์กฐ Linux ์ปค๋์ ๋ชจ๋๋ฆฌ์ ์ปค๋์ด๋ฉด์๋ ๋ชจ๋ํ๊ฐ ์ ๋์ด ์์ด. ์ฃผ์ ๊ตฌ์ฑ ์์๋ฅผ ์ดํด๋ณด์:
ํ๋ก์ธ์ค ๊ด๋ฆฌ (Process Management)
ํ๋ก์ธ์ค ์์ฑ, ์ค์ผ์ค๋ง, ์ข ๋ฃ๋ฅผ ๋ด๋นํด. CFS(Completely Fair Scheduler)๋ผ๋ ์ค์ผ์ค๋ฌ๊ฐ CPU ์๊ฐ์ ๊ณต์ ํ๊ฒ ๋ถ๋ฐฐํ์ง. โ๏ธ
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ (Memory Management)
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ, ํ์ด์ง, ์ค์ ๋ฑ์ ์ฒ๋ฆฌํด. ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ ์ปค๋์ ํต์ฌ ์ญํ ์ด์ผ. ๐ง
ํ์ผ ์์คํ (File Systems)
ext4, XFS, Btrfs ๋ฑ ๋ค์ํ ํ์ผ ์์คํ ์ ์ง์ํด. VFS(Virtual File System) ๋ ์ด์ด๊ฐ ํต์ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ง. ๐
๋คํธ์ํฌ ์คํ (Network Stack)
TCP/IP ํ๋กํ ์ฝ ๊ตฌํ, ์์ผ ์ธํฐํ์ด์ค, ๋คํธ์ํฌ ๋๋ผ์ด๋ฒ ๋ฑ์ ํฌํจํด. ๐
๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ (Device Drivers)
ํ๋์จ์ด์ ํต์ ํ๋ ์ฝ๋์ผ. ์ปค๋ ์ฝ๋์ ์ ๋ฐ ์ด์์ด ๋๋ผ์ด๋ฒ ์ฝ๋์ผ ์ ๋๋ก ๋น์ค์ด ์ปค. ๐
์ํคํ ์ฒ๋ณ ์ฝ๋ (Architecture-specific Code)
x86, ARM, RISC-V ๋ฑ ๋ค์ํ CPU ์ํคํ ์ฒ๋ฅผ ์ง์ํ๊ธฐ ์ํ ์ฝ๋์ผ. ๐๏ธ
๐ก ์ปค๋ ๊ณต๊ฐ vs ์ฌ์ฉ์ ๊ณต๊ฐ
Linux๋ ์ปค๋ ๊ณต๊ฐ(kernel space)๊ณผ ์ฌ์ฉ์ ๊ณต๊ฐ(user space)์ ๋ช ํํ ๊ตฌ๋ถํด. ์ปค๋ ๊ณต๊ฐ์ ํน๊ถ ๋ชจ๋์์ ์คํ๋๊ณ ํ๋์จ์ด์ ์ง์ ์ ๊ทผํ ์ ์์ด. ์ฌ์ฉ์ ๊ณต๊ฐ์ ํ๋ก๊ทธ๋จ๋ค์ ์์คํ ์ฝ์ ํตํด์๋ง ์ปค๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ง.
์ด๋ฐ ๋ถ๋ฆฌ ๋๋ถ์ ์์คํ ์์ ์ฑ๊ณผ ๋ณด์์ด ํฌ๊ฒ ํฅ์๋ผ. ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ด ๋ฒ๊ทธ๋ก ์ฃฝ์ด๋ ์ปค๋์ ์ํฅ์ ๋ฐ์ง ์๊ฑฐ๋ !
๐ Linux ์ปค๋ ๊ฐ๋ฐ ํต๊ณ
Linux ์ปค๋ ๊ฐ๋ฐ์ ๊ท๋ชจ๊ฐ ์ผ๋ง๋ ํฐ์ง ์ซ์๋ก ๋ณด๋ฉด ๋ ์ค๊ฐ๋:Linux๋ ์ปค๋ ๊ณต๊ฐ(kernel space)๊ณผ ์ฌ์ฉ์ ๊ณต๊ฐ(user space)์ ๋ช ํํ ๊ตฌ๋ถํด. ์ปค๋ ๊ณต๊ฐ์ ํน๊ถ ๋ชจ๋์์ ์คํ๋๊ณ ํ๋์จ์ด์ ์ง์ ์ ๊ทผํ ์ ์์ด. ์ฌ์ฉ์ ๊ณต๊ฐ์ ํ๋ก๊ทธ๋จ๋ค์ ์์คํ ์ฝ์ ํตํด์๋ง ์ปค๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ง.
์ด๋ฐ ๋ถ๋ฆฌ ๋๋ถ์ ์์คํ ์์ ์ฑ๊ณผ ๋ณด์์ด ํฌ๊ฒ ํฅ์๋ผ. ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ด ๋ฒ๊ทธ๋ก ์ฃฝ์ด๋ ์ปค๋์ ์ํฅ์ ๋ฐ์ง ์๊ฑฐ๋ !
๊ธฐ์ฌ์ ์
2020๋ ๊ธฐ์ค์ผ๋ก ์ฝ 20,000๋ช ์ด์์ ๊ฐ๋ฐ์๊ฐ Linux ์ปค๋์ ๊ธฐ์ฌํ์ด. ๋งค๋ 4,000~5,000๋ช ์ ๊ฐ๋ฐ์๊ฐ ํ๋ํ๊ณ ์์ง. ๐ฅ
์ปค๋ฐ ์๋
ํ๋ฃจ ํ๊ท 200~300๊ฐ์ ์ปค๋ฐ์ด ๋ฉ์ธ๋ผ์ธ์ ๋จธ์ง๋ผ. 1์๊ฐ์ ์ฝ 8~10๊ฐ์ ๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ์๋๋ ์ ์ด์ผ. ์ ๋ง ๋น ๋ฅด์ง? โก
๋ฆด๋ฆฌ์ค ์ฃผ๊ธฐ
์ฝ 9~10์ฃผ๋ง๋ค ์๋ก์ด ๋ฉ์ด์ ๋ฒ์ ์ด ๋ฆด๋ฆฌ์ค๋ผ. ๋งค์ฐ ๊ท์น์ ์ด๊ณ ์์ธก ๊ฐ๋ฅํ ๊ฐ๋ฐ ์ฌ์ดํด์ ์ ์งํ๊ณ ์์ด. ๐
์ฝ๋ ๋ณ๊ฒฝ๋
๊ฐ ๋ฆด๋ฆฌ์ค๋ง๋ค ํ๊ท 12,000~15,000๊ฐ์ ํจ์น๊ฐ ํฌํจ๋ผ. ์ฝ 50๋ง~70๋ง ์ค์ ์ฝ๋๊ฐ ์ถ๊ฐ, ์์ , ์ญ์ ๋์ง. ๐
๊ธฐ์ ์ฐธ์ฌ
Intel, Red Hat, Google, Samsung, Huawei ๋ฑ ์๋ฐฑ ๊ฐ์ ๊ธฐ์ ์ด ์ปค๋ ๊ฐ๋ฐ์ ์ฐธ์ฌํ๊ณ ์์ด. ๋ง์ ๊ฐ๋ฐ์๋ค์ด ํ์ฌ ์ ๋ฌด๋ก ์ปค๋ ๊ฐ๋ฐ์ ํ๊ณ ์์ง. ๐ข
๐ฏ Linux ์ปค๋ ๊ฐ๋ฐ ์์ํ๊ธฐ
์, ์ด์ ์ค์ ์ผ๋ก ๋ค์ด๊ฐ๋ณผ๊น? Linux ์ปค๋ ๊ฐ๋ฐ์ ์ฐธ์ฌํ๋ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ์ ๋จ๊ณ๋ณ๋ก ์๋ ค์ค๊ฒ. ๐๐ง ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ถ 1. Linux ์์คํ ์ค๋น
๋น์ฐํ์ง๋ง Linux ํ๊ฒฝ์ด ํ์ํด. Ubuntu, Fedora, Arch Linux ๋ฑ ์ด๋ค ๋ฐฐํฌํ์ด๋ ์๊ด์์ด. ๊ฐ์๋จธ์ ์ ์ฌ์ฉํด๋ ๋์ง๋ง, ์ค์ Linux๋ฅผ ๋ฉ์ธ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ ํจ์ฌ ์ข์. ๐ฅ๏ธ
2. ํ์ ๋๊ตฌ ์ค์น
์ปค๋ ๋น๋์ ํ์ํ ๋๊ตฌ๋ค์ ์ค์นํด์ผ ํด:
# Debian/Ubuntu ๊ธฐ์ค
sudo apt-get install git build-essential kernel-package fakeroot
sudo apt-get install libncurses5-dev libssl-dev ccache flex bison
# Fedora ๊ธฐ์ค
sudo dnf install git gcc make ncurses-devel openssl-devel
sudo dnf install flex bison elfutils-libelf-devel
3. ์ปค๋ ์์ค ๋ฐ๊ธฐLinux ์ปค๋์ Git์ผ๋ก ๊ด๋ฆฌ๋ผ. Linus์ ๋ฉ์ธ ํธ๋ฆฌ๋ฅผ ํด๋ก ํ์:
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
์ด ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด... ์๊ฐ์ด ์ข ๊ฑธ๋ฆด ๊ฑฐ์ผ. ์ปค๋ ์์ค๊ฐ ๋ช ๊ธฐ๊ฐ๋ฐ์ดํธ๋ ๋๊ฑฐ๋ . โณ4. ์ปค๋ ๋น๋ ํด๋ณด๊ธฐ
๋จผ์ ํ์ฌ ์์คํ ์ ์ค์ ์ ๋ณต์ฌํ๊ณ ๋น๋ํด๋ณด์:
# ํ์ฌ ์ปค๋ ์ค์ ๋ณต์ฌ
cp /boot/config-$(uname -r) .config
make olddefconfig
# ๋น๋ (์ฝ์ด ์์ ๋ง์ถฐ -j ์ต์
์กฐ์ )
make -j$(nproc)
# ๋ชจ๋ ๋น๋
make modules
# ์ค์น (์ ํ์ฌํญ, ์กฐ์ฌํด์!)
sudo make modules_install
sudo make install
์ฒซ ๋น๋๋ ์๊ฐ์ด ๊ฝค ๊ฑธ๋ ค. ์ปคํผ ํ ์ ํ๊ณ ์๋ ๋ผ. โ
โ ๏ธ ์ฃผ์์ฌํญ
make install์ ์ค์ ๋ก ์์คํ ์ ์ปค๋์ ์ค์นํ๋ ๋ช ๋ น์ด์ผ. ์๋ชปํ๋ฉด ๋ถํ ์ด ์ ๋ ์๋ ์์ผ๋, ์ฒ์์ ๊ฐ์๋จธ์ ์์ ํ ์คํธํ๋ ๊ฑธ ์ถ์ฒํด. ๋๋ ์ค์น ์์ด ๋น๋๋ง ํด์ ์ปดํ์ผ ์๋ฌ๊ฐ ์๋์ง ํ์ธํ๋ ๊ฒ๋ ์ข์ ์ฐ์ต์ด์ผ!
๐ ์ปค๋ ์ฝ๋ ์ฝ๊ธฐ
์ปค๋์ ๊ธฐ์ฌํ๋ ค๋ฉด ๋จผ์ ์ฝ๋๋ฅผ ์ฝ์ ์ค ์์์ผ ํด. ํ์ง๋ง 2,800๋ง ์ค์ ๋ค ์ฝ์ ์ ์์์? ํจ์จ์ ์ผ๋ก ์ฝ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ค๊ฒ. ๐make install์ ์ค์ ๋ก ์์คํ ์ ์ปค๋์ ์ค์นํ๋ ๋ช ๋ น์ด์ผ. ์๋ชปํ๋ฉด ๋ถํ ์ด ์ ๋ ์๋ ์์ผ๋, ์ฒ์์ ๊ฐ์๋จธ์ ์์ ํ ์คํธํ๋ ๊ฑธ ์ถ์ฒํด. ๋๋ ์ค์น ์์ด ๋น๋๋ง ํด์ ์ปดํ์ผ ์๋ฌ๊ฐ ์๋์ง ํ์ธํ๋ ๊ฒ๋ ์ข์ ์ฐ์ต์ด์ผ!
1. ๊ด์ฌ ์์ญ ์ ํ๊ธฐ
์ฒ์๋ถํฐ ์ ์ฒด๋ฅผ ์ดํดํ๋ ค๊ณ ํ์ง ๋ง. ๋คํธ์ํฌ, ํ์ผ ์์คํ , ๋๋ผ์ด๋ฒ ๋ฑ ๊ด์ฌ ์๋ ์๋ธ์์คํ ํ๋๋ฅผ ๊ณจ๋ผ. ๐ฏ
2. ์ฝ๋ ํ์ ๋๊ตฌ ํ์ฉ
cscope๋ ctags ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์ ์ ์๋ฅผ ์ฝ๊ฒ ์ฐพ์ ์ ์์ด:
# cscope ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
make cscope
# ctags ์์ฑ
make tags
์์ฆ์ VS Code๋ Vim์ LSP(Language Server Protocol)๋ฅผ ์ค์ ํด์ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ค๋ ๋ง์. ๐3. ์จ๋ผ์ธ ๋ฆฌ์์ค ํ์ฉ
Elixir(elixir.bootlin.com)๋ ์น์์ ์ปค๋ ์์ค๋ฅผ ํ์ํ ์ ์๋ ํ๋ฅญํ ๋๊ตฌ์ผ. ํจ์ ํธ์ถ ๊ด๊ณ, ์ ์ ์์น ๋ฑ์ ์ฝ๊ฒ ์ฐพ์ ์ ์์ด. ๐
4. Git ํ์คํ ๋ฆฌ ํ์ฉ
ํน์ ์ฝ๋๊ฐ ์ ๊ทธ๋ ๊ฒ ์์ฑ๋์๋์ง ๊ถ๊ธํ๋ฉด git blame๊ณผ git log๋ฅผ ์ฌ์ฉํด๋ด:
# ๊ฐ ์ค์ ๋๊ฐ ์ธ์ ์์ ํ๋์ง ํ์ธ
git blame -L 100,120 drivers/net/ethernet/intel/e1000/e1000_main.c
# ํน์ ํ์ผ์ ๋ณ๊ฒฝ ํ์คํ ๋ฆฌ
git log --follow drivers/net/ethernet/intel/e1000/e1000_main.c
์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์ฝ์ผ๋ฉด ์ ๊ทธ๋ฐ ๋ณ๊ฒฝ์ด ํ์ํ๋์ง ์ดํดํ ์ ์์ด. ๐ก๐ ์ฒซ ๋ฒ์งธ ํจ์น ๋ง๋ค๊ธฐ ์ด์ ์ค์ ๋ก ํจ์น๋ฅผ ๋ง๋ค์ด๋ณผ ์ฐจ๋ก์ผ! ์ฒ์์ ๊ฐ๋จํ ๊ฒ๋ถํฐ ์์ํ๋ ๊ฒ ์ข์. ๐จ
1. ์ด๋ณด์ ์นํ์ ์ธ ์์ ์ฐพ๊ธฐ
์ปค๋ ๋ฉ์ผ๋ง ๋ฆฌ์คํธ์์ "RESEND", "trivial", "typo" ๊ฐ์ ํค์๋๋ก ๊ฒ์ํ๋ฉด ๊ฐ๋จํ ์์ ๋ค์ ์ฐพ์ ์ ์์ด. ๋๋ scripts/checkpatch.pl์ ์คํํด์ ์ฝ๋ฉ ์คํ์ผ ๋ฌธ์ ๋ฅผ ์ฐพ์๋ณผ ์๋ ์์ง:
# ํน์ ํ์ผ์ ์คํ์ผ ์ฒดํฌ
./scripts/checkpatch.pl --file drivers/staging/some_driver.c
drivers/staging/ ๋๋ ํ ๋ฆฌ๋ ์์ง ๋ฉ์ธ๋ผ์ธ์ ์์ ํ ํตํฉ๋์ง ์์ ๋๋ผ์ด๋ฒ๋ค์ด ์๋ ๊ณณ์ด์ผ. ์ฌ๊ธฐ์ ์์ํ๋ฉด ์ข์. ๐ฑ2. ๋ณ๊ฒฝ์ฌํญ ์์ฑ
์ฝ๋๋ฅผ ์์ ํ๋ค๋ฉด ์ปค๋ฐ์ ๋ง๋ค์ด์ผ ํด. ์ปค๋ฐ ๋ฉ์์ง ํ์์ด ์ค์ํด:
git add modified_file.c
git commit -s
-s ์ต์
์ Signed-off-by ๋ผ์ธ์ ์๋์ผ๋ก ์ถ๊ฐํด์ค. ์ด๊ฑด Developer Certificate of Origin์ ๋์ํ๋ค๋ ์๋ฏธ์ผ. โ๏ธ์ปค๋ฐ ๋ฉ์์ง ํ์์ ์ด๋ ๊ฒ:
subsystem: short description (50 chars or less)
More detailed explanation if needed. Wrap at 72 characters.
Explain what the problem was, why this change is needed, and
how it solves the problem.
Signed-off-by: Your Name <your.email@example.com>
3. ํจ์น ํ์ผ ์์ฑGit format-patch๋ก ํจ์น๋ฅผ ๋ง๋ค์ด:
# ์ต๊ทผ 1๊ฐ ์ปค๋ฐ์ ํจ์น๋ก
git format-patch -1
# ํน์ ์ปค๋ฐ๋ถํฐ ํ์ฌ๊น์ง
git format-patch origin/master
4. ํจ์น ๊ฒ์ฆ๋ณด๋ด๊ธฐ ์ ์ ๋ฐ๋์ ์ฒดํฌํด์ผ ํ ๊ฒ๋ค:
# ์ฝ๋ฉ ์คํ์ผ ์ฒดํฌ
./scripts/checkpatch.pl 0001-your-patch.patch
# ๋น๋ ํ
์คํธ
make -j$(nproc)
# ๊ด๋ จ ์๋ธ์์คํ
๋ง ๋น๋ (๋ ๋น ๋ฆ)
make M=drivers/staging/your_driver/
5. ํจ์น ์ ์กgit send-email์ ์ฌ์ฉํด์ ํจ์น๋ฅผ ๋ฉ์ผ๋ง ๋ฆฌ์คํธ๋ก ๋ณด๋ด:
# git send-email ์ค์ (์ฒ์ ํ ๋ฒ๋ง)
git config --global sendemail.smtpserver smtp.gmail.com
git config --global sendemail.smtpserverport 587
git config --global sendemail.smtpencryption tls
git config --global sendemail.smtpuser your.email@gmail.com
# ํจ์น ์ ์ก
git send-email --to=maintainer@example.com \
--cc=linux-kernel@vger.kernel.org \
0001-your-patch.patch
๋ฉ์ธํ
์ด๋ ์ฃผ์๋ scripts/get_maintainer.pl๋ก ์ฐพ์ ์ ์์ด:./scripts/get_maintainer.pl 0001-your-patch.patch
์ด ์คํฌ๋ฆฝํธ๊ฐ ํด๋น ์ฝ๋์ ๋ฉ์ธํ
์ด๋์ ๊ด๋ จ ๋ฉ์ผ๋ง ๋ฆฌ์คํธ๋ฅผ ์๋ ค์ค. ๐ง
๐ ์ปค๋ ์ฝ๋ฉ ์คํ์ผ๊ณผ ๊ท์น
Linux ์ปค๋์ ๋งค์ฐ ์๊ฒฉํ ์ฝ๋ฉ ์คํ์ผ์ ๊ฐ์ง๊ณ ์์ด. ์ด๊ฑธ ์งํค์ง ์์ผ๋ฉด ํจ์น๊ฐ ๊ฑฐ๋ถ๋ ์ ์์ผ๋ ๊ผญ ์์๋ฌ์ผ ํด. ๐๐จ ๊ธฐ๋ณธ ์ฝ๋ฉ ์คํ์ผ 1. ๋ค์ฌ์ฐ๊ธฐ๋ ํญ 8์นธ
์คํ์ด์ค๊ฐ ์๋๋ผ ํญ ๋ฌธ์๋ฅผ ์ฌ์ฉํด์ผ ํด. ๊ทธ๋ฆฌ๊ณ ํญ ํฌ๊ธฐ๋ 8์นธ์ด์ผ. Linus๋ "8์นธ ๋ค์ฌ์ฐ๊ธฐ๊ฐ ๋๋ฌด ๊น๋ค๋ฉด ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๋ผ"๊ณ ๋งํ์ด. ๐
/* ์ฌ๋ฐ๋ฅธ ์ */
if (condition) {
do_something();
if (another_condition) {
do_more();
}
}
2. ํ ์ค์ 80์ ์ ํ๊ฐ๋ฅํ๋ฉด 80์๋ฅผ ๋์ง ์๋๋ก ํด. 100์๊น์ง๋ ํ์ฉ๋์ง๋ง, 80์๊ฐ ๊ถ์ฅ์ฌํญ์ด์ผ. ๐
3. ์ค๊ดํธ ์คํ์ผ
ํจ์ ์ ์๋ ์ฌ๋ ์ค๊ดํธ๋ฅผ ๋ค์ ์ค์, ์ ์ด๋ฌธ์ ๊ฐ์ ์ค์:
/* ํจ์ ์ ์ */
int my_function(int arg)
{
/* ํจ์ ๋ณธ๋ฌธ */
}
/* ์ ์ด๋ฌธ */
if (condition) {
/* ์ฝ๋ */
} else {
/* ์ฝ๋ */
}
4. ๋ณ์๋ช
๊ณผ ํจ์๋ช
์๋ฌธ์์ ์ธ๋์ค์ฝ์ด๋ฅผ ์ฌ์ฉํด. ์นด๋ฉ์ผ์ด์ค๋ ์ฌ์ฉํ์ง ์์:
/* ์ข์ ์ */
int my_variable;
void process_data(void);
/* ๋์ ์ */
int myVariable;
void processData(void);
5. ์ฃผ์ ์คํ์ผC89 ์คํ์ผ์ ์ฃผ์์ ์ฌ์ฉํด:
/*
* ์ด๊ฒ์ ์ฌ๋ฌ ์ค ์ฃผ์์
๋๋ค.
* ๊ฐ ์ค ์์ ๋ณํ๋ฅผ ๋ถ์
๋๋ค.
*/
/* ํ ์ค ์ฃผ์ */
C99 ์คํ์ผ(//)์ ์ผ๋ถ ์์ธ๋ฅผ ์ ์ธํ๊ณ ๋ ์ฌ์ฉํ์ง ์์. ๐ฌ
๐ง checkpatch.pl์ ํ์ฉ
scripts/checkpatch.pl์ ์ฝ๋ฉ ์คํ์ผ์ ์๋์ผ๋ก ์ฒดํฌํด์ฃผ๋ ์คํฌ๋ฆฝํธ์ผ. ํจ์น๋ฅผ ๋ณด๋ด๊ธฐ ์ ์ ๋ฐ๋์ ์คํํด๋ด:
--strict ์ต์ ์ ์ฌ์ฉํ๋ฉด ๋ ์๊ฒฉํ๊ฒ ์ฒดํฌํด. ๋ชจ๋ ๊ฒฝ๊ณ ๋ฅผ ๋ค ๊ณ ์น ํ์๋ ์์ง๋ง, ๋๋ถ๋ถ์ ๊ณ ์น๋ ๊ฒ ์ข์.
๐ซ ํผํด์ผ ํ ๊ฒ๋ค
1. ๋ถํ์ํ typedefscripts/checkpatch.pl์ ์ฝ๋ฉ ์คํ์ผ์ ์๋์ผ๋ก ์ฒดํฌํด์ฃผ๋ ์คํฌ๋ฆฝํธ์ผ. ํจ์น๋ฅผ ๋ณด๋ด๊ธฐ ์ ์ ๋ฐ๋์ ์คํํด๋ด:
./scripts/checkpatch.pl --strict --file your_file.c
--strict ์ต์ ์ ์ฌ์ฉํ๋ฉด ๋ ์๊ฒฉํ๊ฒ ์ฒดํฌํด. ๋ชจ๋ ๊ฒฝ๊ณ ๋ฅผ ๋ค ๊ณ ์น ํ์๋ ์์ง๋ง, ๋๋ถ๋ถ์ ๊ณ ์น๋ ๊ฒ ์ข์.
๊ตฌ์กฐ์ฒด์ typedef๋ฅผ ๋จ๋ฐํ์ง ๋ง. ์ปค๋์์๋ ๋ช ์์ ์ธ struct ํค์๋ ์ฌ์ฉ์ ์ ํธํด:
/* ์ข์ ์ */
struct my_struct {
int field;
};
/* ๋์ ์ */
typedef struct {
int field;
} my_struct_t;
2. ๋งคํฌ๋ก ๋จ์ฉ๋ณต์กํ ๋ก์ง์ ๋งคํฌ๋ก๋ก ๋ง๋ค์ง ๋ง. ์ธ๋ผ์ธ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋ ์์ ํด:
/* ์ข์ ์ */
static inline int max(int a, int b)
{
return a > b ? a : b;
}
/* ๋์ ์ */
#define MAX(a, b) ((a) > (b) ? (a) : (b))
3. goto ๋จ์ฉgoto๋ ์๋ฌ ์ฒ๋ฆฌ์์๋ง ์ฌ์ฉํด. ๋ฌด๋ถ๋ณํ goto๋ ์คํ๊ฒํฐ ์ฝ๋๋ฅผ ๋ง๋ค์ด:
int my_function(void)
{
int ret = 0;
void *buffer;
buffer = kmalloc(size, GFP_KERNEL);
if (!buffer) {
ret = -ENOMEM;
goto out;
}
/* ์์
์ํ */
kfree(buffer);
out:
return ret;
}
์ด๋ฐ ์์ผ๋ก ๋ฆฌ์์ค ์ ๋ฆฌ๋ฅผ ์ํ goto๋ ๊ถ์ฅ๋ผ. โ
๐ ๋ณด์๊ณผ ์์ ์ฑ ์ปค๋ ์ฝ๋๋ ๋ณด์๊ณผ ์์ ์ฑ์ด ๋งค์ฐ ์ค์ํด. ๋ช ๊ฐ์ง ์ฃผ์์ฌํญ:
1. ๋ฒํผ ์ค๋ฒํ๋ก์ฐ ๋ฐฉ์ง
ํญ์ ๊ฒฝ๊ณ ๊ฒ์ฌ๋ฅผ ํด์ผ ํด:
/* ๋์ ์ */
strcpy(dest, src);
/* ์ข์ ์ */
strncpy(dest, src, sizeof(dest) - 1);
dest[sizeof(dest) - 1] = '\0';
๋ ์ข์ ๋ฐฉ๋ฒ์ strlcpy๋ strscpy๋ฅผ ์ฌ์ฉํ๋ ๊ฑฐ์ผ. ๐ก๏ธ2. ์ ์ ์ค๋ฒํ๋ก์ฐ ์ฒดํฌ
ํฌ๊ธฐ ๊ณ์ฐ ์ ์ค๋ฒํ๋ก์ฐ๋ฅผ ์กฐ์ฌํด:
/* ์์ ํ ํ ๋น */
buffer = kmalloc_array(count, sizeof(*buffer), GFP_KERNEL);
3. NULL ํฌ์ธํฐ ์ฒดํฌํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ํญ์ NULL ์ฒดํฌ:
ptr = kmalloc(size, GFP_KERNEL);
if (!ptr)
return -ENOMEM;
/* ์ด์ ptr ์ฌ์ฉ ๊ฐ๋ฅ */
4. ๋ฝํน ๊ท์น๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๋ฐ์ดํฐ ๋ณดํธ๋ฅผ ์ํด ์ ์ ํ ๋ฝ์ ์ฌ์ฉํด:
spin_lock(&my_lock);
/* ํฌ๋ฆฌํฐ์ปฌ ์น์
*/
spin_unlock(&my_lock);
๋ฐ๋๋ฝ์ ํผํ๊ธฐ ์ํด ๋ฝ ์์๋ฅผ ์ผ๊ด๋๊ฒ ์ ์งํด์ผ ํด. ๐
๐ค ์ปค๋ฎค๋ํฐ์ ์ํตํ๊ธฐ
Linux ์ปค๋ ๊ฐ๋ฐ์ ๊ธฐ์ ์ ๋ฅ๋ ฅ๋งํผ์ด๋ ์ปค๋ฎค๋ํฐ์์ ์ํต์ด ์ค์ํด. ๋ฉ์ผ๋ง ๋ฆฌ์คํธ ๋ฌธํ๋ฅผ ์ดํดํ๋ ๊ฒ ์ฑ๊ณต์ ์ด์ ์ผ. ๐ฌ๐ง ๋ฉ์ผ๋ง ๋ฆฌ์คํธ ์ํฐ์ผ 1. Plain Text ์ด๋ฉ์ผ
HTML ์ด๋ฉ์ผ์ ์ฌ์ฉํ์ง ๋ง. ๋ฐ๋์ plain text ํ์์ผ๋ก ๋ณด๋ด์ผ ํด. Gmail ๊ฐ์ ์น๋ฉ์ผ์ ์ฌ์ฉํ๋ค๋ฉด ์ค์ ์ ๋ฐ๊ฟ์ผ ํ ์๋ ์์ด. ๐
2. ์ธ๋ผ์ธ ๋ต์ฅ
๋ต์ฅํ ๋๋ ์๋๋ฐฉ์ ๋ฉ์์ง ์๋์ ๋ต๋ณ์ ์ฐ๋ ๊ฒ ์๋๋ผ, ๊ฐ ๋ฌธ๋จ ์ฌ์ด์ฌ์ด์ ๋ต๋ณ์ ์ฝ์ ํด:
On Mon, Jan 01, 2024 at 10:00:00AM +0000, Reviewer wrote:
> ์ด ๋ถ๋ถ์ ๋ก์ง์ด ์ดํด๊ฐ ์ ๊ฐ๋๋ฐ์.
> ์ ์ด๋ ๊ฒ ๊ตฌํํ์ จ๋์?
์ด ๋ฐฉ์์ ์ ํํ ์ด์ ๋ ์ฑ๋ฅ ๋๋ฌธ์ ๋๋ค.
๊ธฐ์กด ๋ฐฉ์์ O(n^2)์ ๋ณต์ก๋๋ฅผ ๊ฐ์ง์ง๋ง,
์ด ๊ตฌํ์ O(n)์ผ๋ก ๊ฐ์ ๋ฉ๋๋ค.
> ํ ์คํธ๋ ํด๋ณด์ จ๋์?
๋ค, ๋ค์๊ณผ ๊ฐ์ ํ๊ฒฝ์์ ํ ์คํธํ์ต๋๋ค...
3. ํจ์น ๋ฒ์ ๊ด๋ฆฌ> ์ด ๋ถ๋ถ์ ๋ก์ง์ด ์ดํด๊ฐ ์ ๊ฐ๋๋ฐ์.
> ์ ์ด๋ ๊ฒ ๊ตฌํํ์ จ๋์?
์ด ๋ฐฉ์์ ์ ํํ ์ด์ ๋ ์ฑ๋ฅ ๋๋ฌธ์ ๋๋ค.
๊ธฐ์กด ๋ฐฉ์์ O(n^2)์ ๋ณต์ก๋๋ฅผ ๊ฐ์ง์ง๋ง,
์ด ๊ตฌํ์ O(n)์ผ๋ก ๊ฐ์ ๋ฉ๋๋ค.
> ํ ์คํธ๋ ํด๋ณด์ จ๋์?
๋ค, ๋ค์๊ณผ ๊ฐ์ ํ๊ฒฝ์์ ํ ์คํธํ์ต๋๋ค...
ํผ๋๋ฐฑ์ ๋ฐ์์ ์์ ํ๋ฉด v2, v3... ์ด๋ฐ ์์ผ๋ก ๋ฒ์ ์ ํ์ํด:
git format-patch -v2 -1
๊ทธ๋ฆฌ๊ณ ์ปค๋ฒ ๋ ํฐ์ ๋ณ๊ฒฝ์ฌํญ์ ๋ช
์ํด:
[PATCH v2] driver: fix memory leak in error path
Changes in v2:
- Added NULL check as suggested by John
- Fixed coding style issues
- Updated commit message
4. ์ธ๋ด์ฌ ๊ฐ์ง๊ธฐChanges in v2:
- Added NULL check as suggested by John
- Fixed coding style issues
- Updated commit message
๋ฆฌ๋ทฐ์ด๋ค์ ๋ฐ์ ์ฌ๋๋ค์ด์ผ. ๋ต์ฅ์ด ๋ฉฐ์น ๋๋ ๋ช ์ฃผ ๊ฑธ๋ฆด ์๋ ์์ด. ์กฐ๊ธํดํ์ง ๋ง๊ณ ๊ธฐ๋ค๋ ค. 2์ฃผ ์ ๋ ์ง๋๋ฉด ์ ์คํ๊ฒ ping์ ๋ณด๋ผ ์ ์์ด. โฐ
๐ก ๋ฆฌ๋ทฐ ํผ๋๋ฐฑ ๋ฐ๋ ๋ฒ
๋ฆฌ๋ทฐ์ด์ ํผ๋๋ฐฑ์ด ๋๋ก๋ ๋ ์นด๋ก์ธ ์ ์์ด. ํ์ง๋ง ๊ฐ์ธ์ ์ผ๋ก ๋ฐ์๋ค์ด์ง ๋ง. ๊ทธ๋ค์ ์ฝ๋์ ํ์ง์ ๋์ด๋ ค๋ ๊ฑฐ์ง, ๋๋ฅผ ๊ณต๊ฒฉํ๋ ๊ฒ ์๋์ผ.
"๋น์ ์ด ํ๋ ธ์ต๋๋ค"๋ณด๋ค๋ "์ด ์ ๊ทผ ๋ฐฉ์์ ์ด๋จ๊น์?"๋ผ๋ ์์ผ๋ก ๊ฑด์ค์ ์ผ๋ก ๋ํํ๋ ๊ฒ ์ข์. ๊ทธ๋ฆฌ๊ณ ํ๋ ธ๋ค๋ฉด ์์งํ๊ฒ ์ธ์ ํ๊ณ ๋ฐฐ์ฐ๋ ์์ธ๋ฅผ ๊ฐ์ ธ. ๐
๐ ์ฃผ์ ์ปค๋ฎค๋ํฐ ์ฑ๋
Linux Kernel Mailing List (LKML)๋ฆฌ๋ทฐ์ด์ ํผ๋๋ฐฑ์ด ๋๋ก๋ ๋ ์นด๋ก์ธ ์ ์์ด. ํ์ง๋ง ๊ฐ์ธ์ ์ผ๋ก ๋ฐ์๋ค์ด์ง ๋ง. ๊ทธ๋ค์ ์ฝ๋์ ํ์ง์ ๋์ด๋ ค๋ ๊ฑฐ์ง, ๋๋ฅผ ๊ณต๊ฒฉํ๋ ๊ฒ ์๋์ผ.
"๋น์ ์ด ํ๋ ธ์ต๋๋ค"๋ณด๋ค๋ "์ด ์ ๊ทผ ๋ฐฉ์์ ์ด๋จ๊น์?"๋ผ๋ ์์ผ๋ก ๊ฑด์ค์ ์ผ๋ก ๋ํํ๋ ๊ฒ ์ข์. ๊ทธ๋ฆฌ๊ณ ํ๋ ธ๋ค๋ฉด ์์งํ๊ฒ ์ธ์ ํ๊ณ ๋ฐฐ์ฐ๋ ์์ธ๋ฅผ ๊ฐ์ ธ. ๐
๋ฉ์ธ ๋ฉ์ผ๋ง ๋ฆฌ์คํธ์ผ. ๋ชจ๋ ์ปค๋ ๊ด๋ จ ํ ๋ก ์ด ์ฌ๊ธฐ์ ์ด๋ฃจ์ด์ ธ. ํ๋ฃจ์ ์๋ฐฑ ๊ฐ์ ๋ฉ์ผ์ด ์ค๋๊น ์ฒ์์ ์๋๋ ์ ์์ด. ๐ฌ
์๋ธ์์คํ ๋ณ ๋ฉ์ผ๋ง ๋ฆฌ์คํธ
๋คํธ์ํฌ, ํ์ผ ์์คํ , ๋๋ผ์ด๋ฒ ๋ฑ ๊ฐ ์๋ธ์์คํ ๋ง๋ค ๋ณ๋์ ๋ฉ์ผ๋ง ๋ฆฌ์คํธ๊ฐ ์์ด. ๊ด์ฌ ์๋ ๋ถ์ผ์ ๋ฆฌ์คํธ๋ฅผ ๊ตฌ๋ ํ๋ ๊ฒ ์ข์. ๐ฎ
IRC ์ฑ๋
์ค์๊ฐ ๋ํ๊ฐ ํ์ํ๋ฉด IRC๋ฅผ ์ฌ์ฉํด. #kernelnewbies ์ฑ๋์ ์ด๋ณด์๋ค์ ์ํ ๊ณณ์ด์ผ. ๐ฌ
Linux Kernel Newbies
kernelnewbies.org๋ ์ด๋ณด์๋ฅผ ์ํ ํ๋ฅญํ ๋ฆฌ์์ค์ผ. ํํ ๋ฆฌ์ผ, FAQ, ๋ฉ์ผ๋ง ๋ฆฌ์คํธ ๋ฑ์ด ์์ด. ๐ฑ
LWN.net
Linux Weekly News๋ ์ปค๋ ๊ฐ๋ฐ ๋ํฅ์ ๋ฐ๋ผ๊ฐ๊ธฐ ์ข์ ์ฌ์ดํธ์ผ. ์ฌ์ธต ๊ธฐ์ฌ๋ค์ด ๋ง์์ ๋ฐฐ์ธ ๊ฒ ๋ง์. ๐ฐ
๐ ์ค์ ํ๋ก์ ํธ ์์ด๋์ด
์ด๋ก ๋ง ๋ฐฐ์์๋ ๋ถ์กฑํด. ์ค์ ๋ก ๋ญ๊ฐ๋ฅผ ๋ง๋ค์ด๋ด์ผ ์ค๋ ฅ์ด ๋์ง. ์ด๋ณด์๋ถํฐ ์ค๊ธ์๊น์ง ๋์ ํ ์ ์๋ ํ๋ก์ ํธ๋ค์ ์๊ฐํ ๊ฒ. ๐๐ฑ ์ด๋ณด์ ๋ ๋ฒจ 1. Staging ๋๋ผ์ด๋ฒ ๊ฐ์
drivers/staging/์๋ ์์ง ์์ฑ๋๊ฐ ๋ฎ์ ๋๋ผ์ด๋ฒ๋ค์ด ๋ง์. ์ฝ๋ฉ ์คํ์ผ ์์ , ๊ฐ๋จํ ๋ฒ๊ทธ ํฝ์ค๋ถํฐ ์์ํด๋ด. ๐ง
2. ๋ฌธ์ํ ๊ฐ์
Documentation/ ๋๋ ํ ๋ฆฌ์ ๋ฌธ์๋ค์ ์ฝ๋ค๊ฐ ์คํ๋ ๋ถ๋ช ํํ ์ค๋ช ์ ๋ฐ๊ฒฌํ๋ฉด ์์ ํด๋ด. ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์๋ ๋๋ ๋ถ๋ด์ด ์ ์ด. ๐
3. ์ปค๋ ๋ชจ๋ ์์ฑ
๊ฐ๋จํ ์ปค๋ ๋ชจ๋์ ๋ง๋ค์ด๋ด. "Hello World" ๋ชจ๋๋ถํฐ ์์ํด์ ์ ์ ๋ณต์กํ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด๋ ๊ฑฐ์ผ:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
static int __init hello_init(void)
{
printk(KERN_INFO "Hello, Kernel!\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye, Kernel!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple Hello World module");
๐ ์ค๊ธ์ ๋ ๋ฒจ
1. ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ ๊ฐ๋ฐ์ค์ ํ๋์จ์ด๋ ๊ฐ์ ๋๋ฐ์ด์ค๋ฅผ ์ํ ๋๋ผ์ด๋ฒ๋ฅผ ์์ฑํด๋ด. USB, I2C, SPI ๊ฐ์ ๋ฒ์ค ๋๋ผ์ด๋ฒ๋ถํฐ ์์ํ๋ฉด ์ข์. ๐
2. ํ์ผ ์์คํ ๊ธฐ๋ฅ ์ถ๊ฐ
๊ธฐ์กด ํ์ผ ์์คํ ์ ์์ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด๊ฑฐ๋, FUSE๋ฅผ ์ฌ์ฉํด์ ์ฌ์ฉ์ ๊ณต๊ฐ ํ์ผ ์์คํ ์ ๋ง๋ค์ด๋ด. ๐
3. ์ฑ๋ฅ ์ต์ ํ
ํ๋กํ์ผ๋ง ๋๊ตฌ(perf, ftrace)๋ฅผ ์ฌ์ฉํด์ ๋ณ๋ชฉ ์ง์ ์ ์ฐพ๊ณ ์ต์ ํํด๋ด. โก
4. ๋ณด์ ์ทจ์ฝ์ ์์
์ ์ ๋ถ์ ๋๊ตฌ๋ ํผ์ง์ ํตํด ๋ฐ๊ฒฌ๋ ๋ณด์ ์ด์๋ฅผ ์์ ํด๋ด. ์ด๊ฑด ์ ๋ง ๊ฐ์น ์๋ ๊ธฐ์ฌ์ผ. ๐ก๏ธ
๐ฏ ํ๋ก์ ํธ ์ ํ ํ
1. ๊ด์ฌ์ฌ ๊ธฐ๋ฐ: ๋ค๊ฐ ํฅ๋ฏธ ์๋ ๋ถ์ผ๋ฅผ ์ ํํด. ๋คํธ์ํฌ์ ๊ด์ฌ ์์ผ๋ฉด ๋คํธ์ํฌ ์คํ์, ๊ทธ๋ํฝ์ ๊ด์ฌ ์์ผ๋ฉด DRM ์๋ธ์์คํ ์ ๊ณต๋ถํด๋ด.
2. ์ค์ฉ์ฑ: ๋ค๊ฐ ์ค์ ๋ก ์ฌ์ฉํ๋ ํ๋์จ์ด๋ ์ํํธ์จ์ด์ ๊ด๋ จ๋ ํ๋ก์ ํธ๋ฅผ ์ ํํ๋ฉด ๋๊ธฐ๋ถ์ฌ๊ฐ ๋ผ.
3. ์ปค๋ฎค๋ํฐ ํ๋: ํ๋ฐํ ๋ฉ์ธํ ์ด๋๊ฐ ์๋ ์๋ธ์์คํ ์ ์ ํํ๋ฉด ํผ๋๋ฐฑ์ ๋นจ๋ฆฌ ๋ฐ์ ์ ์์ด.
4. ๋์ด๋ ์กฐ์ : ๋๋ฌด ์ด๋ ค์ด ๊ฒ๋ถํฐ ์์ํ์ง ๋ง. ์์ ์ฑ๊ณต์ ์์๊ฐ๋ ๊ฒ ์ค์ํด!
๐ผ ์ฌ๋ฅ๋ท์์ ๋ฐฐ์ฐ๊ณ ๋๋๊ธฐ
ํน์ ์ปค๋ ๊ฐ๋ฐ์ ๋ฐฐ์ฐ๋ฉด์ ๋งํ๋ ๋ถ๋ถ์ด ์๊ฑฐ๋, ๋ฐ๋๋ก ๋ค๊ฐ ๋ฐฐ์ด ๊ฑธ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๊ณต์ ํ๊ณ ์ถ๋ค๋ฉด? ์ฌ๋ฅ๋ท์ ํ์ฉํด๋ด! ๐1. ๊ด์ฌ์ฌ ๊ธฐ๋ฐ: ๋ค๊ฐ ํฅ๋ฏธ ์๋ ๋ถ์ผ๋ฅผ ์ ํํด. ๋คํธ์ํฌ์ ๊ด์ฌ ์์ผ๋ฉด ๋คํธ์ํฌ ์คํ์, ๊ทธ๋ํฝ์ ๊ด์ฌ ์์ผ๋ฉด DRM ์๋ธ์์คํ ์ ๊ณต๋ถํด๋ด.
2. ์ค์ฉ์ฑ: ๋ค๊ฐ ์ค์ ๋ก ์ฌ์ฉํ๋ ํ๋์จ์ด๋ ์ํํธ์จ์ด์ ๊ด๋ จ๋ ํ๋ก์ ํธ๋ฅผ ์ ํํ๋ฉด ๋๊ธฐ๋ถ์ฌ๊ฐ ๋ผ.
3. ์ปค๋ฎค๋ํฐ ํ๋: ํ๋ฐํ ๋ฉ์ธํ ์ด๋๊ฐ ์๋ ์๋ธ์์คํ ์ ์ ํํ๋ฉด ํผ๋๋ฐฑ์ ๋นจ๋ฆฌ ๋ฐ์ ์ ์์ด.
4. ๋์ด๋ ์กฐ์ : ๋๋ฌด ์ด๋ ค์ด ๊ฒ๋ถํฐ ์์ํ์ง ๋ง. ์์ ์ฑ๊ณต์ ์์๊ฐ๋ ๊ฒ ์ค์ํด!
์ฌ๋ฅ๋ท(jaenung.net)์ ๋ค์ํ ์ฌ๋ฅ์ ๊ฑฐ๋ํ๋ ํ๋ซํผ์ด์ผ. C์ธ์ด ํ๋ก๊ทธ๋๋ฐ, ์ปค๋ ๊ฐ๋ฐ, ์คํ์์ค ๊ธฐ์ฌ ๋ฐฉ๋ฒ ๋ฑ์ ๋ฐฐ์ฐ๊ณ ์ถ์ ์ฌ๋๋ค๊ณผ ๊ฐ๋ฅด์น๊ณ ์ถ์ ์ฌ๋๋ค์ด ๋ง๋ ์ ์๋ ๊ณณ์ด์ง. ๋ฉํ ๋ง์ ๋ฐ๊ฑฐ๋, ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ๊ฑฐ๋, ๋๋ ๋ค๊ฐ ๋ฉํ ๊ฐ ๋์ด ์ด๋ณด์๋ค์ ๋์์ค ์๋ ์์ด. ๐ค
ํนํ ์คํ์์ค ๊ธฐ์ฌ๋ ํผ์ ํ๊ธฐ ์ด๋ ค์ธ ์ ์๋๋ฐ, ๊ฒฝํ ์๋ ๊ฐ๋ฐ์์ ๊ฐ์ด๋๋ฅผ ๋ฐ์ผ๋ฉด ํจ์ฌ ์์ํ๊ฒ ์์ํ ์ ์๊ฑฐ๋ . ์ฌ๋ฅ๋ท์์ ๊ทธ๋ฐ ๊ธฐํ๋ฅผ ์ฐพ์๋ณด๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์ผ!
๐ฌ ๊ณ ๊ธ ์ฃผ์ : ์ปค๋ ๋ด๋ถ ๊น์ด ํ๊ธฐ
๊ธฐ๋ณธ์ ๋์ด์ ๋ ๊น์ด ๋ค์ด๊ฐ๊ณ ์ถ๋ค๋ฉด? ์ด์ ๋ถํฐ๋ ์ข ๋ ๊ณ ๊ธ ์ฃผ์ ๋ค์ ๋ค๋ค๋ณผ๊ฒ. ๐๐ง ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์๋ธ์์คํ Linux์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ์ ๋ง ๋ณต์กํ๊ณ ์ ๊ตํด. ๋ช ๊ฐ์ง ํต์ฌ ๊ฐ๋ ์ ์์๋ณด์:
ํ์ด์ง ํ ๋น์ (Page Allocator)
์ปค๋์ ๋ฒ๋ ์์คํ (Buddy System)์ ์ฌ์ฉํด์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํด. 2์ ๊ฑฐ๋ญ์ ๊ณฑ ํฌ๊ธฐ๋ก ํ์ด์ง๋ฅผ ํ ๋นํ๊ณ ํด์ ํ์ง. ๐
/* ํ์ด์ง ํ ๋น */
struct page *page = alloc_pages(GFP_KERNEL, order);
/* ํ์ด์ง ํด์ */
__free_pages(page, order);
์ฌ๋ฉ ํ ๋น์ (Slab Allocator)์์ ๊ฐ์ฒด๋ค์ ํจ์จ์ ์ผ๋ก ํ ๋นํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ด์ผ. kmalloc์ด ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฑฐ์ง:
/* ์ฌ๋ฉ ์บ์ ์์ฑ */
struct kmem_cache *cache = kmem_cache_create("my_cache",
sizeof(struct my_struct), 0, SLAB_HWCACHE_ALIGN, NULL);
/* ๊ฐ์ฒด ํ ๋น */
struct my_struct *obj = kmem_cache_alloc(cache, GFP_KERNEL);
/* ๊ฐ์ฒด ํด์ */
kmem_cache_free(cache, obj);
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ (Virtual Memory)๊ฐ ํ๋ก์ธ์ค๋ ๋ ๋ฆฝ์ ์ธ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ๊ฐ์ ธ. ํ์ด์ง ํ ์ด๋ธ์ ํตํด ๊ฐ์ ์ฃผ์๋ฅผ ๋ฌผ๋ฆฌ ์ฃผ์๋ก ๋ณํํ์ง. ๐บ๏ธ
๋ฉ๋ชจ๋ฆฌ ์ฌํ๋ณด (Memory Reclaim)
๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ฉด ์ปค๋์ ํ์ด์ง ์บ์๋ฅผ ๋น์ฐ๊ฑฐ๋, ์ค์์ ์ฌ์ฉํ๊ฑฐ๋, OOM ํฌ๋ฌ๋ฅผ ๋ฐ๋์์ผ. โป๏ธ
โก ํ๋ก์ธ์ค ์ค์ผ์ค๋ง Linux์ ์ค์ผ์ค๋ฌ๋ ์ฌ๋ฌ ๋ฒ ์งํํด์์ด. ํ์ฌ๋ CFS(Completely Fair Scheduler)๊ฐ ๊ธฐ๋ณธ์ด์ผ.
CFS์ ํต์ฌ ์์ด๋์ด
๋ชจ๋ ํ๋ก์ธ์ค์๊ฒ ๊ณต์ ํ๊ฒ CPU ์๊ฐ์ ๋ถ๋ฐฐํ๋ ๊ฑฐ์ผ. ๊ฐ์ ๋ฐํ์(vruntime)์ด๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํด์, ๊ฐ์ฅ ์ ๊ฒ ์คํ๋ ํ๋ก์ธ์ค๋ฅผ ์ฐ์ ์คํํ์ง. โ๏ธ
์ค์ผ์ค๋ง ํด๋์ค
Linux๋ ์ฌ๋ฌ ์ค์ผ์ค๋ง ํด๋์ค๋ฅผ ์ง์ํด:
- SCHED_NORMAL: ์ผ๋ฐ ํ๋ก์ธ์ค
- SCHED_FIFO: ์ค์๊ฐ, ์ ์ ์์
- SCHED_RR: ์ค์๊ฐ, ๋ผ์ด๋ ๋ก๋น
- SCHED_BATCH: ๋ฐฐ์น ์์
- SCHED_IDLE: ์์ฃผ ๋ฎ์ ์ฐ์ ์์
๋ก๋ ๋ฐธ๋ฐ์ฑ
๋ฉํฐ์ฝ์ด ์์คํ ์์ CPU๋ค ๊ฐ์ ์์ ์ ๊ท ๋ฑํ๊ฒ ๋ถ๋ฐฐํ๋ ๊ฒ ์ค์ํด. ์ปค๋์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ํํ์ง. โ๏ธ
๐ ๋๊ธฐํ ํ๋ฆฌ๋ฏธํฐ๋ธ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๋ ค๋ฉด ์ ์ ํ ๋๊ธฐํ๊ฐ ํ์์ผ.
์คํ๋ฝ (Spinlock)
์งง์ ํฌ๋ฆฌํฐ์ปฌ ์น์ ์ ์ฌ์ฉํด. ๋ฝ์ ์ป์ ๋๊น์ง ๋ฐ์๊ฒ ๋๊ธฐ(busy-wait)ํ์ง:
spinlock_t my_lock;
spin_lock_init(&my_lock);
spin_lock(&my_lock);
/* ํฌ๋ฆฌํฐ์ปฌ ์น์
*/
spin_unlock(&my_lock);
์ธํฐ๋ฝํธ ์ปจํ
์คํธ์์๋ spin_lock_irqsave๋ฅผ ์ฌ์ฉํด์ผ ํด. ๐๋ฎคํ ์ค (Mutex)
๊ธด ํฌ๋ฆฌํฐ์ปฌ ์น์ ์ด๋ ์ฌ๋ฆฝ์ด ๊ฐ๋ฅํ ์ปจํ ์คํธ์์ ์ฌ์ฉํด:
struct mutex my_mutex;
mutex_init(&my_mutex);
mutex_lock(&my_mutex);
/* ํฌ๋ฆฌํฐ์ปฌ ์น์
- ์ฌ๋ฆฝ ๊ฐ๋ฅ */
mutex_unlock(&my_mutex);
์ธ๋งํฌ์ด (Semaphore)์นด์ดํ ์ธ๋งํฌ์ด๋ก, ์ฌ๋ฌ ๊ฐ์ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ ๋ ์ฌ์ฉํด:
struct semaphore my_sem;
sema_init(&my_sem, count);
down(&my_sem); /* P ์ฐ์ฐ */
/* ํฌ๋ฆฌํฐ์ปฌ ์น์
*/
up(&my_sem); /* V ์ฐ์ฐ */
RCU (Read-Copy-Update)์ฝ๊ธฐ๊ฐ ๋ง๊ณ ์ฐ๊ธฐ๊ฐ ์ ์ ๊ฒฝ์ฐ์ ์ต์ ํ๋ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ด์ผ. ์ฝ๊ธฐ๋ ๋ฝ ์์ด ์ํํ๊ณ , ์ฐ๊ธฐ๋ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด์ ์ ๋ฐ์ดํธํ์ง. ๐
/* ์ฝ๊ธฐ */
rcu_read_lock();
ptr = rcu_dereference(global_ptr);
/* ptr ์ฌ์ฉ */
rcu_read_unlock();
/* ์ฐ๊ธฐ */
new_ptr = kmalloc(...);
/* new_ptr ์ด๊ธฐํ */
rcu_assign_pointer(global_ptr, new_ptr);
synchronize_rcu();
kfree(old_ptr);
โ ๏ธ ๋ฝํน ์ฃผ์์ฌํญ
1. ๋ฐ๋๋ฝ ๋ฐฉ์ง: ํญ์ ๊ฐ์ ์์๋ก ๋ฝ์ ํ๋ํด.
2. ๋ฝ ํ๋ฉ ์๊ฐ ์ต์ํ: ํฌ๋ฆฌํฐ์ปฌ ์น์ ์ ๊ฐ๋ฅํ ์งง๊ฒ ์ ์งํด.
3. ์ธํฐ๋ฝํธ ์ปจํ ์คํธ: ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ์์๋ ์ฌ๋ฆฝํ ์ ์์ผ๋ ์คํ๋ฝ๋ง ์ฌ์ฉํด.
4. ๋ฝ ๊ฒ์ฆ: CONFIG_PROVE_LOCKING์ ์ผ์ ๋ฝ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํด.
๐ ๋คํธ์ํฌ ์คํ
Linux์ ๋คํธ์ํฌ ์คํ์ OSI 7๊ณ์ธต ๋ชจ๋ธ์ ๋ฐ๋ผ ๊ตฌํ๋์ด ์์ด.1. ๋ฐ๋๋ฝ ๋ฐฉ์ง: ํญ์ ๊ฐ์ ์์๋ก ๋ฝ์ ํ๋ํด.
2. ๋ฝ ํ๋ฉ ์๊ฐ ์ต์ํ: ํฌ๋ฆฌํฐ์ปฌ ์น์ ์ ๊ฐ๋ฅํ ์งง๊ฒ ์ ์งํด.
3. ์ธํฐ๋ฝํธ ์ปจํ ์คํธ: ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ์์๋ ์ฌ๋ฆฝํ ์ ์์ผ๋ ์คํ๋ฝ๋ง ์ฌ์ฉํด.
4. ๋ฝ ๊ฒ์ฆ: CONFIG_PROVE_LOCKING์ ์ผ์ ๋ฝ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํด.
์์ผ ๋ ์ด์ด
์ฌ์ฉ์ ๊ณต๊ฐ๊ณผ ์ปค๋ ๊ณต๊ฐ์ ์ธํฐํ์ด์ค์ผ. socket(), bind(), listen() ๊ฐ์ ์์คํ ์ฝ์ด ์ฌ๊ธฐ์ ์ฒ๋ฆฌ๋ผ. ๐
ํ๋กํ ์ฝ ๋ ์ด์ด
TCP, UDP, ICMP ๋ฑ์ ํ๋กํ ์ฝ์ด ๊ตฌํ๋์ด ์์ด. net/ipv4/์ net/ipv6/ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ณด๋ฉด ๋ผ. ๐ก
๋คํธ์ํฌ ๋๋ฐ์ด์ค ๋ ์ด์ด
์ค์ ๋คํธ์ํฌ ์นด๋์ ํต์ ํ๋ ๋๋ผ์ด๋ฒ๋ค์ด ์์ด. struct net_device๊ฐ ํต์ฌ ๊ตฌ์กฐ์ฒด์ผ. ๐ด
ํจํท ์ฒ๋ฆฌ ํ๋ฆ
1. ๋คํธ์ํฌ ์นด๋๊ฐ ํจํท์ ๋ฐ์ผ๋ฉด ์ธํฐ๋ฝํธ ๋ฐ์
2. ๋๋ผ์ด๋ฒ๊ฐ ํจํท์ sk_buff ๊ตฌ์กฐ์ฒด๋ก ๋ง๋ฆ
3. ํ๋กํ ์ฝ ์คํ์ ๊ฑฐ์ณ ์ฌ๋ผ๊ฐ
4. ์ต์ข ์ ์ผ๋ก ์์ผ ๋ฒํผ์ ๋์ฐฉ
5. ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ด recv()๋ก ์ฝ์
Netfilter์ iptables
ํจํท ํํฐ๋ง๊ณผ NAT๋ฅผ ๋ด๋นํ๋ ํ๋ ์์ํฌ์ผ. ๋ฐฉํ๋ฒฝ ๊ท์น์ด ์ฌ๊ธฐ์ ์ ์ฉ๋์ง. ๐ก๏ธ
๐ ๏ธ ๋๋ฒ๊น ๊ณผ ํธ๋ฌ๋ธ์ํ
์ปค๋ ๊ฐ๋ฐ์์ ๋๋ฒ๊น ์ ์ ๋ง ์ค์ํด. ์ผ๋ฐ ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ๊ณผ๋ ๋ค๋ฅธ ๊ธฐ๋ฒ๋ค์ด ํ์ํ๊ฑฐ๋ . ๐๐ printk์ ๋ก๊น ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋๋ฒ๊น ๋ฐฉ๋ฒ์ printk์ผ:
printk(KERN_DEBUG "Value of x: %d\n", x);
printk(KERN_INFO "Function called\n");
printk(KERN_WARNING "Something unusual happened\n");
printk(KERN_ERR "Error occurred: %d\n", err);
๋ก๊ทธ ๋ ๋ฒจ์ ๋ฐ๋ผ ๋ฉ์์ง์ ์ค์๋๋ฅผ ํ์ํ ์ ์์ด. dmesg ๋ช
๋ น์ด๋ก ์ปค๋ ๋ก๊ทธ๋ฅผ ๋ณผ ์ ์์ง. ๐๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ pr_debug, dev_dbg ๊ฐ์ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ๋ ๊ฑฐ์ผ:
pr_debug("Debug message\n");
dev_dbg(&pdev->dev, "Device-specific debug\n");
์ด ๋งคํฌ๋ก๋ค์ DEBUG๊ฐ ์ ์๋์ด ์์ ๋๋ง ์ถ๋ ฅ๋ผ. ๐๐ฌ ๋์ ๋๋ฒ๊น CONFIG_DYNAMIC_DEBUG๋ฅผ ์ผ๋ฉด ๋ฐํ์์ ๋๋ฒ๊ทธ ๋ฉ์์ง๋ฅผ ์ผ๊ณ ๋ ์ ์์ด:
# ํน์ ํ์ผ์ ๋๋ฒ๊ทธ ๋ฉ์์ง ํ์ฑํ
echo 'file drivers/usb/core/hub.c +p' > /sys/kernel/debug/dynamic_debug/control
# ํน์ ํจ์์ ๋๋ฒ๊ทธ ๋ฉ์์ง ํ์ฑํ
echo 'func usb_hub_init +p' > /sys/kernel/debug/dynamic_debug/control
์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ปดํ์ผ ์์ด ๋๋ฒ๊ทธ ๋ฉ์์ง๋ฅผ ์ ์ดํ ์ ์์ด. ์ ๋ง ํธ๋ฆฌํ์ง? ๐๏ธ๐ KGDB๋ก ์ปค๋ ๋๋ฒ๊น KGDB๋ ์ปค๋์ GDB๋ก ๋๋ฒ๊น ํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ์ผ. ๋ธ๋ ์ดํฌํฌ์ธํธ๋ฅผ ์ค์ ํ๊ณ , ๋ณ์๋ฅผ ๊ฒ์ฌํ๊ณ , ์คํ ํธ๋ ์ด์ค๋ฅผ ๋ณผ ์ ์์ด. ๐ง
์ค์ ๋ฐฉ๋ฒ:
1. ์ปค๋ ์ปดํ์ผ ์ CONFIG_KGDB=y ์ค์
2. ๋ถํธ ํ๋ผ๋ฏธํฐ์ kgdboc=ttyS0,115200 ์ถ๊ฐ
3. ํธ์คํธ ๋จธ์ ์์ GDB ์ฐ๊ฒฐ
# ํ๊ฒ ๋จธ์ ์์
echo g > /proc/sysrq-trigger
# ํธ์คํธ ๋จธ์ ์์
gdb vmlinux
(gdb) target remote /dev/ttyS0
(gdb) break sys_open
(gdb) continue
๐ ftrace์ perf
ftraceํจ์ ํธ์ถ์ ์ถ์ ํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ผ:
# ftrace ํ์ฑํ
cd /sys/kernel/debug/tracing
echo function > current_tracer
echo 1 > tracing_on
# ํน์ ํจ์๋ง ์ถ์
echo sys_open > set_ftrace_filter
# ๊ฒฐ๊ณผ ๋ณด๊ธฐ
cat trace
perf์ฑ๋ฅ ๋ถ์ ๋๊ตฌ์ผ. CPU ์ฌ์ฉ๋ฅ , ์บ์ ๋ฏธ์ค, ๋ธ๋์น ์์ธก ์คํจ ๋ฑ์ ์ธก์ ํ ์ ์์ด:
# ์์คํ
์ ์ฒด ํ๋กํ์ผ๋ง
perf record -a -g sleep 10
perf report
# ํน์ ์ด๋ฒคํธ ์นด์ดํ
perf stat -e cache-misses,cache-references ./my_program
๐ฅ ์ปค๋ ํจ๋ ๋ถ์
์ปค๋ ํจ๋์ด ๋ฐ์ํ๋ฉด oops ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ผ. ์ด๊ฑธ ๋ถ์ํ๋ ๋ฐฉ๋ฒ:1. ์คํ ํธ๋ ์ด์ค ์ฝ๊ธฐ
oops ๋ฉ์์ง์๋ ํจ์ ํธ์ถ ์คํ์ด ํฌํจ๋์ด ์์ด. ์ด๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ์ถ์ ํ ์ ์์ง. ๐
2. addr2line ์ฌ์ฉ
์ฃผ์๋ฅผ ์์ค ์ฝ๋ ์์น๋ก ๋ณํํด:
addr2line -e vmlinux -i 0xffffffff81234567
3. kdump ์ค์ ์ปค๋ ํฌ๋์ ๋คํ๋ฅผ ์๋์ผ๋ก ์ ์ฅํ๋๋ก ์ค์ ํ ์ ์์ด. ๋์ค์ ๋ถ์ํ๊ธฐ ํธํด. ๐พ
๐ก ๋๋ฒ๊น
ํ
1. ์ฌํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ: ๋ฒ๊ทธ๋ฅผ ์ผ๊ด๋๊ฒ ์ฌํํ ์ ์์ด์ผ ๋๋ฒ๊น ์ด ์ฌ์์ ธ.
2. ์ด๋ถ ํ์: ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์ปค๋ฐ์ git bisect๋ก ์ฐพ์๋ด.
3. ์ฝ๋ ๋ฆฌ๋ทฐ: ๋ค๋ฅธ ์ฌ๋์ ๋์ผ๋ก ๋ณด๋ฉด ๋์น ๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ ์ ์์ด.
4. ์ ์ ๋ถ์: sparse, coccinelle ๊ฐ์ ๋๊ตฌ๋ฅผ ํ์ฉํด.
5. ๋ฌธ์ํ: ๋๋ฒ๊น ๊ณผ์ ์ ๊ธฐ๋กํด๋๋ฉด ๋์ค์ ๋น์ทํ ๋ฌธ์ ๋ฅผ ๋ง๋ฌ์ ๋ ๋์์ด ๋ผ.
1. ์ฌํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ: ๋ฒ๊ทธ๋ฅผ ์ผ๊ด๋๊ฒ ์ฌํํ ์ ์์ด์ผ ๋๋ฒ๊น ์ด ์ฌ์์ ธ.
2. ์ด๋ถ ํ์: ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์ปค๋ฐ์ git bisect๋ก ์ฐพ์๋ด.
3. ์ฝ๋ ๋ฆฌ๋ทฐ: ๋ค๋ฅธ ์ฌ๋์ ๋์ผ๋ก ๋ณด๋ฉด ๋์น ๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ ์ ์์ด.
4. ์ ์ ๋ถ์: sparse, coccinelle ๊ฐ์ ๋๊ตฌ๋ฅผ ํ์ฉํด.
5. ๋ฌธ์ํ: ๋๋ฒ๊น ๊ณผ์ ์ ๊ธฐ๋กํด๋๋ฉด ๋์ค์ ๋น์ทํ ๋ฌธ์ ๋ฅผ ๋ง๋ฌ์ ๋ ๋์์ด ๋ผ.
๐ ์ฑ๊ณต์ ์ธ ๊ธฐ์ฌ์๊ฐ ๋๋ ๋ฒ
๊ธฐ์ ์ ๋ฅ๋ ฅ๋ ์ค์ํ์ง๋ง, ์ข์ ๊ธฐ์ฌ์๊ฐ ๋๋ ค๋ฉด ๋ค๋ฅธ ์์๋ค๋ ํ์ํด. ๐ฏ๐ ์ง์์ ์ธ ํ์ต ์ปค๋์ ๊ณ์ ์งํํ๊ณ ์์ด. ์๋ก์ด ๊ธฐ๋ฅ, ์๋ก์ด ํ๋์จ์ด, ์๋ก์ด ์ต์ ํ ๊ธฐ๋ฒ๋ค์ด ๋์์์ด ์ถ๊ฐ๋์ง. ๋ฐ๋ผ์ก์ผ๋ ค๋ฉด ๊ณ์ ๊ณต๋ถํด์ผ ํด. ๐
์ถ์ฒ ํ์ต ์๋ฃ:
- Linux Kernel Development by Robert Love
- Understanding the Linux Kernel by Daniel P. Bovet
- Linux Device Drivers by Jonathan Corbet
- The Linux Programming Interface by Michael Kerrisk
์จ๋ผ์ธ ๊ฐ์๋ ์ปจํผ๋ฐ์ค ๋ฐํ ์์๋ ์ข์ ์๋ฃ์ผ. Linux Plumbers Conference, Kernel Recipes ๊ฐ์ ํ์ฌ์ ๋ฐํ๋ค์ ์ฐพ์๋ด. ๐ฅ
๐ค ๋ฉํ ์ฐพ๊ธฐ ๊ฒฝํ ๋ง์ ๊ฐ๋ฐ์์ ๊ฐ์ด๋๋ฅผ ๋ฐ์ผ๋ฉด ์ฑ์ฅ ์๋๊ฐ ํจ์ฌ ๋นจ๋ผ์ ธ. ๋ฉ์ผ๋ง ๋ฆฌ์คํธ์์ ํ๋ฐํ๊ฒ ํ๋ํ๋ ๊ฐ๋ฐ์๋ค์๊ฒ ์ง๋ฌธํ๊ฑฐ๋, ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์ ๋ฉํ ๋ฅผ ์ฐพ์๋ณผ ์๋ ์์ด. ๐จโ๐ซ
์ข์ ๋ฉํ ๋:
- ๋ค ์ง๋ฌธ์ ์ธ๋ด์ฌ ์๊ฒ ๋ตํด์ค
- ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํตํด ๊ฐ์ ์ ์ ์๋ ค์ค
- ์ปค๋ฎค๋ํฐ ๋ฌธํ๋ฅผ ์ดํดํ๋๋ก ๋์์ค
- ์ ์ ํ ํ๋ก์ ํธ๋ฅผ ์ถ์ฒํด์ค
๐ช ์ธ๋ด์ฌ๊ณผ ๋๊ธฐ ์ฒซ ํจ์น๊ฐ ๋ฐ์๋ค์ฌ์ง๊ธฐ๊น์ง ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ด. ๊ฑฐ์ ๋นํ๊ฑฐ๋ ์ฌ๋ฌ ๋ฒ ์์ ์ ์๊ตฌ๋ฐ์ ์๋ ์์ง. ํ์ง๋ง ํฌ๊ธฐํ์ง ๋ง! ๐ฅ
๋ง์ ์ฑ๊ณต์ ์ธ ์ปค๋ ๊ฐ๋ฐ์๋ค๋ ์ฒ์์ ๊ฑฐ์ ์ ๊ฒฝํํ์ด. Linus Torvalds์กฐ์ฐจ๋ ์ด๊ธฐ์๋ ์ค์๋ฅผ ๋ง์ด ํ๋ค๊ณ ํด. ์ค์ํ ๊ฑด ํผ๋๋ฐฑ์ ๋ฐ์๋ค์ด๊ณ ๊ณ์ ๊ฐ์ ํ๋ ๊ฑฐ์ผ. ๐ฑ
๐ ์ปค๋ฎค๋ํฐ์ ๊ธฐ์ฌํ๊ธฐ ์ฝ๋ ์์ฑ๋ง์ด ๊ธฐ์ฌ๊ฐ ์๋์ผ. ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ค๋ ์์ด:
1. ์ฝ๋ ๋ฆฌ๋ทฐ
๋ค๋ฅธ ์ฌ๋์ ํจ์น๋ฅผ ๋ฆฌ๋ทฐํ๊ณ ํผ๋๋ฐฑ์ ์ค. ์ด ๊ณผ์ ์์ ๋๋ ๋ง์ด ๋ฐฐ์ธ ์ ์์ด. ๐
2. ๋ฒ๊ทธ ๋ฆฌํฌํธ
๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ์์ธํ๊ฒ ๋ฆฌํฌํธํด. ์ฌํ ๋ฐฉ๋ฒ, ํ๊ฒฝ ์ ๋ณด, ๋ก๊ทธ ๋ฑ์ ํฌํจํ๋ฉด ์ข์. ๐
3. ํ ์คํ
์๋ก์ด ๊ธฐ๋ฅ์ด๋ ํจ์น๋ฅผ ํ ์คํธํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๊ณต์ ํด. ํนํ ๋ค์ํ ํ๋์จ์ด์์์ ํ ์คํธ๋ ๋งค์ฐ ๊ฐ์น ์์ด. ๐งช
4. ๋ฌธ์ํ
์ฝ๋ ์ฃผ์, ์ปค๋ฐ ๋ฉ์์ง, ๋ฌธ์ ํ์ผ ๋ฑ์ ๊ฐ์ ํด. ์ข์ ๋ฌธ์๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์๊ฒ ํฐ ๋์์ด ๋ผ. ๐
5. ์ง๋ฌธ์ ๋ตํ๊ธฐ
์ด๋ณด์๋ค์ ์ง๋ฌธ์ ๋ตํด์ฃผ๋ฉด์ ์ปค๋ฎค๋ํฐ์ ๊ธฐ์ฌํ ์ ์์ด. ๊ฐ๋ฅด์น๋ฉด์ ๋๋ ๋ ๊น์ด ์ดํดํ๊ฒ ๋์ง. ๐ฌ
๐ ์ฌ๋ฅ๋ท์์ ๊ฒฝํ ๊ณต์ ํ๊ธฐ
๋ค๊ฐ ์ปค๋ ๊ฐ๋ฐ์ ํ๋ฉด์ ์์ ๊ฒฝํ๊ณผ ์ง์์ ์ ๋ง ๊ท์คํด. ์ด๊ฑธ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๋๋๊ณ ์ถ๋ค๋ฉด ์ฌ๋ฅ๋ท์ ํ์ฉํด๋ด!
์ฌ๋ฅ๋ท์์๋ C์ธ์ด ํ๋ก๊ทธ๋๋ฐ, ์ปค๋ ๊ฐ๋ฐ, ์คํ์์ค ๊ธฐ์ฌ ๋ฑ์ ์ฌ๋ฅ์ ๊ณต์ ํ ์ ์์ด. ์ด๋ณด์๋ค์๊ฒ ๋ฉํ ๋ง์ ์ ๊ณตํ๊ฑฐ๋, ์ฝ๋ ๋ฆฌ๋ทฐ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ฑฐ๋, ํ๋ก์ ํธ ํ์ ์ ํ ์๋ ์์ง.
๋ฐ๋๋ก ๋ค๊ฐ ํน์ ๋ถ์ผ์์ ๋์์ด ํ์ํ๋ค๋ฉด, ๊ทธ ๋ถ์ผ์ ์ ๋ฌธ๊ฐ๋ฅผ ์ฐพ์์ ๋ฐฐ์ธ ์๋ ์์ด. ์๋ก ๋ฐฐ์ฐ๊ณ ๊ฐ๋ฅด์น๋ฉด์ ํจ๊ป ์ฑ์ฅํ๋ ๊ฑฐ์ผ! ๐
๋ค๊ฐ ์ปค๋ ๊ฐ๋ฐ์ ํ๋ฉด์ ์์ ๊ฒฝํ๊ณผ ์ง์์ ์ ๋ง ๊ท์คํด. ์ด๊ฑธ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๋๋๊ณ ์ถ๋ค๋ฉด ์ฌ๋ฅ๋ท์ ํ์ฉํด๋ด!
์ฌ๋ฅ๋ท์์๋ C์ธ์ด ํ๋ก๊ทธ๋๋ฐ, ์ปค๋ ๊ฐ๋ฐ, ์คํ์์ค ๊ธฐ์ฌ ๋ฑ์ ์ฌ๋ฅ์ ๊ณต์ ํ ์ ์์ด. ์ด๋ณด์๋ค์๊ฒ ๋ฉํ ๋ง์ ์ ๊ณตํ๊ฑฐ๋, ์ฝ๋ ๋ฆฌ๋ทฐ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ฑฐ๋, ํ๋ก์ ํธ ํ์ ์ ํ ์๋ ์์ง.
๋ฐ๋๋ก ๋ค๊ฐ ํน์ ๋ถ์ผ์์ ๋์์ด ํ์ํ๋ค๋ฉด, ๊ทธ ๋ถ์ผ์ ์ ๋ฌธ๊ฐ๋ฅผ ์ฐพ์์ ๋ฐฐ์ธ ์๋ ์์ด. ์๋ก ๋ฐฐ์ฐ๊ณ ๊ฐ๋ฅด์น๋ฉด์ ํจ๊ป ์ฑ์ฅํ๋ ๊ฑฐ์ผ! ๐
๐ ๋ฏธ๋์ ์ปค๋ ๊ฐ๋ฐ
Linux ์ปค๋์ ์์ผ๋ก ์ด๋ป๊ฒ ๋ฐ์ ํ ๊น? ๋ช ๊ฐ์ง ํธ๋ ๋๋ฅผ ์ดํด๋ณด์. ๐ฎ๐ฆ Rust in Linux 2022๋ ๋ถํฐ Linux ์ปค๋์ Rust ์ธ์ด ์ง์์ด ์ถ๊ฐ๋๊ธฐ ์์ํ์ด. C์ธ์ด์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์๋์ง. ๐ฆ
Rust๋ ์ปดํ์ผ ํ์์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ์ ๋ณด์ฅํด. ๋ฒํผ ์ค๋ฒํ๋ก์ฐ, use-after-free ๊ฐ์ ๋ฒ๊ทธ๋ฅผ ์์ฒ์ ์ผ๋ก ๋ฐฉ์งํ ์ ์์ด. ํ์ง๋ง C ์ฝ๋์์ ์ํธ์ด์ฉ์ฑ, ํ์ต ๊ณก์ ๋ฑ์ ๊ณผ์ ๊ฐ ์์ง. ๐
์์ง์ ์ด๊ธฐ ๋จ๊ณ์ง๋ง, ์์ผ๋ก ์ ์ ๋ ๋ง์ ๋๋ผ์ด๋ฒ์ ์๋ธ์์คํ ์ด Rust๋ก ์์ฑ๋ ๊ฐ๋ฅ์ฑ์ด ์์ด. C์ธ์ด ๊ฐ๋ฐ์๋ผ๋ฉด Rust๋ ๋ฐฐ์๋๋ฉด ์ข์ ๊ฑฐ์ผ! ๐
โ๏ธ ํด๋ผ์ฐ๋์ ์ปจํ ์ด๋ ํด๋ผ์ฐ๋ ํ๊ฒฝ๊ณผ ์ปจํ ์ด๋ ๊ธฐ์ ์ ๋ฐ์ ์ผ๋ก ์ปค๋๋ ๋ณํํ๊ณ ์์ด:
cgroups v2
์ปจํ ์ด๋์ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ์ํ ๊ธฐ๋ฅ์ด ๊ณ์ ๊ฐ์ ๋๊ณ ์์ด. ๐ฆ
eBPF
์ปค๋ ๋ด๋ถ์์ ์์ ํ๊ฒ ํ๋ก๊ทธ๋จ์ ์คํํ ์ ์๋ ๊ธฐ์ ์ด์ผ. ๋คํธ์ํน, ๋ณด์, ๋ชจ๋ํฐ๋ง ๋ฑ ๋ค์ํ ๋ถ์ผ์์ ํ์ฉ๋๊ณ ์์ง. ๐ฌ
io_uring
๋น๋๊ธฐ I/O๋ฅผ ์ํ ์๋ก์ด ์ธํฐํ์ด์ค์ผ. ๊ธฐ์กด์ select, epoll๋ณด๋ค ํจ์ฌ ํจ์จ์ ์ด์ง. โก
๐ค AI์ ๋จธ์ ๋ฌ๋ AI ์ํฌ๋ก๋๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ปค๋ ์ต์ ํ๋ ์งํ๋๊ณ ์์ด:
- GPU ์ค์ผ์ค๋ง ๊ฐ์
- ๋์ฉ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
- NUMA ์ต์ ํ
- ์ ๋ ฅ ๊ด๋ฆฌ ๊ฐ์
๐ ๋ณด์ ๊ฐํ ๋ณด์์ ํญ์ ์ค์ํ ์ฃผ์ ์ผ. ์์ผ๋ก๋ ๊ณ์ ๊ฐํ๋ ๊ฑฐ์ผ:
Kernel Lockdown
์ปค๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ์ง์ ์ ๊ทผ์ ์ ํํด์ ๋ณด์์ ๊ฐํํ๋ ๊ธฐ๋ฅ์ด์ผ. ๐
Spectre/Meltdown ๋์
CPU ์ทจ์ฝ์ ์ ๋ํ ์ํ ๊ธฐ๋ฒ๋ค์ด ๊ณ์ ์ถ๊ฐ๋๊ณ ์์ด. ๐ก๏ธ
Confidential Computing
ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ๋ฐ์ดํฐ๋ฅผ ์ํธํ๋ ์ํ๋ก ์ฒ๋ฆฌํ๋ ๊ธฐ์ ์ด ๋ฐ์ ํ๊ณ ์์ด. ๐
๐ฏ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์, ์ ๋ง ๊ธด ์ฌ์ ์ด์์ง? ๐ C์ธ์ด๋ก ์คํ์์ค์ ๊ธฐ์ฌํ๋ ๊ฒ, ํนํ GNU ํ๋ก์ ํธ์ Linux ์ปค๋ ๊ฐ๋ฐ์ ์ฐธ์ฌํ๋ ๊ฑด ์ฝ์ง ์์ ์ผ์ด์ผ. ํ์ง๋ง ๊ทธ๋งํผ ๋ณด๋ ์๊ณ ๊ฐ์น ์๋ ์ผ์ด๊ธฐ๋ ํ์ง. โจ๐ ํต์ฌ ์์ฝ ์ฐ๋ฆฌ๊ฐ ๋ค๋ฃฌ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณผ๊น:
1. ์คํ์์ค์ ๊ฐ์น
GNU ํ๋ก์ ํธ์ Linux๋ ์์ ์ํํธ์จ์ด ์ด๋์ ๊ฒฐ์ค์ด์ผ. ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ ํ์ ์ผ๋ก ๋ง๋ค์ด์ง ๊ฑฐ๋ํ ์ํ๊ณ์ง. ๐
2. ์์ํ๋ ๋ฐฉ๋ฒ
๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ถ, ์ฝ๋ ์ฝ๊ธฐ, ๊ฐ๋จํ ํจ์น๋ถํฐ ์์ํด. ์ฒ์์ staging ๋๋ผ์ด๋ฒ๋ ๋ฌธ์ํ ๊ฐ์ ๊ฐ์ ์ฌ์ด ๊ฒ๋ถํฐ ๋์ ํด๋ด. ๐ฑ
3. ์ปค๋ฎค๋ํฐ ์ฐธ์ฌ
๋ฉ์ผ๋ง ๋ฆฌ์คํธ ์ํฐ์ผ์ ์งํค๊ณ , ํผ๋๋ฐฑ์ ๊ฒธํํ๊ฒ ๋ฐ์๋ค์ฌ. ์ธ๋ด์ฌ์ ๊ฐ์ง๊ณ ๊พธ์คํ ์ฐธ์ฌํ๋ ๊ฒ ์ค์ํด. ๐ค
4. ๊ธฐ์ ์ ๊น์ด
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ, ํ๋ก์ธ์ค ์ค์ผ์ค๋ง, ๋๊ธฐํ, ๋คํธ์ํน ๋ฑ ์ปค๋์ ํต์ฌ ๊ฐ๋ ๋ค์ ์ดํดํด์ผ ํด. ๋๋ฒ๊น ๊ธฐ์ ๋ ํ์์ผ. ๐ฌ
5. ์ง์์ ์ฑ์ฅ
๊ณ์ ๋ฐฐ์ฐ๊ณ , ๋ฉํ ๋ฅผ ์ฐพ๊ณ , ์ปค๋ฎค๋ํฐ์ ๊ธฐ์ฌํ๋ฉด์ ์ฑ์ฅํด. ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์ ํ์ฉํด์ ๋ฐฐ์ฐ๊ณ ๊ฐ๋ฅด์น๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์ผ. ๐
๐ญ ๋ง์ง๋ง ์กฐ์ธ ์ปค๋ ๊ฐ๋ฐ์ ๋ง๋ผํค์ด์ง ์คํ๋ฆฐํธ๊ฐ ์๋์ผ. ๋จ๊ธฐ๊ฐ์ ๋ง์คํฐํ ์ ์๋ ๊ฒ ์๋๋ผ, ๋ช ๋ ์ ๊ฑธ์ณ ์ฒ์ฒํ ์ค๋ ฅ์ ์์๊ฐ๋ ๊ฑฐ์ง. ๐
์ค์๋ฅผ ๋๋ ค์ํ์ง ๋ง. ๋ชจ๋ ์ ๋ฌธ๊ฐ๋ ์ฒ์์ ์ด๋ณด์์์ด. ์ค์ํ ๊ฑด ์ค์์์ ๋ฐฐ์ฐ๊ณ ๊ณ์ ์์ผ๋ก ๋์๊ฐ๋ ๊ฑฐ์ผ. ๐ช
๊ทธ๋ฆฌ๊ณ ํผ์ ํ๋ ค๊ณ ํ์ง ๋ง. ์ปค๋ฎค๋ํฐ์ ๋์์ ๋ฐ๊ณ , ๋ค๋ฅธ ์ฌ๋๋ค์ ๋์์ฃผ๋ฉด์ ํจ๊ป ์ฑ์ฅํด. ์คํ์์ค์ ์ง์ ํ ๊ฐ์น๋ ๋ฐ๋ก ์ด๋ฐ ํ์ ๊ณผ ๊ณต์ ์ ๋ฌธํ์ ์๊ฑฐ๋ . ๐
๐ โจ ๐ป
๋น์ ์ ์ฒซ ์ปค๋ฐ์ ๊ธฐ๋ค๋ฆฝ๋๋ค!
์์ ์์์ด ํฐ ๋ณํ๋ฅผ ๋ง๋ญ๋๋ค.
์ค๋ ๋น์ ์ด ์์ฑํ ์ฝ๋๊ฐ
๋ด์ผ ์ธ์์ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
์ค๋ ๋น์ ์ด ์์ฑํ ์ฝ๋๊ฐ
๋ด์ผ ์ธ์์ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
Happy hacking! ๐ง ๐ง ๐
์ด ๊ธ์ด ๋์์ด ๋์๋ค๋ฉด, ์ฌ๋ฅ๋ท์์ ๋ ๋ง์ ์ง์๊ณผ ๊ฒฝํ์ ๋๋ ๋ณด์ธ์.
C์ธ์ด, ์ปค๋ ๊ฐ๋ฐ, ์คํ์์ค ๊ธฐ์ฌ ๋ฑ ๋ค์ํ ๋ถ์ผ์ ์ ๋ฌธ๊ฐ๋ค๊ณผ ํจ๊ปํ ์ ์์ต๋๋ค.
๐ ํจ๊ป ๋ฐฐ์ฐ๊ณ , ํจ๊ป ์ฑ์ฅํ๋ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ๐
C์ธ์ด, ์ปค๋ ๊ฐ๋ฐ, ์คํ์์ค ๊ธฐ์ฌ ๋ฑ ๋ค์ํ ๋ถ์ผ์ ์ ๋ฌธ๊ฐ๋ค๊ณผ ํจ๊ปํ ์ ์์ต๋๋ค.
๐ ํจ๊ป ๋ฐฐ์ฐ๊ณ , ํจ๊ป ์ฑ์ฅํ๋ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ๐
๊ด๋ จ ํค์๋
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.

๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.