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 _๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ๋นŒ๋“œ๋Š” ๋˜์ง€๋งŒ, ์ง„์ž…์ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.