alloc

alloc을 μ‚¬μš©ν•˜λ €λ©΄ μ „μ—­ (νž™) ν• λ‹Ήμžλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.

#![no_main]
#![no_std]

extern crate alloc;
extern crate panic_halt as _;

use alloc::string::ToString;
use alloc::vec::Vec;
use buddy_system_allocator::LockedHeap;

#[global_allocator]
static HEAP_ALLOCATOR: LockedHeap<32> = LockedHeap::<32>::new();

static mut HEAP: [u8; 65536] = [0; 65536];

pub fn entry() {
    // `HEAP`이 μ—¬κΈ°μ„œλ§Œ μ‚¬μš©λ˜κ³  `entry`κ°€ ν•œ 번만 ν˜ΈμΆœλ˜λ―€λ‘œ μ•ˆμ „ν•©λ‹ˆλ‹€.
    unsafe {
        // ν• λ‹Ήμžμ—κ²Œ ν• λ‹Ήν•  λ©”λͺ¨λ¦¬λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
        HEAP_ALLOCATOR.lock().init(HEAP.as_mut_ptr() as usize, HEAP.len());
    }

    // 이제 νž™ 할당이 ν•„μš”ν•œ μž‘μ—…μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    let mut v = Vec::new();
    v.push("A string".to_string());
}
  • buddy_system_allocatorλŠ” κ°„λ‹¨ν•œ 버디 μ‹œμŠ€ν…œ ν• λ‹Ήμžλ₯Ό κ΅¬ν˜„ν•˜λŠ” μ„œλ“œ νŒŒν‹° ν¬λ ˆμ΄νŠΈμž…λ‹ˆλ‹€. 이 외에도, λ‹€λ₯Έ 크레이트λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜, 직접 ν• λ‹Ήμžλ₯Ό λ§Œλ“€κ±°λ‚˜, 이미 μ‘΄μž¬ν•˜λŠ” λ‹€λ₯Έ ν• λ‹Ήμžμ— ν›„ν‚Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • LockHeap νƒ€μž…μ˜ const λ§€κ°œλ³€μˆ˜λŠ” ν• λ‹Ήμžμ˜ μ΅œλŒ€ 크기λ₯Ό 2μ§„μˆ˜λ‘œ ν‘œν˜„ν–ˆμ„ λ•Œμ˜ μžλ¦Ώμˆ˜μž…λ‹ˆλ‹€. 즉, 이 경우처럼 32인 경우 μ΅œλŒ€ 2**32λ°”μ΄νŠΈ 크기의 μ˜μ—­μ„ λ‹€λ£° 수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν•œ λ°”μ΄λ„ˆλ¦¬μ—μ„œ alloc에 μ˜μ‘΄ν•˜λŠ” ν¬λ ˆμ΄νŠΈκ°€ ν•˜λ‚˜λΌλ„ μžˆλ‹€λ©΄ λ°”μ΄λ„ˆλ¦¬ μ „μ²΄μ—μ„œ μ „μ—­ ν• λ‹Ήμžκ°€ λ°˜λ“œμ‹œ ν•˜λ‚˜ μ‘΄μž¬ν•΄μ•Ό ν•©λ‹ˆλ‹€. 일반적으둜 μ „μ—­ ν• λ‹Ήμžλ₯Ό μ„ μ–Έν•˜λŠ” μž‘μ—…μ€ μ΅œμƒμœ„ λ°”μ΄λ„ˆλ¦¬ ν¬λ ˆμ΄νŠΈμ—μ„œ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.
  • panic_halt ν¬λ ˆμ΄νŠΈκ°€ μ—°κ²°λ˜μ–΄ νŒ¨λ‹‰ ν•Έλ“€λŸ¬λ₯Ό κ°€μ Έμ˜€λ„λ‘ ν•˜λ €λ©΄ extern crate panic_halt as _κ°€ ν•„μš”ν•©λ‹ˆλ‹€.
  • 이 μ˜ˆμ‹œ μ½”λ“œλŠ” λΉŒλ“œλŠ” λ˜μ§€λ§Œ, μ§„μž…μ μ΄ μ—†κΈ° λ•Œλ¬Έμ— μ‹€ν–‰λ˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.