Rust를 리눅스 커널에 도입해야 하는 이유
- 지난 15년 동안 거의 모든 리눅스 커널 버그 수정과 보안 문제를 살펴본 경험을 바탕으로, Rust 도입의 필요성을 이야기하고자 함
- 모든 버그 수정이 안정 버전 트리에 반영되는 것은 아니지만, 대체로 중요한 것들은 반영되며, 나는 모든 커널 CVE를 확인하는 입장에 있음
C의 한계와 Rust의 장점
- 리눅스 커널에서 발생하는 버그의 대부분은 C 언어의 구조적 한계에서 비롯됨
- 특히, 단순한 실수로 인해 발생하는 버그가 많으며, 이러한 문제들은 Rust에서는 거의 발생하지 않음
-
메모리 오버라이트 (Rust가 모든 경우를 잡아내지는 않지만 상당 부분 해결 가능)
-
에러 경로 정리 문제
-
에러 값 체크 누락
-
Use-after-free(해제 후 사용) 버그
- Rust를 커널에 도입하면 개발자와 유지보수 담당자가 이런 기초적인 실수에서 벗어나, 진짜 어려운 문제(논리 오류, 경쟁 상태 등)에 집중할 수 있음
기존 C 코드베이스도 계속 유지해야 함
- 현재 리눅스 커널은 3천만 줄 이상의 C 코드로 구성되어 있으며, 단기간 내에 이를 Rust로 대체하는 것은 불가능함
- 따라서, Kees와 Gustavo를 비롯한 개발자들이 진행하는 C 코드 보안 강화 작업은 필수적이며 계속되어야 함
- Rust가 기존 코드를 대체하는 것이 아니라, 새로운 코드(특히 드라이버)를 Rust로 작성하여 문제를 줄이는 방식이 이상적임
Rust가 제공하는 API 안전성
- Rust는 커널 내부 API를 더 안전하고 사용하기 쉽게 설계할 수 있도록 함
- 현재 C 기반 커널 API는 복잡하고 실수하기 쉬우며, 유지보수자가 세밀하게 검토해야 하는 경우가 많음
- 예를 들어, struct cdev 같은 구조체를 안전하게 사용하는 방법은 여러 가지가 있으며, 이를 올바르게 활용하기 위해 많은 경험이 필요함
- Rust를 사용하면 API를 더 명확하게 정의할 수 있어, 개발자가 실수할 가능성을 크게 줄일 수 있음
- 이는 단순히 Rust 사용자만을 위한 것이 아니라, 기존 C 코드 사용자들에게도 도움이 되는 변화임
Rust 도입이 어려울 것이라는 우려에 대한 반론
-
Rust는 만능 해결책이 아님 → 하지만 기존 문제의 상당 부분을 해결 가능
-
유지보수자들의 부담 증가 → 하지만 Rust 도입을 원하는 개발자들이 직접 작업을 하고 있음
-
혼합 언어 코드베이스의 유지보수 난이도 → 하지만 리눅스 커널은 지금까지 훨씬 더 어려운 문제들을 해결해 왔음
결론
- 리눅스는 전 세계 수많은 개발자가 문제를 해결하기 위해 사용하는 도구이며,
- 이제 하드웨어를 위한 안전한 코드 작성을 원한다는 개발자들의 요구가 있다면 이를 무시해서는 안 됨
- 리눅스 개발 모델은 그 누구도 예상하지 못했던 규모로 성장하며, 탁월한 엔지니어링 역량을 보여줌
- 이제 Rust 도입을 통해 앞으로 20년 이상의 발전을 위해 나아가야 할 때임
새로운 기술과 아이디어를 받아들이고, 커뮤니티와 함께 성공할 수 있도록 노력해야 함.