본문 중간의 쿠팡 추천 상품 구매시 쿠팡 파트너스에서 일정액의 수수료를 제공받습니다.

Device Tree의 /reserved-memory는 운영체제가 일반 메모리 할당에 쓰면 안 되는 물리 메모리 영역을 설명하는 표준 노드입니다. 프레임버퍼, 펌웨어가 쓰는 버퍼, 특정 장치용 DMA 풀처럼 일반 RAM과 구분해야 하는 영역을 DTS에 드러낼 때 사용합니다.
2026년 8월 4일 기준 Devicetree Specification과 Linux 커널 Devicetree binding 문서를 보면, 핵심은 세 가지입니다. 부모 노드의 셀 설정, child node의 예약 방식, 그리고 장치 노드가 memory-region으로 그 영역을 참조하는 구조입니다.
/reserved-memory는 어디에 두나
/reserved-memory는 루트 아래에 두는 노드입니다. 명세는 이 노드 아래의 child node가 하나 이상의 예약 메모리 영역을 설명한다고 봅니다. 운영체제는 이 영역을 정상적인 메모리 사용 대상에서 제외해야 합니다.
부모 노드에는 #address-cells, #size-cells, ranges가 필요합니다. 일반적으로 #address-cells와 #size-cells는 루트 노드와 같은 값을 쓰고, ranges는 빈 속성으로 둬 주소 변환이 맞게 동작하도록 합니다.

/ {
#address-cells = <2>;
#size-cells = <2>;
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
};
};
여기서 중요한 점은 /memory 노드와 역할이 다르다는 것입니다. /memory는 시스템 RAM의 범위를 설명하고, /reserved-memory는 그중 일반 할당에서 빼야 하는 영역을 별도로 설명합니다.
정적 예약과 동적 예약은 어떻게 다를까
예약 영역 child node는 보통 두 방식 중 하나로 작성합니다. 주소가 이미 정해진 영역은 reg를 쓰고, 운영체제가 부팅 중 크기와 제약 조건에 맞춰 잡아도 되는 영역은 size를 씁니다.
| 방식 | 주요 속성 | 읽는 기준 |
|---|---|---|
| 정적 예약 | reg |
물리 주소와 크기가 DTS에 직접 적혀 있습니다. |
| 동적 예약 | size, alignment, alloc-ranges |
필요한 크기와 할당 제약을 적고, 실제 위치는 운영체제가 정합니다. |

명세는 reg와 size가 함께 있으면 reg가 우선한다고 설명합니다. 따라서 고정 주소가 필요한 하드웨어 영역이라면 reg를 중심으로 읽고, 연속 메모리 풀처럼 위치보다 크기와 조건이 중요한 경우에는 size와 제약 조건을 확인하는 편이 맞습니다.
no-map과 reusable은 같이 쓰면 안 된다
no-map은 운영체제가 그 영역을 표준 시스템 메모리 매핑의 일부로 가상 매핑하지 말아야 한다는 뜻입니다. Linux binding 문서는 추측 실행 접근도 드라이버의 통제 밖에서는 허용하지 않는 의미로 설명합니다.
reusable은 운영체제가 그 영역을 일시적인 캐시나 휘발성 데이터 저장에 사용할 수 있지만, 소유 장치 드라이버가 필요할 때 회수할 수 있어야 한다는 뜻입니다. 두 속성은 의미가 충돌하므로 같은 예약 노드에서 함께 쓰면 안 됩니다.
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
framebuffer@90000000 {
reg = <0x0 0x90000000 0x0 0x00800000>;
no-map;
};
};
정리하면, CPU 일반 매핑에서 분리해야 하는 장치 전용 영역은 no-map 쪽을 검토하고, 운영체제가 필요할 때 임시로 활용해도 되는 풀은 reusable 쪽을 검토합니다. 두 선택은 하드웨어와 드라이버의 실제 소유권 모델을 기준으로 해야 합니다.
memory-region은 무엇을 연결하나
예약 영역 자체를 만든 것만으로 모든 장치가 자동으로 그 영역을 쓰는 것은 아닙니다. 장치 노드가 특정 예약 영역을 사용해야 한다면 memory-region 속성으로 /reserved-memory의 child node를 참조합니다. 여러 영역을 참조할 때는 memory-region-names로 이름을 맞출 수 있습니다.

reserved-memory {
#address-cells = <1>;
#size-cells = <1>;
ranges;
display_reserved: framebuffer@78000000 {
reg = <0x78000000 0x800000>;
};
};
fb0: video@12300000 {
memory-region = <&display_reserved>;
};
이 구조에서는 예약 노드의 label이 phandle 참조의 대상이 됩니다. DTS를 검토할 때는 예약 영역이 정의되어 있는지뿐 아니라 실제 장치 노드가 올바른 예약 영역을 가리키는지도 같이 확인해야 합니다.
shared-dma-pool과 restricted-dma-pool
Linux 커널 binding에는 DMA 풀 용도의 예약 메모리도 정의되어 있습니다. compatible = "shared-dma-pool"은 여러 장치가 DMA 버퍼 풀로 사용할 수 있는 영역을 나타냅니다. 이 영역에 linux,cma-default가 있으면 Linux는 그 영역을 기본 Contiguous Memory Allocator 풀로 사용합니다.
restricted-dma-pool은 IOMMU가 없는 시스템에서 DMA 접근 범위를 제한하는 목적으로 쓰입니다. binding 문서는 이 경우 no-map과 reusable을 설정하면 안 된다고 명시합니다. 또한 일반적인 메모리 손상과 데이터 노출을 막으려면 시스템이 MPU 같은 메모리 접근 제한 수단을 제공해야 한다고 설명합니다.
| compatible | 목적 | 주의할 점 |
|---|---|---|
shared-dma-pool |
공유 DMA 버퍼 풀 | linux,cma-default가 있으면 Linux 기본 CMA 풀로 쓰입니다. |
restricted-dma-pool |
제한된 DMA 접근 풀 | no-map, reusable과 함께 쓰지 않습니다. |
검토할 때의 기준
- 예약 영역이 루트 아래
/reserved-memory에 들어 있는지 확인합니다. - 부모 노드의
#address-cells,#size-cells, 빈ranges를 확인합니다. - 주소가 고정된 영역은
reg, 동적 할당 영역은size와 제약 조건을 중심으로 읽습니다. no-map과reusable이 같은 child node에 같이 들어가지 않았는지 확인합니다.- 장치가 예약 영역을 써야 한다면
memory-region참조가 실제 예약 노드를 가리키는지 확인합니다. - DMA 풀은
shared-dma-pool인지restricted-dma-pool인지에 따라 허용 속성과 보안 의미가 달라집니다.
FAQ
/reserved-memory를 쓰면 그 영역은 무조건 드라이버 전용이 되나
무조건 그렇지는 않습니다. 예약 영역은 일반 메모리 사용에서 제외되지만, 실제 장치와의 연결은 memory-region 같은 참조와 드라이버 구현을 함께 봐야 합니다. reusable 영역처럼 운영체제가 제한적으로 활용할 수 있는 경우도 있습니다.
reg와 size를 같이 쓰면 어떻게 되나
공식 명세 기준으로는 reg가 우선하고 size는 무시됩니다. 의도를 분명히 하려면 정적 예약과 동적 예약을 섞어 표현하지 않는 편이 좋습니다.
no-map은 보안 옵션인가
no-map은 운영체제의 일반 가상 매핑과 추측 접근을 막는 의미가 있지만, 그것만으로 모든 보안 문제가 해결된다고 볼 수는 없습니다. 장치 접근 제어, DMA 접근 범위, 드라이버의 사용 방식까지 같이 봐야 합니다.
참고 자료
'프로그래밍 > 리눅스 커널' 카테고리의 다른 글
| 리눅스 Device Tree interrupts 기준 정리 (0) | 2026.08.11 |
|---|---|
| 리눅스 Device Tree bootargs 기준 정리 (0) | 2026.07.30 |
| 리눅스 Device Tree dma-ranges 기준 정리 (0) | 2026.07.23 |
| 리눅스 Device Tree #address-cells와 #size-cells 기준 정리 (0) | 2026.07.18 |
| 리눅스 Device Tree stdout-path 기준 정리 (0) | 2026.07.13 |





