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

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

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

  • ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ "ํŒจ๋‹‰" ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋Š” ํˆดํ‚ท๊ณผ alloc ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ณ€ํ˜•์ด Rust 1.60 ๋ฆด๋ฆฌ์Šค๋กœ ์—…๋ฐ์ดํŠธ๋˜์–ด ์ปค๋„ ํŒจ์น˜์— ์‚ฌ์šฉ๋˜๋Š” "maybe_uninit_extra" ๋ชจ๋“œ์— ๋Œ€ํ•œ ์ง€์›์ด ์•ˆ์ •ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ปค๋„ API์— ์—ฐ๊ฒฐ๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์ปค๋„ ๋กœ๋”ฉ ์ค‘์— ์‹คํ–‰๋˜๋Š” KUnit ํ…Œ์ŠคํŠธ๋กœ ์ปดํŒŒ์ผ ํƒ€์ž„ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฌธ์„œ์—์„œ ํ…Œ์ŠคํŠธ(๋ฌธ์„œ์—์„œ ์˜ˆ์ œ๋กœ๋„ ์‚ฌ์šฉ๋˜๋Š” ํ…Œ์ŠคํŠธ)๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Rust ์ปค๋„ ์ฝ”๋“œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ…Œ์ŠคํŠธ์—์„œ Clippy linter ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ฑ„ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋„คํŠธ์›Œํฌ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ "net" ๋ชจ๋“ˆ์˜ ์ดˆ๊ธฐ ๊ตฌํ˜„์ด ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Rust ์ฝ”๋“œ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค(struct net ์ปค๋„ ๊ตฌ์กฐ ๊ธฐ๋ฐ˜), SkBuff(struct sk_buff), TcpListener, TcpStream(struct ์†Œ์ผ“), Ipv4Addr(struct in_addr), SocketAddrV4(struct sockaddr_in) ๋ฐ ํ•ด๋‹น IPv6 ๊ตฌ์กฐ์™€ ๊ฐ™์€ ์ปค๋„ ๋„คํŠธ์›Œํฌ ๊ตฌ์กฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .
  • kasync ๋ชจ๋“ˆ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„๋œ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ (async)์— ๋Œ€ํ•œ ์ดˆ๊ธฐ ์ง€์›์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, TCP ์†Œ์ผ“์„ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; n == 0์ธ ๊ฒฝ์šฐ { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
  • ๋„คํŠธ์›Œํฌ ํŒจํ‚ท ํ•„ํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ net::filter ๋ชจ๋“ˆ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Rust ์–ธ์–ด๋กœ ํ•„ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•œ Rust_netfilter.rs ์˜ˆ์ œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณ ์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฐ„๋‹จํ•œ ๋ฎคํ…์Šค smutex::Mutex์˜ ๊ตฌํ˜„์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ž ๊ธˆ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ์˜ํ•ด ์ ์œ ๋œ ๊ฒฝ์šฐ ํ˜ธ์ถœ์ž๋ฅผ ์ค‘์ง€ํ•˜๋Š” ๋Œ€์‹  ์ž ๊ธˆ์„ ํš๋“ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ณด๊ณ ๋˜๋Š” NoWaitLock์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์œ ํœด ์ƒํƒœ์ผ ์ˆ˜ ์—†๋Š” ์„น์…˜์— ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ปค๋„์—์„œ raw_spinlock_t๋กœ ์‹๋ณ„๋˜๋Š” RawSpinLock์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ฐธ์กฐ ๊ณ„์‚ฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์ ์šฉ๋˜๋Š”(ํ•ญ์ƒ ์ฐธ์กฐ) ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ์— ๋Œ€ํ•œ ARef ์œ ํ˜•์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • GCC ํ”„๋กœ์ ํŠธ์˜ libgccjit ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ Rustc์˜ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋กœ ์‚ฌ์šฉํ•˜์—ฌ GCC์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์ตœ์ ํ™”์— ๋Œ€ํ•œ ์ง€์›์„ Rustc์— ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” Rustc_codegen_gcc ๋ฐฑ์—”๋“œ๋Š” Rustc ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋ถ€ํŠธ์ŠคํŠธ๋žฉํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ์Šน๊ฒฉ์ด๋ž€ Rustc์˜ GCC ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Rustc ์ปดํŒŒ์ผ๋Ÿฌ ์ž์ฒด๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ GCC 12.1์˜ ์ตœ์‹  ๋ฆด๋ฆฌ์Šค์—๋Š” Rustc_codegen_gcc๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ libgccjit์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Rustup ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Rustc_codegen_gcc๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์ค€๋น„๊ฐ€ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.
  • GCC ๊ธฐ๋ฐ˜์˜ Rust ์–ธ์–ด ์ปดํŒŒ์ผ๋Ÿฌ ๊ตฌํ˜„์„ ํ†ตํ•œ GCC ํ”„๋ŸฐํŠธ์—”๋“œ gccrs ๊ฐœ๋ฐœ์˜ ์ง„ํ–‰ ์ƒํ™ฉ์ด ๊ธฐ๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ gccrs์—๋Š” ๋‘ ๋ช…์˜ ์ •๊ทœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

์ถœ์ฒ˜ : opennet.ru

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