Developer Document

Embedded Software 개발을 하면서 습득한 내용을 적은 시니어 개발자들의 글

코 독 코 독 CoderDocument

Embedded SW 기초

메모리 구조

뜨요르 2024. 6. 10. 21:36

저번 글에서는 임베디드 리눅스 부팅 절차에 대해서 얘기해 봤다.

커널이 실행되면 컴퓨터는 여러 프로그램들을 실행한다 이때 각각의 실행 파일은 4G의 가상 메모리 공간에 로드되는데 그렇다면 메모리란 무엇일까? 이번엔 메모리에 대해서 얘기해 보고자 한다.

 

  • 메모리란?
    메모리 라는 말은 기억장치라는 뜻을 가지고 있다. 우리가 원하는 작업을 처리하기 위해서는 처리 대상의 내용 또는 처리 결과를 잠시 기억하고 있어야 할 필요성이 생기는데, 이때 사용되는 것이 메모리이다.

메모리의 종류

메모리와 저장소의 차이는 휘발성인지, 비휘발성인지의 차이가 있다.

그래서 보통 전원이 켜져 있을 때만 단기적으로 저장되는 RAM(Random Access Memory)은 메모리라고 하고 RAM의 종류는 정적 메모리인 SRAM과 동적 메모리인 DRAM이 있다.  전원이 꺼져도 데이터가 남아있는 ROM(Read Only Memory)은 저장소라고 한다. 롬에는 플래시 메모리가 있으며, 플래시 메모리는 크게 nor형과 nand형으로 나뉜다.

구분 NOR 플래시 NAND 플래시
단위 셀 단위 블록 단위
읽기 : 빠름
쓰기 및 지우기 : 느림
읽기 : 느림
쓰기 및 지우기 : 빠름
안전성 높음 낮음
저장용량 작음
용도 속도가 중요할 때 (ex 프로그램 코드) 면적이 중요할 때 (ex USB, SSD등 저장매체)

 

리눅스 기준 메모리 영역

프로그램이 실행이 되면 4G의 가상 메모리가 생기게 된다 이를 프로세스(Process)라고 한다.

프로세스의 메모리를 살펴보면 왼쪽 이미지와 같다. 

  • PC(Program Counter)란?

다음에 실행할 명령어의 주소를 보유하고 있어 실행할 기계어 코드의 위치를 지정해 준다.

  • Register란?

특정한 목적에 사용되는 일시적인 기억장치로 CPU가 직접 접근하는 메모리이다.

 

  • Text 영역(Code 영역)

우리가 작성한 코드가 컴파일된 후 기계어로 저장되어 있는 곳이다.

오직 읽기 전용이며 프로그램이 끝날 때까지 메모리에 남아있다.

  • Rodata 영역

Read Only Data로 읽기 전용인 데이터들이 들어간다.

주로 상수, 상수형 문자열, printf의 중괄호 부분이 들어간다.

  • Data 영역과 Bss 영역

Data영역과 Bss영역은 매우 비슷한데 둘 다 전역변수 (전역 배열, 전역 구조체) 등과 정적 변수(Static)를 저장한다.

Bss영역은 초기화하기 전의 전역 변수를 저장하고 Data영역은 초기화한 전역변수를 저장한다.

Bss영역에 있던 전역변수는 main이 실행되기 전에 전부 0으로 초기화되어 Data 영역으로 들어간다.

 

stack Push, Pop 그리고 LIFO

  • Stack 영역

지역변수와 매개 변수가 저장된다. 지역변수와 매개변수의 규칙과 같이, 함수가 선언되면 할당되고, 끝나면 해제된다. 할당과 해제를 계속 반복하기 때문에 사이즈가 변한다. 스택은 LIFO(Last In First Out) 구조로 나중에 들어오는 데이터가 먼저 나가는 구조로 되어있다.

  • Heap 영역

동적으로 할당할 때 사용되는 영역이다. C언어 기준 malloc과 free가 이에 해당하며 C++기준 new delete가 이에 해당한다.

 메모리의 낮은 주소에서 높은 주소로 할당되며, 동적할당에서 나오듯이 직접 할당, 해제해야 한다. 그림에서 보듯 사실상 스택과 같은 영역을 공유하기 때문에 스택과 힙이 겹치는 경우 마지막에 할당한 것에 이름을 따서 Stack Overflow, Heap Overflow가 발생한다.

폰노이만 구조

이렇게 PC (Program Counter)에서 실행하는 위치를 지정하면 폰 노이만 구조에 의해 CPU는 메모리에 저장된 명령어를 가져와 Register에 저장 후 해당 프로세스를 처리하게 된다.

 

위에서 프로세스의 메모리에 대해 살펴보았다.

프로세스는 프로세스간에 메모리를 공유하지 않는다. 그럼 메모리는 공유할 땐 어떻게 사용할까??

바로 커널에 shard memory를 이용하거나 RPC(Remote Procedure Call)을 이용해 통신을 시도한다.

'Embedded SW 기초' 카테고리의 다른 글

Peripheral과의 통신 - 1. GPIO  (0) 2024.06.11
리눅스 커널& 디바이스 드라이버  (0) 2024.06.11
임베디드 리눅스 부팅 절차  (0) 2024.06.10
Yocto 기초  (0) 2024.06.09
SHELL script  (0) 2024.06.03