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