본문 바로가기
Microprocessor

Scatter loading & ROM Binary

by 청운추월 2023. 5. 31.
반응형

마트에서 장을 보면  대부분 냉장고속으로 들어가지만
꺼낸순서대로 냉장고에 차곡차고 쌓는게 아니라 찾기 쉽게 냉장고에 집어넣습니다.

Binary File은 하나이지만 차곡차곡 쌓는것이 아니라 내가 원하는 위치에서 읽을 수 있게 하기 위해 따로 분리해서 여러곳에 올리는것을 Scatter loading이라고 합니다.
ARM은 Scatterloader 를 통해  어떤 Code및 값이 어떤 위치에 들어갈지를 지정해 줄수 있도록 되어 있습니다.

프로그램을 만들면 메모리에 어떻게 들어가는지 알아 볼까요?
프로그램을 만들어서 컴파일하면 CODE, TEXT, BSS, RO,RW,ZI 등 여러가지 타입으로 메모리에 배치되지만 크게 3가지로 나눌 수 있습니다.

RO(Read Only)  : 읽기만 가능한 값
RW(Read & Write) : 읽고 쓰기가 가능한 값
ZI(Zero Initialize) :  0으로 초기화 되는값

Read Only Section

읽기만 가능한 영역입니다. 여기에 포함되는것은 프로그램이 동작하는동안 내용이 바뀌지 않는 값을 이야기 합니다.
Code는 동작하는동안 바뀌지 않고 값을 Define 한것도 바뀌지 않을꺼고 Const로 선언한것은 바뀌지 않겠네요.기타 Log로 박아놓은 글등등 이 있습니다. 이런것들은 RO Section에 포함되겠네요

Read & Write Section

읽고 쓰기가 가능한 영역입니다. 여기에 포함되는것은 전역변수가 포함되겠네요. 그리고 함수내에서 Static으로 선언한 변수들은 값을 계속 가지고 있어야 하기 때문에 여기포함이 되겠네요. 전역변수나 Static 변수라고 하더라도 초기값이 설정되어 있는경우만 RW영역에 들어갑니다.

Zero Initialize Section

0으로 초기화 되는 영역입니다. 여기에 포함되는것은 전역변수,Static 변수가 포함되는데 초기값이 설정되어 있지 않는경우만 ZI영역에 들어값니다.

이렇게 나눈이유는 간단합니다.
왜냐하면 프로그램 Size를 줄이기 위해서죠. 프로그램의 크기는 그만큼 저장공간이 필요하고 제조원가가 상승하게 됩니다.
공장에서 프로그램을 Flash 메모리에 Write하는데 이 Binary를 ROM Binary라고 합니다. 지금은 Nand Flash로 썼다 지웠다가 가능하지만 옛날에는 OTP(One Time Programable)라는 메모리에 한번 Write를 하면 지울수가 없었습니다. 프로그램이 바뀌면 메모리를 버려야 했죠. 그래서 ROM Binary라고 부릅니다.
ROM Binary에는 RO와 RW Section만 들어가 있고 ZI Section 은 들어가 있지 않습니다. 왜냐하면 ZI는 모든값이 0 이기 때문이죠 대신 ZI의 시작점과 Size 값은 가지고 있어야 합니다.

Booting시 프로그램 코드가 들어 있는 RO를 SDRAM에 올리고 초기값이 있는 RW를 SDRAM에 올린다음 ZI의 시작점에서 ZI의 Size만큼 0으로 채우면 프로그램이 시작할 준비가 됩니다.

그리고 함수내에서 변수로 선언을 하면 이건 Register에 할당이 됩니다. 변수를 더 많이 사용하게 될경우 Stack에 저장되게 됩니다. Stack은 Task가 동작하기 위한 작업공간으로 SDRAM에 할당이 되어 있습니다.
Heap은 보통 배열로 선언을 합니다. malloc 함수가 Heap으로 선언된 배열에 메모리를 할당해서 주소번지를 알려주게 되지요
따라서 Heap도 ZI영역에 포함되겠네요. 그러나 ZI의 경우 초기값이 꼭 0 으로 채워져 있어야 오동작을 막을 수 있습니다.
Heap의 경우 꼭 초기화를 하지 않아도 되기 때문에 ZI에 포함시키긴하지만 Scatterloader에서 별도로 Loading 시키기도 합니다.  왜냐하면 초기값을 0으로 만드는데 시간이 걸리기 때문이죠 빨리 Booting을 시켜야 하는데 꼭 0으로 만들 필요도 없는데 시간 낭비를 하면 안되기 때문이죠.

반응형

'Microprocessor' 카테고리의 다른 글

Static RAM & Dynamic RAM  (0) 2023.05.31
Vector Table & Exception  (0) 2023.05.31
Nand Flash Boot  (0) 2023.05.31
EBI & CS  (0) 2023.05.31
Address Map vs Memory Map  (0) 2023.05.30