본문 바로가기
임베디드 개발/STM32 (ARM Cortex-M)

STM32 ] 메모리 영역 구분 ( Code, Data, BSS, Heap, Stack )

by eteo 2022. 6. 30.

 

 

 

구분 내용 저장위치 사용
code = text 함수, 제어문, 상수 등 ROM 컴파일 시 크기가 결정되고 이후 변하지 않음
data 초기값이 있는 전역변수, 정적변수 ROM
bss 초기값이 없는 전역변수, 정적변수 (0으로 초기화) RAM
heap 동적할당된 지역변수 RAM 런타임에 사용되고 heap은 낮은주소에서 높은주소로 데이터가 쌓이고, stack은 높은주소에서 낮은주소로 데이터가 쌓인다.
stack 정적할당된 지역변수 RAM

 

정적할당된 지역변수는 메모리의 Stack Segment에 저장되며 선언된 함수가 종료되면 메모리에서 사라진다.

 

그리고 초기화된 전역변수와 정적변수는 Data Segment에 저장되는데 Data Segment는 ROM(Read Only Memory)에 있어서 한번 선언되면 값을 수정할 수 없는 문제가 생긴다. 따라서 Data Segment는 RAM(Random Access Memory)에 복사한 후 런타임에서 수정되는 값은 RAM에 저장한다. 즉, Data Segment는 ROM, RAM 두 영역 모두를 필요로 한다.

 

초기화되지 않은 전역변수와 정적변수는 BSS Segment에 저장된다. BSS Segment에 있는 변수들은 스타트업(Startup.s)시에 reset 핸들러가 BSS Segnment의 변수들을 0으로 채우는 과정을 거친다.

 

 

 

 

 

위 화면은 빌드 후 나오는 콘솔 화면인데 저중에서 text와 data가 플래시 메모리 영역에 저장된다.

 

참고로 dec는 text, data, bss의 크기를 합친 값을 10진수로 표현한 것. hex는 16진수로 표현한 것

 

 

 

 

 

프로젝트에서 오른쪽 클릭하고 다음과 같이 세팅해서 bin파일이 생성되도록 설정해주면 실제 플래시 메모리에 올라가는 bin 파일을 확인할 수 있다.

 

 

 

 

또한 프로젝트 폴더에서

 

 

startup_stm32f429zitx.s 파일이 최초로 실행되는 어셈블리어 파일이고

 

STM32F429ZITX_FLASH.ld 가 코드와 데이터 같은 바이너리가 저장될 위치를 지정하는 Linker stript 파일이고, (Linker 란 컴파일 된 object 파일들을 한데 묶어 실행파일로 만드는 것) STM32F429ZITX_RAM.ld 파일은 플래시메모리에 올라간 것을 램에 복사할때 address를 지정해주는 파일이다.

 

 

 

 

아무튼 위에서 생성된 bin 파일을 HxD라는 Hex Editor 툴을 사용해서 열어보면 가장 먼저나오는 4byte인 0x20030000 (리틀엔디안이라 이렇게 읽는다) 이 바로 스타트업 파일에 등장하는 _estack 값이다.

 

 

 

 

_estack 의 정의는 STM32F429ZITX_FLASH.ld 에 있는데 램의 끝 주소를 의미하며 동시에 스택포인터의 시작위치이다.

 

 

 

참고 : 

https://hydroponicglass.tistory.com/182