Rust ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜๋Š” Linux ์ปค๋„์šฉ ํŒจ์น˜์˜ XNUMX๋ฒˆ์งธ ๋ฒ„์ „

Rust-for-Linux ํ”„๋กœ์ ํŠธ์˜ ์ €์ž์ธ Miguel Ojeda๋Š” Linux ์ปค๋„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋„๋ก Rust ์–ธ์–ด๋กœ ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ v8 ๊ตฌ์„ฑ ์š”์†Œ ๋ฆด๋ฆฌ์Šค๋ฅผ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์„ ๊ณ ๋ คํ•˜์—ฌ ๋ฒ„์ „ ๋ฒˆํ˜ธ ์—†์ด ๊ฒŒ์‹œ๋œ ํŒจ์น˜์˜ ์ˆ˜์ •๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. Rust ์ง€์›์€ ์‹คํ—˜์ ์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์ง€๋งŒ ์ด๋ฏธ linux-next ๋ธŒ๋žœ์น˜์— ํฌํ•จ๋˜์–ด ์žˆ๊ณ  5.20/6.0์˜ ๊ฐ€์„ ๋ฆด๋ฆฌ์Šค์— ํ†ตํ•ฉ๋˜์—ˆ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋ฉฐ ์ปค๋„ ํ•˜์œ„ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์ƒ์„ฑํ•˜๊ณ  ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์„ฑ์ˆ™๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“ˆ. ์ด ๊ฐœ๋ฐœ์€ Google๊ณผ Let's Encrypt ํ”„๋กœ์ ํŠธ์˜ ์ฐฝ๋ฆฝ์ž์ธ ISRG(Internet Security Research Group)์—์„œ ์ž๊ธˆ์„ ์ง€์›๋ฐ›๊ณ  HTTPS์™€ ์ธํ„ฐ๋„ท ๋ณด์•ˆ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ธฐ์ˆ  ๊ฐœ๋ฐœ์„ ์ด‰์ง„ํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ ๋ฒ„์ „์—์„œ:

  • ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ "ํŒจ๋‹‰" ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋Š” ํˆดํ‚ท๊ณผ alloc ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ณ€ํ˜•์ด Rust 1.62 ๋ฆด๋ฆฌ์Šค์— ๋งž์ถฐ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ์‚ฌ์šฉ๋œ ๋ฒ„์ „๊ณผ ๋น„๊ตํ•˜์—ฌ Rust ํˆดํ‚ท์€ ์ปค๋„ ํŒจ์น˜์— ์‚ฌ์šฉ๋˜๋Š” const_fn_trait_bound ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์›์„ ์•ˆ์ •ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ”์ธ๋”ฉ ์ฝ”๋“œ๋Š” ๋ณ„๋„์˜ ํฌ๋ ˆ์ดํŠธ ํŒจํ‚ค์ง€ "๋ฐ”์ธ๋”ฉ"์œผ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด ๊ธฐ๋ณธ ํŒจํ‚ค์ง€ "์ปค๋„"๋งŒ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ์žฌ๊ตฌ์ถ•์ด ๋‹จ์ˆœํ™”๋ฉ๋‹ˆ๋‹ค.
  • ๋งคํฌ๋กœ "concat_idents!" ๊ตฌํ˜„ concat_idents ๊ธฐ๋Šฅ์— ์—ฐ๊ฒฐ๋˜์ง€ ์•Š๊ณ  ์ง€์—ญ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•˜๋Š” ์ ˆ์ฐจ์  ๋งคํฌ๋กœ ํ˜•์‹์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • "static_assert!" ๋งคํฌ๋กœ๊ฐ€ ๋‹ค์‹œ ์ž‘์„ฑ๋˜์–ด ๋ชจ๋“  ์ปจํ…์ŠคํŠธ์—์„œ ์ƒ์ˆ˜ ๋Œ€์‹  "core::assert!()"๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋งคํฌ๋กœ "build_error!" ๋ชจ๋“ˆ์— "RUST_BUILD_ASSERT_{WARN,ALLOW}" ๋ชจ๋“œ๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ ์ž‘๋™ํ•˜๋„๋ก ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • "kernel/configs/rust.config" ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ„๋„์˜ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋งคํฌ๋กœ ๋Œ€์ฒด์—์„œ ์ฒ˜๋ฆฌ๋œ "*.i" ํŒŒ์ผ์˜ ์ด๋ฆ„์ด "*.rsi"๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • C ์ฝ”๋“œ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ์ตœ์ ํ™” ์ˆ˜์ค€์œผ๋กœ Rust ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ์ง€์›์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํŒŒ์ผ ์‹œ์Šคํ…œ ์ž‘์—…์„ ์œ„ํ•œ ๋ฐ”์ธ๋”ฉ์„ ์ œ๊ณตํ•˜๋Š” fs ๋ชจ๋“ˆ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Rust๋กœ ์ž‘์„ฑ๋œ ๊ฐ„๋‹จํ•œ ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ์˜ˆ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  • ์‹œ์Šคํ…œ ๋Œ€๊ธฐ์—ด ์ž‘์—…์„ ์œ„ํ•œ ์ž‘์—… ๋Œ€๊ธฐ์—ด ๋ชจ๋“ˆ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค(work_struct ๋ฐ workqueue_struct ์ปค๋„ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ ์ œ๊ณต).
  • kasync ๋ชจ๋“ˆ์˜ ๊ฐœ๋ฐœ์€ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•(async)์˜ ๊ตฌํ˜„๊ณผ ํ•จ๊ป˜ ๊ณ„์†๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Rust๋กœ ์ž‘์„ฑ๋œ ์ฝ”์–ด ์ˆ˜์ค€ TCP ์„œ๋ฒ„์˜ ์˜ˆ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • [Threaded]Handler ์œ ํ˜• ๋ฐ [Threaded]Registration` ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ Rust ์–ธ์–ด์—์„œ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • file_Operations ๊ตฌ์กฐ์™€ ๊ฐ™์€ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ํ…Œ์ด๋ธ” ์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ ˆ์ฐจ์  ๋งคํฌ๋กœ "#[vtable]"์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ชฉ๋ก "unsafe_list::List" ๊ตฌํ˜„์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ฝ๊ธฐ ์ž ๊ธˆ์ด ํ˜„์žฌ ์Šค๋ ˆ๋“œ์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด RCU(์ฝ๊ธฐ-๋ณต์‚ฌ-์—…๋ฐ์ดํŠธ) ๋ฐ Guard ์œ ํ˜•์— ๋Œ€ํ•œ ์ดˆ๊ธฐ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ปค๋„ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ž๋™์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” Task::spawn() ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. Task::wake_up() ๋ฉ”์„œ๋“œ๋„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ง€์—ฐ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์—ฐ ๋ชจ๋“ˆ(msleep()์— ๋Œ€ํ•œ ๋ž˜ํผ)์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „ ์ฒ˜๋ฆฌ๋Š” ์ฝ”๋“œ ์‹คํ–‰ ์ค‘ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค์˜ ์ •ํ™•์„ฑ ํ‰๊ฐ€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฐธ์กฐ ํ™•์ธ, ๊ฐœ์ฒด ์†Œ์œ ๊ถŒ ๋ฐ ๊ฐœ์ฒด ์ˆ˜๋ช…(๋ฒ”์œ„) ์ถ”์ ์„ ํ†ตํ•ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— Rust์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. Rust๋Š” ๋˜ํ•œ ์ •์ˆ˜ ์˜ค๋ฒ„ํ”Œ๋กœ์— ๋Œ€ํ•œ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ , ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ณ€์ˆ˜ ๊ฐ’์˜ ํ•„์ˆ˜ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋” ์ž˜ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๋ณ€ ์ฐธ์กฐ ๋ฐ ๋ณ€์ˆ˜ ๊ฐœ๋…์„ ์ ์šฉํ•˜๊ณ , ๊ฐ•๋ ฅํ•œ ์ •์  ์œ ํ˜• ์ง€์ •์„ ์ œ๊ณตํ•˜์—ฌ ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜๋ฅผ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€