[Rust 공식문서 한국어 정리] 61. Rust no_std 가이드
[Rust 공식문서 한국어 정리] 61. Rust no_std 가이드
원문 제목: The core library — Rust Standard Library
작성자: Rust Standard Library Team
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 1. 서론 — 이 문서가 다루는 내용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
이 문서는 표준 라이브러리(std) 없이 core와 alloc만을 사용하는 no_std 환경을 설명합니다.
임베디드 시스템, OS 커널, 부트로더 등 제한된 환경에서 Rust를 사용하는 방법을 다룹니다.
no_std의 제약, alloc의 선택적 사용, panic handler와 글로벌 할당자 설정을 중심으로 설명합니다.
std에 의존하는 크레이트를 no_std 환경에서 사용할 수 있도록 포팅하는 전략도 포함합니다.
임베디드, OS 개발, 그리고 극도로 제한된 리소스 환경에서 Rust를 사용하려는 개발자에게 필수적입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔑 2. 핵심 개념 4가지
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① #![no_std]: 표준 라이브러리 링크를 비활성화하고, core와 alloc만 사용하도록 선언합니다.
② core: std의 OS/할당자에 의존하지 않는 기본 타입과 트레이트를 제공하는 크레이트입니다.
③ alloc: 힙 할당이 필요한 타입(Vec, String, Box 등)을 제공하는 선택적 크레이트입니다.
④ Panic Handler: std의 panic 구현을 대체하는 사용자 정의 panic 처리 함수입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📖 3. 주요 내용 상세
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
no_std 환경에서는 crate 루트에 #![no_std]를 선언합니다.
이는 std를 링크하지 않으며, 기본 입출력, 파일 시스템, 네트워킹, 힙 할당자를 사용할 수 없게 됩니다.
대신 core 크레이트의 Option, Result, Iterator, 포인터, 기본 타입 등은 그대로 사용할 수 있습니다.
alloc은 힙 할당이 가능한 환경에서 선택적으로 사용합니다.
extern crate alloc;을 선언하고, #[global_allocator]로 메모리 할당자를 지정합니다.
linked_list_allocator, embedded-alloc 등의 크레이트가 임베디드 환경에서 사용됩니다.
panic handler는 std::panic::PanicInfo를 인자로 받는 함수를 정의해야 합니다.
#[cfg(not(test))]
#[panic_handler]
fn panic(_info: &core::panic::PanicInfo) -> ! { loop {} } 형태로 작성합니다.
테스트 환경에서는 표준 panic이 필요하므로, cfg로 조건부 컴파일합니다.
OS/임베디드 타겟에서는 시작 진입점(entry point)도 직접 정의해야 합니다.
#[no_mangle]
pub extern "C" fn _start() -> ! { ... } 형태로, 링커 스크립트와 함께 사용합니다.
cortex-m-rt나 riscv-rt 같은 런타임 크레이트가 이러한 보일러플레이트를 줄여줍니다.
no_std 호환 크레이트를 작성할 때는 std 기능을 선택적으로 제공하는 것이 관례입니다.
Cargo.toml의 [features]에서 default = ["std"]를 두고, no_std 환경에서는 default-features = false로 사용합니다.
#[cfg(feature = "std")]와 #[cfg(not(feature = "std"))]로 코드를 분기하여, 양쪽 환경을 모두 지원합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🛠 4. 실전 활용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
임베디드 펌웨어에서는 #![no_std]와 embedded-alloc로 힙을 선택적으로 사용합니다.
OS 커널 모듈에서는 core만 사용하고, 커널 자체의 메모리 할당자를 구현합니다.
라이브러리를 배포할 때는 std/no_std를 모두 지원하여 생태계 호환성을 극대화합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 5. 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
no_std는 Rust를 OS 없는 환경과 극도로 제한된 시스템으로 확장하는 핵심 기능입니다.
core와 alloc의 경계를 이해하고, panic handler와 글로벌 할당자를 올바르게 설정해야 합니다.
std/no_std 이중 지원은 라이브러리 개발자의 중요한 책임입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔗 출처 링크
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
원문: https://doc.rust-lang.org/stable/core/
The Embedded Rust Book: https://docs.rust-embedded.org/book/
#Rust #no_std #Embedded #Core #Alloc #Kernel #SystemsProgramming #번역

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30