์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ C์–ธ์–ด๋กœ ์„ธ์ƒ์„ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•

๐Ÿš€ C์–ธ์–ด๋กœ ์„ธ์ƒ์„ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•

์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ๋ถ€ํ„ฐ Linux ์ปค๋„ ๊ฐœ๋ฐœ๊นŒ์ง€
GNU ํ”„๋กœ์ ํŠธ์™€ ํ•จ๊ป˜ํ•˜๋Š” ๊ฐœ๋ฐœ์ž์˜ ์—ฌ์ •

๐ŸŒŸ ์˜คํ”ˆ์†Œ์Šค์˜ ์„ธ๊ณ„๋กœ ์ดˆ๋Œ€ํ•ฉ๋‹ˆ๋‹ค

์•ˆ๋…•! ํ˜น์‹œ ๋„ˆ๋„ ๋งค์ผ ์‚ฌ์šฉํ•˜๋Š” Linux๋‚˜ GNU ๋„๊ตฌ๋“ค์ด ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€ ๊ถ๊ธˆํ–ˆ๋˜ ์  ์žˆ์–ด? ๐Ÿค” ๊ทธ๋ฆฌ๊ณ  "๋‚˜๋„ ์ €๋Ÿฐ ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์„๊นŒ?"๋ผ๋Š” ์ƒ๊ฐ ํ•ด๋ณธ ์  ์žˆ์ง€?

์˜ค๋Š˜์€ ๊ทธ ๊ถ๊ธˆ์ฆ์„ ์† ์‹œ์›ํ•˜๊ฒŒ ํ’€์–ด์ค„๊ฒŒ. C์–ธ์–ด๋กœ ์˜คํ”ˆ์†Œ์Šค์— ๊ธฐ์—ฌํ•˜๋Š” ๋ฐฉ๋ฒ•, ํŠนํžˆ GNU ํ”„๋กœ์ ํŠธ์™€ Linux ์ปค๋„ ๊ฐœ๋ฐœ์— ์ฐธ์—ฌํ•˜๋Š” ์‹ค์ „ ๋…ธํ•˜์šฐ๋ฅผ ์นœ๊ตฌ์ฒ˜๋Ÿผ ํŽธํ•˜๊ฒŒ ์•Œ๋ ค์ค„ ๊ฑฐ์•ผ. ๐Ÿ’ช

์‚ฌ์‹ค ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ๋ผ๋Š” ๊ฒŒ ์ฒ˜์Œ์—” ์—„์ฒญ ์–ด๋ ต๊ณ  ๋ฉ€๊ฒŒ๋งŒ ๋А๊ปด์ง€์ž–์•„? ๋‚˜๋„ ์ฒ˜์Œ์—” ๊ทธ๋žฌ์–ด. ํ•˜์ง€๋งŒ ๋ง‰์ƒ ์‹œ์ž‘ํ•ด๋ณด๋ฉด ์ƒ๊ฐ๋ณด๋‹ค ํ›จ์”ฌ ์žฌ๋ฏธ์žˆ๊ณ , ์ „ ์„ธ๊ณ„ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ํ˜‘์—…ํ•˜๋ฉด์„œ ์„ฑ์žฅํ•˜๋Š” ๊ฒฝํ—˜์€ ์ •๋ง ๊ฐ’์ง„ ๊ฑฐ๋”๋ผ๊ณ . โœจ
Open Source GNU Linux C Contributor ๐Ÿ‘จโ€๐Ÿ’ป Community ๐ŸŒ Collaboration Makes Everything Possible

๐ŸŽฏ ์™œ 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์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋””๋ฐ”์ด์Šค์—์„œ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋Š”์ง€ ์ƒ์ƒ์ด ๊ฐ€์ง€? ๐ŸŒ
๐Ÿš€ ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ๊ฐ€ ์ฃผ๋Š” ๊ฒƒ๋“ค ์˜คํ”ˆ์†Œ์Šค์— ๊ธฐ์—ฌํ•œ๋‹ค๋Š” ๊ฑด ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ ์ด์ƒ์˜ ์˜๋ฏธ๊ฐ€ ์žˆ์–ด:

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 ํ”„๋กœ์ ํŠธ๋Š” ์šด์˜์ฒด์ œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ˆ˜๋งŽ์€ ๋„๊ตฌ๋“ค์„ ๋งŒ๋“ค์–ด๋ƒˆ์–ด. ๋„ˆ๋„ ๋ถ„๋ช… ์ด ์ค‘ ๋ช‡ ๊ฐœ๋Š” ์‚ฌ์šฉํ•ด๋ดค์„ ๊ฑฐ์•ผ:

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 ํ”„๋กœ์ ํŠธ๋Š” ์—ฌ์ „ํžˆ ํ™œ๋ฐœํ•˜๊ฒŒ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ๊ณ , ์ƒˆ๋กœ์šด ๊ธฐ์—ฌ์ž๋ฅผ ํ™˜์˜ํ•ด. ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค„๊ฒŒ:

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 ๋ณธ์ธ๋„ ์ด๊ฒŒ ์ด๋ ‡๊ฒŒ ์ปค์งˆ ์ค„์€ ๋ชฐ๋ž๋‹ค๋Š” ๊ฑฐ์•ผ. ๐Ÿ˜… ์ฒ˜์Œ์—” ์ •๋ง ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋กœ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ, ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ณต๊ฐœํ•˜์ž ์ „ ์„ธ๊ณ„ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ๊ธฐ์—ฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์ง€.

์ดˆ๊ธฐ ๋ฒ„์ „ 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 ์ปค๋„ ๊ฐœ๋ฐœ์˜ ๊ทœ๋ชจ๊ฐ€ ์–ผ๋งˆ๋‚˜ ํฐ์ง€ ์ˆซ์ž๋กœ ๋ณด๋ฉด ๋” ์‹ค๊ฐ๋‚˜:

๊ธฐ์—ฌ์ž ์ˆ˜
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๋งŒ ์ค„์„ ๋‹ค ์ฝ์„ ์ˆœ ์—†์ž–์•„? ํšจ์œจ์ ์œผ๋กœ ์ฝ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค„๊ฒŒ. ๐Ÿ“–

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 Kernel Contribution Workflow 1. Find Issue ๐Ÿ” 2. Write Code ๐Ÿ’ป 3. Test ๐Ÿงช 4. Create Patch ๐Ÿ“ 5. Send Email ๐Ÿ“ง 6. Code Review ๐Ÿ‘€ 7. Revise ๐Ÿ”„ 8. Merged! ๐ŸŽ‰ if changes needed Patience and persistence are key to success! ๐Ÿ’ช ๐Ÿš€ โœจ

๐Ÿ“– ์ปค๋„ ์ฝ”๋”ฉ ์Šคํƒ€์ผ๊ณผ ๊ทœ์น™

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์€ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์„ ์ž๋™์œผ๋กœ ์ฒดํฌํ•ด์ฃผ๋Š” ์Šคํฌ๋ฆฝํŠธ์•ผ. ํŒจ์น˜๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ์‹คํ–‰ํ•ด๋ด:

./scripts/checkpatch.pl --strict --file your_file.c

--strict ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์—„๊ฒฉํ•˜๊ฒŒ ์ฒดํฌํ•ด. ๋ชจ๋“  ๊ฒฝ๊ณ ๋ฅผ ๋‹ค ๊ณ ์น  ํ•„์š”๋Š” ์—†์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์€ ๊ณ ์น˜๋Š” ๊ฒŒ ์ข‹์•„.
๐Ÿšซ ํ”ผํ•ด์•ผ ํ•  ๊ฒƒ๋“ค 1. ๋ถˆํ•„์š”ํ•œ typedef
๊ตฌ์กฐ์ฒด์— 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. ํŒจ์น˜ ๋ฒ„์ „ ๊ด€๋ฆฌ
ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•„์„œ ์ˆ˜์ •ํ•˜๋ฉด 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. ์ธ๋‚ด์‹ฌ ๊ฐ€์ง€๊ธฐ
๋ฆฌ๋ทฐ์–ด๋“ค์€ ๋ฐ”์œ ์‚ฌ๋žŒ๋“ค์ด์•ผ. ๋‹ต์žฅ์ด ๋ฉฐ์น  ๋˜๋Š” ๋ช‡ ์ฃผ ๊ฑธ๋ฆด ์ˆ˜๋„ ์žˆ์–ด. ์กฐ๊ธ‰ํ•ดํ•˜์ง€ ๋ง๊ณ  ๊ธฐ๋‹ค๋ ค. 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. ๋‚œ์ด๋„ ์กฐ์ ˆ: ๋„ˆ๋ฌด ์–ด๋ ค์šด ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์ง€ ๋งˆ. ์ž‘์€ ์„ฑ๊ณต์„ ์Œ“์•„๊ฐ€๋Š” ๊ฒŒ ์ค‘์š”ํ•ด!
๐Ÿ’ผ ์žฌ๋Šฅ๋„ท์—์„œ ๋ฐฐ์šฐ๊ณ  ๋‚˜๋ˆ„๊ธฐ ํ˜น์‹œ ์ปค๋„ ๊ฐœ๋ฐœ์„ ๋ฐฐ์šฐ๋ฉด์„œ ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๊ฑฐ๋‚˜, ๋ฐ˜๋Œ€๋กœ ๋„ค๊ฐ€ ๋ฐฐ์šด ๊ฑธ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๊ณต์œ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? ์žฌ๋Šฅ๋„ท์„ ํ™œ์šฉํ•ด๋ด! ๐ŸŒŸ

์žฌ๋Šฅ๋„ท(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๊ณ„์ธต ๋ชจ๋ธ์„ ๋”ฐ๋ผ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด.

์†Œ์ผ“ ๋ ˆ์ด์–ด
์‚ฌ์šฉ์ž ๊ณต๊ฐ„๊ณผ ์ปค๋„ ๊ณต๊ฐ„์˜ ์ธํ„ฐํŽ˜์ด์Šค์•ผ. 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. ๋ฌธ์„œํ™”: ๋””๋ฒ„๊น… ๊ณผ์ •์„ ๊ธฐ๋กํ•ด๋‘๋ฉด ๋‚˜์ค‘์— ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ ๋„์›€์ด ๋ผ.

๐ŸŒŸ ์„ฑ๊ณต์ ์ธ ๊ธฐ์—ฌ์ž๊ฐ€ ๋˜๋Š” ๋ฒ•

๊ธฐ์ˆ ์  ๋Šฅ๋ ฅ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, ์ข‹์€ ๊ธฐ์—ฌ์ž๊ฐ€ ๋˜๋ ค๋ฉด ๋‹ค๋ฅธ ์š”์†Œ๋“ค๋„ ํ•„์š”ํ•ด. ๐ŸŽฏ

๐Ÿ“– ์ง€์†์ ์ธ ํ•™์Šต ์ปค๋„์€ ๊ณ„์† ์ง„ํ™”ํ•˜๊ณ  ์žˆ์–ด. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ, ์ƒˆ๋กœ์šด ํ•˜๋“œ์›จ์–ด, ์ƒˆ๋กœ์šด ์ตœ์ ํ™” ๊ธฐ๋ฒ•๋“ค์ด ๋Š์ž„์—†์ด ์ถ”๊ฐ€๋˜์ง€. ๋”ฐ๋ผ์žก์œผ๋ ค๋ฉด ๊ณ„์† ๊ณต๋ถ€ํ•ด์•ผ ํ•ด. ๐Ÿ“š

์ถ”์ฒœ ํ•™์Šต ์ž๋ฃŒ:
- 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์–ธ์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์ปค๋„ ๊ฐœ๋ฐœ, ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ ๋“ฑ์˜ ์žฌ๋Šฅ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์–ด. ์ดˆ๋ณด์ž๋“ค์—๊ฒŒ ๋ฉ˜ํ† ๋ง์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜, ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜, ํ”„๋กœ์ ํŠธ ํ˜‘์—…์„ ํ•  ์ˆ˜๋„ ์žˆ์ง€.

๋ฐ˜๋Œ€๋กœ ๋„ค๊ฐ€ ํŠน์ • ๋ถ„์•ผ์—์„œ ๋„์›€์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, ๊ทธ ๋ถ„์•ผ์˜ ์ „๋ฌธ๊ฐ€๋ฅผ ์ฐพ์•„์„œ ๋ฐฐ์šธ ์ˆ˜๋„ ์žˆ์–ด. ์„œ๋กœ ๋ฐฐ์šฐ๊ณ  ๊ฐ€๋ฅด์น˜๋ฉด์„œ ํ•จ๊ป˜ ์„ฑ์žฅํ•˜๋Š” ๊ฑฐ์•ผ! ๐ŸŒŸ

๐Ÿš€ ๋ฏธ๋ž˜์˜ ์ปค๋„ ๊ฐœ๋ฐœ

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. ์ง€์†์  ์„ฑ์žฅ
๊ณ„์† ๋ฐฐ์šฐ๊ณ , ๋ฉ˜ํ† ๋ฅผ ์ฐพ๊ณ , ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ธฐ์—ฌํ•˜๋ฉด์„œ ์„ฑ์žฅํ•ด. ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์„ ํ™œ์šฉํ•ด์„œ ๋ฐฐ์šฐ๊ณ  ๊ฐ€๋ฅด์น˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ. ๐Ÿ“š

๐Ÿ’ญ ๋งˆ์ง€๋ง‰ ์กฐ์–ธ ์ปค๋„ ๊ฐœ๋ฐœ์€ ๋งˆ๋ผํ†ค์ด์ง€ ์Šคํ”„๋ฆฐํŠธ๊ฐ€ ์•„๋‹ˆ์•ผ. ๋‹จ๊ธฐ๊ฐ„์— ๋งˆ์Šคํ„ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ช‡ ๋…„์— ๊ฑธ์ณ ์ฒœ์ฒœํžˆ ์‹ค๋ ฅ์„ ์Œ“์•„๊ฐ€๋Š” ๊ฑฐ์ง€. ๐Ÿƒ

์‹ค์ˆ˜๋ฅผ ๋‘๋ ค์›Œํ•˜์ง€ ๋งˆ. ๋ชจ๋“  ์ „๋ฌธ๊ฐ€๋„ ์ฒ˜์Œ์—” ์ดˆ๋ณด์ž์˜€์–ด. ์ค‘์š”ํ•œ ๊ฑด ์‹ค์ˆ˜์—์„œ ๋ฐฐ์šฐ๊ณ  ๊ณ„์† ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๊ฑฐ์•ผ. ๐Ÿ’ช

๊ทธ๋ฆฌ๊ณ  ํ˜ผ์ž ํ•˜๋ ค๊ณ  ํ•˜์ง€ ๋งˆ. ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋„์›€์„ ๋ฐ›๊ณ , ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ๋„์™€์ฃผ๋ฉด์„œ ํ•จ๊ป˜ ์„ฑ์žฅํ•ด. ์˜คํ”ˆ์†Œ์Šค์˜ ์ง„์ •ํ•œ ๊ฐ€์น˜๋Š” ๋ฐ”๋กœ ์ด๋Ÿฐ ํ˜‘์—…๊ณผ ๊ณต์œ ์˜ ๋ฌธํ™”์— ์žˆ๊ฑฐ๋“ . ๐ŸŒˆ

๐Ÿš€ โœจ ๐Ÿ’ป
๋‹น์‹ ์˜ ์ฒซ ์ปค๋ฐ‹์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค!
์ž‘์€ ์‹œ์ž‘์ด ํฐ ๋ณ€ํ™”๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
์˜ค๋Š˜ ๋‹น์‹ ์ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€
๋‚ด์ผ ์„ธ์ƒ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋„ค๊ฐ€ ์–ธ์  ๊ฐ€ Linux ์ปค๋„ ๋ฉ”์ธํ…Œ์ด๋„ˆ๊ฐ€ ๋˜๊ฑฐ๋‚˜, GNU ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ ๊ธฐ์—ฌ์ž๊ฐ€ ๋˜๋Š” ๋‚ ์„ ๊ธฐ๋Œ€ํ• ๊ฒŒ! ๊ทธ๋•Œ๊นŒ์ง€ ์ฆ๊ฒ๊ฒŒ ์ฝ”๋”ฉํ•˜๊ณ , ๊ณ„์† ๋ฐฐ์šฐ๊ณ , ๋ฉ‹์ง„ ์˜คํ”ˆ์†Œ์Šค ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•˜๊ธธ ๋ฐ”๋ผ. ๐ŸŽ‰

Happy hacking! ๐Ÿง ๐Ÿ”ง ๐Ÿ’–
์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด, ์žฌ๋Šฅ๋„ท์—์„œ ๋” ๋งŽ์€ ์ง€์‹๊ณผ ๊ฒฝํ—˜์„ ๋‚˜๋ˆ ๋ณด์„ธ์š”.
C์–ธ์–ด, ์ปค๋„ ๊ฐœ๋ฐœ, ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์˜ ์ „๋ฌธ๊ฐ€๋“ค๊ณผ ํ•จ๊ป˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐ŸŒŸ ํ•จ๊ป˜ ๋ฐฐ์šฐ๊ณ , ํ•จ๊ป˜ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ ๐ŸŒŸ
๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0