PC 에서는 신경 쓸 일이 없지만, 임베디드에서는 플래시와 SRAM 이 나뉘어 있어 필수다.
MEMORY {
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
}
SECTIONS {
.text : { *(.text*) } > FLASH 코드·상수
.data : { *(.data*) } > RAM AT> FLASH 초기값 있는 전역
.bss : { *(.bss*) } > RAM 초기값 없는 전역
}
AT> 가 핵심
.data 는 실행 주소는 RAM, 저장 주소는 플래시다. 이 둘이 다르다는 사실이
부팅 시 복사가 필요한 이유이고, 링커가 만들어 주는 심볼로 그 범위를 알아낸다.
실무에서 손대는 경우
- 부트로더와 애플리케이션의 영역을 나눌 때
- 특정 버퍼를 특정 주소·특정 RAM 블록에 고정할 때(DMA 전용 영역 등)
- 스택·힙 크기를 조정할 때
- 리셋 후에도 값을 남기는 noinit 영역을 둘 때(폴트 기록 보존)