MMU(Memory Management Unit)

 

가상 메모리와 실제 메모리 사이에서 주소 변환 역할을 합니다.

 

CPU가 메모리에 접근하는 것을 관리하는 컴퓨터 하드웨어 부품이죠.

 

MMU는 가상 메모리와 실제 메모리 주소 사이의 변환을 위해

 

TLB(Translation Lookaside Buffer)라는 고속의 보조기억장치를 참조합니다.

위키백과

여기서 만약 TLB에 원하는 변환 정보가 없다면 TLB ->Page Table -> Disk 순으로 접근합니다. 

 

 

 

 

 

 

'전자공학 > 임베디드' 카테고리의 다른 글

시스템 콜(System Call)이란?  (0) 2019.10.21
DMA(Direct Memory Access)란? (+PIO, 채널제어방식)  (2) 2019.10.20
CISC, RISC  (0) 2019.10.20
반가산기, 전가산기, 반감산기, 전감산기  (0) 2019.10.20
MCU, MPU, CPU  (0) 2019.10.20

마이크로프로세서의 구성요소는 명령세트, 레지스터, 메모리 등이 있습니다.

 

여기서 명령세트는 CISC, RISC로 구분됩니다.

CISC(Complex Instruction Set Computer)란?

 

모든 고급언어 문장에 기계 명령어가 대응되게 한 컴퓨터입니다.

 

즉, 하드웨어화 할 수 있는 것은 모두 하드웨어에게 맡긴다고 볼 수 있습니다..

 

그리고 특징이 명령어의 길이가 가변적입니다.

 

명령어가 복잡하여 해석(디코딩) 시간이 오래걸리며, 해석하는 회로가 복잡합니다.

 

가격이 비싸고 발열이 많고 전력소모가 많습니다.

 

메모리 사용이 효율적이라는 장점이 있습니다.

 

주로 볼 수 있는 컴퓨터가 CISC방식이며 인텔, 모토롤라, AMD가 대표적인 예입니다.

 

 

RSIC(Reduced Instruction Set Computer)란?

 

CISC의 많은 명령어 중 주로 쓰이는 몇가지만 추려서 하드웨어로 구현한 것입니다.

 

실행 속도를 높히기 위해 가능한 복합한 처리는 소프트웨어에게 맡기는 컴퓨터죠.

 

각 명령어가 한 클럭에 실행되도록 고정되어서 파이프라인 성능에 최적화 되어있습니다.

 

명령 길이가 고정되어 있어서 코드 효율이 낮습니다.

 

실행하는데에 상대적으로 많은 명령어가 필요합니다.

 

속도가 빠르다는 장점이 있습니다.

 

저장공간을 많이 차지한다는 단점이 있습니다.

 

워크스테이션, 대형서버가 주로 RISC 방식이며 ARM이 대표적인 예입니다.

반가산기 : 1비트의 두 입력과 출력으로 합과 자리올림을 계산하는 논리회로

전가산기 : 2진수 A와 B 그리고 하위비트의 자리올림을 포함하여

 

2진수 입력 3개를 덧셈 연산하는 논리회로

반감산기 : 2진수 1자리의 두 개의 비트를 빼는 회로

전감산기 : 아랫자리에서 요구하는 빌림 수 에 대한 감산까지 계산

 

'전자공학 > 임베디드' 카테고리의 다른 글

MMU란?(+TLB)  (0) 2019.10.20
CISC, RISC  (0) 2019.10.20
MCU, MPU, CPU  (0) 2019.10.20
PCB(Process Control Block) + 문맥교환  (0) 2019.10.20
크로스컴파일러(Cross Compiler)  (0) 2019.10.19

MCU, MPU, CPU 다 비슷해 보여서 정리를 해보려고 합니다.

 

MCU(Micro Controller Unit) 

집적 회로 안에 프로세서, 메모리, 입출력 버스 등의 컴퓨팅 요소를 내장한 초소형 컨트롤러

 

단일 또는 다중의 CPU와 타이머, PWM, I/O, 통신 등의 주변장치까지 포함하여 부르는 용어입니다.

 

하나의 작은 컴퓨터라고 생각하면 됩니다.

 

 

CPU(Central Processing Unit)

컴퓨터에서 구성단위 중 기억, 해석, 연산, 제어라는 4대 기능을 종합하는 장치

 

컴퓨터의 뇌라고 생각하면 됩니다.

 

제어장치(Control Unit), 연산장치(ALU), 레지스터(Resister) 이렇게 세 부분으로 구성됩니다.

 

 

MPU(Micro Processor Unit)

CPU를 단일 IC 칩에 집적시켜 만든 소자

 

주변장치가 없다면 동작이 불가능합니다.

 

 

 

일반적으로 CPU와 MPU는 거의 같은 의미로 사용되며

 

CPU는 컴퓨터에서 사용되는 용어고 MPU는 임베디드에서 사용됩니다.

 

 

 

https://www.geeksforgeeks.org/process-table-and-process-control-block-pcb/

PCB(Process Control Block)란?

 

프로세스 제어 블록

 

운영체제가 프로세스를 제어하기 위해 정보를 저장해 놓는 곳, 프로세스의 상태 정보를 저장하는 구조체입니다.

 

프로세스 상태관리와 문맥 교환을 위해 필요합니다.

 

PCB는 프로세스의 중요한 정보를 포함하기 때문에 일반 사용자가 접근 못하도록 보호된 메모리 영역 안에 있습니다.

 

프로세스 : 실행되고 있는 프로그램(주 기억장치에 올라가있는 프로그램), 모든 프로세스는 고유 PCB를 가집니다.

 

 

 

문맥교환이란?

 

하나의 프로세스가 CPU를 사용중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해

 

이전의 프로세스의 상태를 PCB에 보관하고 또 다른 프로세스의 정보를 PCB에서 읽어 레지스터에 적재하는 과정입니다.

 

문맥교환 중에는 다른 작업을 할 수 없기 때문에 이 시간을 오버헤드라고 봅니다.

 

이러한 문맥교환은 인터럽트 때 발생합니다.

크로스컴파일러란?

 

http://voidpointer.maltion.com/cross-compiler-toolchain-build/

컴파일러가 실행되는 플랫폼이 아닌 다른 플랫폼에서 실행 가능한 코드를 생성할 수 있는 컴파일러입니다.

 

ex) 운영체제를 지원하지 않는 마이크로컨트롤러와 같이 컴파일이 실현 불가능한 플랫폼에 컴파일하는데 사용

 

임베디드 시스템 개발을 하기 위해서는 반드시 크로스 컴파일러가 필요하죠.

 

C코드를 MCU에 맞게 컴파일을 해서 바이너리 파일로 만들어줍니다.

 

그렇다면 네이티브(Native) 컴파일러(호스트용 C 컴파일러)와 크로스 컴파일러의 차이는 무엇일까요?

 

우선 네이티브 컴파일러는 컴파일을 하고 나면 프로그램 실행 결과를 바로 확인할 수 있습니다.

 

프로그램이 실행되는 호스트 PC의 MCU에 맞게 실행 바이너리가 만들어지기 때문이죠.

 

크로스 컴파일러는 프로그램이 실행되는 MCU에 맞게 실행 바이너리가 만들어지기 때문에 다릅니다.

 

그리고 Startup파일도 필요합니다. 이 스타트업에 관해서 추후에 포스팅을 또 하겠습니다.

 

이러한 크로스 컴파일러는 아무래도 MCU 제작 업체에서 주로 잘 만드는 편입니다.

 

따라서 개발자는 비용이 들어가지만 MCU를 최적으로 사용하기 위해 비용을 주고 크로스 컴파일러를 구매하죠.

 

 

 

또한 리눅스에 gcc라는 좋은 컴파일러가 있습니다.

 

툴체인을 통해 원하는 프로세스의 크로스 컴파일을 합니다. ex) arm-linux-gcc

 

툴체인에 대해서도 추후에 포스팅을 하겠습니다.

 

 

 

 

 

 

 

 

http://recipes.egloos.com/5312701

 

임베디드 개발자를 위한 강좌가 있는 블로그

캐시메모리란?

https://www.xtremegaminerd.com/types-of-cache-memory/

속도가 빠른 장치(CPU)와 느린 장치(메모리) 사이에서 속도차이에 따른 병목현상을 줄이기 위한 범용 메모리입니다.

 

병목현상 : 어떤 시스템 내 데이터의 집중적인 사용으로 인해, 전체 시스템에 절대적 영향을 미치는 부분의

사용 빈도가 늘어나 그 부분의 성능이 저하되어 전체 시스템이 마비되는 현상을 의미

 

입출력 데이터를 버퍼링하여 Memory 접근 없이 빠른 입출력 제공합니다.

 

최근에 사용된 데이터나 자주 사용되는 데이터를 임시로 저장해두죠.

 

캐시메모리는 빠르지만 용량이 적고 비싸다는 단점이 있습니다.

 

대부분의 프로그램은 한번 사용한 데이터를 다시 사용할 가능성이 높고

 

그 주변의 데이터도 곧 사용될 가능성이 높은 데이터 지역성을 가지고 있습니다. 

 

1. 공간적 지역성 : CPU가 요청한 주소 지점에 인접한 데이터들이 앞으로 참조될 가능성이 높은 현상

2. 시간적 지역성 : 최근 사용된 데이터, 변수가 재사용될 가능성이 높은 현상

3. 순차적 지역성 : 데이터가 기억장치에 저장된 순서대로 순차적으로 인출 되고 실행될 가능성이 높은 현상

 

캐쉬를 보다보면 L1, L2 용어가 나옵니다.

 

L1에는 I-Cache(Instruction Cache)와 D-Cache(Data Cache)가 따로 있고 L2에는 구분없이 하나의 캐시로 구성됩니다.

 

보통 CPU에서 L1부터 빠르게 접근하며 속도가 빠릅니다.

 

L1에 찾고자하는 데이터가 없으면 L2에 접근하여 데이터를 찾습니다.

 

속도는 L1>L2>RAM입니다.

 

L3는 있는 경우도 있고 없는 경우도 있습니다.

 

여기서 보통 명령어(Instruction)는 공간 지역성이 높고 데이터는 시간 지역성이 높습니다.

 

CPU가 캐시에서 데이터를 찾는데 데이터가 없다면 이를 캐시 미스라고 합니다.

 

1. Compulsory miss  : 해당 메모리 주소를 처음 부르는 경우

2. Conflict miss : 서로 다른 데이터가 같은 캐시 메모리 주소에 할당되는 경우

3. Capacity miss : 캐시 메모리에 공간이 부족해서 나는 경우

 

적중률(Hit Ratio) : 얼마나 캐시를 통해서 데이터를 잘 찾았는지의 정도 

 

 

 

버퍼메모리란(Buffer)?

 

버퍼메모리도 캐시메모리랑 비슷한 역할을 합니다. 두 장치간의 속도 차이를 극복하기 위해 사용하죠. 

 

간단히 말하면 일시적인 데이터 저장소로 이용하는 기억 장치입니다.

 

 

흠 표현하자면 캐시는 작업속도를 빠르게 해주고

 

버퍼는 빠른 쪽에서 데이터가 느린 쪽으로 갈 때 데이터 손실이 나지 않게 합니다.

 

캐시는 CPU가 놀고있는 시간을 줄이고 버퍼는 주변기기가 놀고있는 시간을 줄입니다.

 

그리고 버퍼는 순차적으로 데이터를 접근하고 캐시는 데이터에 직접적으로 접근할 수 있습니다.

 

이번에는 헷갈리는 용어들을 정리해보겠습니다.

 

PC(Program Counter) 프로그램 카운터

 

PC는 인터럽트를 다룰 때 나오는 용어입니다.

 

프로그램 실행 중 인터럽트 요청 신호가 들어오면 프로그램이 중단되고

 

인터럽트 서비스 루틴을 처리하고 프로그램으로 돌아옵니다.

 

여기서 진행 중이던 프로그램으로 복귀하기 위한 주소를 담는 것이 프로그램 카운터입니다.

 

IP(Instruction Pointer)

 

IP는 PC와 같은 용어입니다.

 

인텔 계열에서는 프로그램 카운터를 IP로 부릅니다.

 

SR(Status Register) 상태 레지스터 SREG

 

명령의 실행 결과가 반영되는 플래그들이 모여있는 레지스터입니다.

 

C(carry flag), Z(zero flag), N(negative flag) 등등

 

출처 : 위키백과

 

SP(Stack Pointer) 스택포인터

 

스택은 후입선출(LIFO)의 특성을 가진 자료구조입니다. 큐와 비교되는 자료구조이죠.

 

스택은 레지스터의 데이터를 임시로 저장하기에 적합합니다.

 

이때 데이터들이 쌓일 때 마지막 위치를 가리키는 것이 스택포인터입니다.

 

 

 

 

이전 포스팅에서 폴링과 인터럽트를 시그널을 기준으로 설명했는데

 

자료를 찾다 보니 인터럽트의 우선순위를 판단함에 있어서 폴링과 데이지체인 기법을 

 

설명하는 자료도 많네요.

 

관점에 따라서 폴링을 인터럽트랑 비교할 수도 있고

 

인터럽트의 우선순위를 판단하는 기법중 하나로 볼 수도 있는 거 같습니다.

 

그러면 본격적으로 폴링과 데이지체인을 설명해보겠습니다.

 

먼저 인터럽트 우선순위를 다루는 이유는

 

인터럽트가 2개 이상 발생하였을 때 먼저 처리할 인터럽트를 정하기 위함입니다.

 

인터럽트 우선 순위


1. 전원 공급 이상

2. CPU의 기계적인 오류

3. 외부 신호에 의한 인터럽트

4. 입출력 전송 요청 및 전송 완료, 전송 오류

5. 명령어 오류
6. 프로그램 검사

7. 슈퍼바이저 호출(SVC)

 

여기서 위의 우선순위들을 판별하는데에 폴링과 데이지체인 기법이 있습니다.

 

폴링(Polling)

 

소프트웨어적으로 인터럽트 우선순위를 판별하는 방법입니다.

 

장점으로는 우선순위 변경이 용이하고 회로가 간단하고 융통성이 있다.

 

인터럽트가 많은 경우 반응시간이 느리다는 단점이 있다.

 

 

벡터 인터럽트(Vector Interrupt)

 

하드웨어적으로 인터럽트 우선순위를 판별하는 방법입니다.

 

별도의 프로그램 루틴이 없기 때문에 응답 속도가 빠르다.

 

회로가 복잡하고 융통성이 없다. 추가 하드웨어가 필요하므로 비경제적이다.

 

직렬과 병렬 우선순위 부여 방식이 있다.

 

데이지 체인(Daisy Chain)

 

하드웨어적으로 인터럽트 우선순위를 판별하는 방법으로 직렬 우선순위 부여 방식이다.

 

인터럽트가 발생하는 모든 장치를 한개의 회선에 직렬로 연결하며

 

우선순위가 높은 장치를 맨 앞에 위치시키며 우선 순위에 따라 연결한다.

 

 

 

병렬 우선순위 부여 방식은 각 장치마다 별개의 회선으로 연결한다.

 

인터럽트 요청을 제어하기 위해 Mask Register를 사용한다.

 

 

폴링과 인터럽트는 프로세서(CPU)와 입출력 장치 사이의 통신입니다.

 

폴링(Polling)이란?

 

특정 주기마다 스레드를 돌면서 시그널이 들어왔는지 확인하는 방식입니다.

 

소프트웨어적으로 시그널을 확인하는 것이죠.

 

예를 들면 While문에 250ms flag 가 Set 되었을 때 If문을 통해 특정 시그널이 Set 되었는지 확인하는 것이죠.

 

이렇게 특정 주기마다 계속 확인해야 하기 때문에 시스템의 리소스를 많이 먹는다는 단점이 있습니다.

 

또한 특정 주기마다 확인하기 때문에 정확한 타이밍에 시그널이 들어왔는지 확인하는 것은 불가하고

 

주기에 따른 오차가 있습니다.

 

장점으로는 구현이 쉽다는 점, 우선순위 변경이 용이하다는 점이 있습니다, 

 

 

 

인터럽트(Interrupt)란?

 

외부의 인터럽트 핀에 신호가 들어오면 즉시 인터럽트 소스를 실행하고 다시 원래의 코드로 돌아오는 방식입니다.

 

하드웨어적으로 시그널을 확인하는 것이죠.

 

커널의 Interrupt Handler가 Interrupt를 확인하고 Interrupt가 발생했다면 Interrupt Thread로 발생을 알려줍니다.

 

Polling보다 구현이 복잡하다는 단점이 있습니다.

 

하지만 시그널이 들어온 정확한 타이밍을 알 수 있고, 즉 반응 시간이 빠릅니다.

 

Interrupt 발생시에만 처리를 하기 때문에 시스템 부하가 적습니다.

 

인터럽트의 시퀀스는 다음과 같습니다.

 

프로그램 실행 -> 인터럽트 요청 -> 프로그램 중단(수행중인 명령을 완료하고 PC, SR 저장)

-> 인터럽트 서비스 루틴 처리(인터럽트 벡터를 통하여 주소 접근) -> 프로그램 재시작(프로그램 카운터를 통하여 접근)

 

 

 

 

예를 들어 설명하자면

 

스위치가 눌렸을 때 LED를 켜주려면

 

폴링은 Loop 내부에서 일정 시간 간격으로 if문을 통해 스위치가 눌렸는지 확인하고 LED를 켜줍니다.

 

인터럽트는 스위치가 눌리면 인터럽트가 발생하여 LED를 켜줍니다.

 

 

 

+ Recent posts