CPU Course Review - 16. Linker Script, Startup Code

2025. 2. 27. 13:49·AI SOC COURSE/SYSTEM VERILOG (CPU 설계)
728x90

https://www.tcpschool.com/c/c_memory_structure

 

프로그램이 실행되기 위해서는 먼저 프로그램이 메모리(FLASH MEMORY)에 로드(load)되어야 한다.
또한, 프로그램에서 사용되는 변수들을 저장할 메모리(RAM)도 필요하게된다.

따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있는데, 각각의 메모리 공간에 대해 알아보자.


1. 코드(code) 영역

  • 프로그램의 실행 코드(기계어 명령어)가 저장된다. 주로 .text 섹션에 해당한다.
  • 일반적으로 FLASH 메모리에 저장된다. 실행 시 RAM으로 복사될 수도 있지만, 기본적으로 FLASH에 상주한다.
  • 읽기 전용이며, 프로그램이 시작되면 수정되지 않는다.

2. 데이터(data) 영역

  • 초기화된 전역 변수(.data)와 초기화되지 않은 전역 변수(.bss)가 포함된다.
  • RAM에 저장된다. 단, 초기값은 FLASH에 저장되어 있다가 부팅 시 RAM으로 복사된다.

3. 스택(stack) 영역

  • 지역 변수, 함수 호출 스택 프레임 등이 저장되는 동적 메모리 영역이다.
  • 컴파일 타임에 최대 크기가 결정된다.
  • RAM에 저장된다. FLASH는 읽기 전용 메모리이므로 스택처럼 동적으로 변하는 데이터가 저장될 수 없다.
  • 컴파일러가 자동으로 관리하며, 크기는 링커 스크립트에서 _Min_Stack_Size로 정의된다
  • _estack(Stack Pointer)이 RAM 끝에 설정되고, 스택이 아래로 자란다.

4. 힙(heap) 영역

  • 동적 메모리 할당(예: malloc)에 사용되는 영역이다.
  • RAM에 저장된다. 런타임에 크기가 변하므로 FLASH에 저장될 수 없다.
  • 런타임에 크기가 결정된다.

임베디드 시스템에서는 해당 영역에 대한 설정값이 링커 스크립트(LinkerScript.ld), 스타트업 코드(startup_stm32f411xe.s)와 같은 파일에 정의 되어있다.

 

STM32에서 제공하는 링커 스크립트, 스타트업 코드를 분석하여 이에 대해 한번 살펴보자.

 

* 링커 스크립트(LinkerScript.ld) 

- 컴파일된 오브젝트 파일을 메모리 레이아웃에 맞춰 배치한다.

/* Entry Point */
ENTRY(Reset_Handler)

/* Highest address of the user mode stack */
_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */

_Min_Heap_Size = 0x200; /* required amount of heap */
_Min_Stack_Size = 0x400; /* required amount of stack */

/* Memories definition */
MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 512K
}

링커 스크립트 파일의 처음 부분을 보게 되면, 힙(heap), 스택(stack), RAM, FLASH의 크기와 위치를 정의하는 역할의 코드가 작성되어 있는 것을 볼 수 있다. 이를 해석해보면, 

  • 힙의 최소 크기를 512바이트로 예약한다.
  • 스택의 최소 크기를 1KB로 예약하고, RAM 끝에 위치시킨다.
  • RAM을 128KB 크기로 0x20000000부터 정의한다.
  • FLASH를 512KB 크기로 0x8000000부터 정의한다.
/* Sections */
SECTIONS
{
  /* The startup code into "FLASH" Rom type memory */
  .isr_vector :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector)) /* Startup code */
    . = ALIGN(4);
  } >FLASH

  /* The program code and other data into "FLASH" Rom type memory */
  .text :
  {
    . = ALIGN(4);
    *(.text)           /* .text sections (code) */
    *(.text*)          /* .text* sections (code) */
    *(.glue_7)         /* glue arm to thumb code */
    *(.glue_7t)        /* glue thumb to arm code */
    *(.eh_frame)

    KEEP (*(.init))
    KEEP (*(.fini))

    . = ALIGN(4);
    _etext = .;        /* define a global symbols at end of code */
  } >FLASH
  ...
  ...
  ...

 

링커 스크립트의 SECTIONS 부분은 프로그램의 각 섹션(코드, 데이터 등)이 메모리의 어디에 배치될지를 정의하고 있다. 위의 코드는 .isr_vector와 .text 섹션이 FLASH 메모리에 배치되는 것을 설명하고 있는 것을 확인할 수 있다.


* 스타트업 코드 (startup_stm32f411xe.s)

- 시스템이 리셋된 후 초기화 작업을 수행하고 메인 프로그램으로 넘어간다.

    .section  .text.Reset_Handler
  .weak  Reset_Handler
  .type  Reset_Handler, %function
Reset_Handler:  
  ldr   sp, =_estack    		 /* set stack pointer */

/* Call the clock system initialization function.*/
  bl  SystemInit   

/* Copy the data segment initializers from flash to SRAM */  
  ldr r0, =_sdata
  ldr r1, =_edata
  ldr r2, =_sidata
  movs r3, #0
  b LoopCopyDataInit

CopyDataInit:
  ldr r4, [r2, r3]
  str r4, [r0, r3]
  adds r3, r3, #4

LoopCopyDataInit:
  adds r4, r0, r3
  cmp r4, r1
  bcc CopyDataInit
  
/* Zero fill the bss segment. */
  ldr r2, =_sbss
  ldr r4, =_ebss
  movs r3, #0
  b LoopFillZerobss

FillZerobss:
  str  r3, [r2]
  adds r2, r2, #4

LoopFillZerobss:
  cmp r2, r4
  bcc FillZerobss

 

스타트업 코드(startup_stm32f411xe.s)는 어셈블리 언어로 작성되어 있으며, 링커 스크립트에서 정의된 스택 포인터(_estack)를 사용하는 것을 볼 수 있다.. 이 코드는 STM32 마이크로컨트롤러가 리셋 후 실행되는 초기화 과정을 담당하게 된다.

728x90

'AI SOC COURSE > SYSTEM VERILOG (CPU 설계)' 카테고리의 다른 글

CPU Course Review - 18. AMBA BUS (APB Protocol - UART)  (0) 2025.02.28
CPU Course Review - 17. AMBA BUS (APB Protocol - FND CONTROL)  (0) 2025.02.27
CPU Course Review - 15. AMBA BUS (APB Protocol - GPIO)  (0) 2025.02.26
CPU Course Review - 14. Device Driver  (0) 2025.02.26
CPU Course Review - 13. AMBA BUS (APB Protocol - GPI)  (0) 2025.02.26
'AI SOC COURSE/SYSTEM VERILOG (CPU 설계)' 카테고리의 다른 글
  • CPU Course Review - 18. AMBA BUS (APB Protocol - UART)
  • CPU Course Review - 17. AMBA BUS (APB Protocol - FND CONTROL)
  • CPU Course Review - 15. AMBA BUS (APB Protocol - GPIO)
  • CPU Course Review - 14. Device Driver
Dinoj
Dinoj
  • Dinoj
    AlOG
    Dinoj
  • 전체
    오늘
    어제
    • 분류 전체보기 (201)
      • Python (0)
        • COMPUTER VISION (18)
        • Pytorch (1)
      • PCB 이론 (13)
        • PI (2)
        • SI (11)
      • 회로 이론 (63)
        • 기타 학습 (20)
        • UVM (Universal Verification.. (12)
        • AI HARDWARE (12)
      • PROJECTS (29)
        • AI 가속기 (10)
        • 영상 처리 (3)
        • UVM (Universal Verification.. (2)
        • CPU 설계 (5)
        • CMOS VLSI (2)
        • Verilog (2)
        • Firmware (2)
        • C 언어 (2)
        • 기타 프로젝트 (1)
      • Linux (20)
        • Embedded Linux (Rpi) (7)
        • Petalinux (7)
        • Linux 기초 (6)
      • AMBA BUS (16)
        • AXI BUS (5)
        • APB BUS (2)
        • Vitis (8)
      • AI SOC COURSE (53)
        • 영상 처리 (5)
        • SYSTEM VERILOG (CPU 설계) (20)
        • VERILOG 기초 (5)
        • CMOS VLSI (7)
        • FIRMWARE (9)
        • C PROGRAMMING (1)
        • Python (Keras) (6)
      • 코딩 지식 (5)
        • SYSTEM VERILOG (3)
        • TCL (2)
      • TISTORY (1)
  • 블로그 메뉴

    • 홈
    • 글쓰기
    • 관리
    • Info
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
Dinoj
CPU Course Review - 16. Linker Script, Startup Code
상단으로

티스토리툴바