Startup Code

 

부팅 과정 중 첫번째에 실행되는 코드, 말그대로 시작할 때 필요한 사항을 적은 코드입니다.

 

main함수가 불리기 전에 실행되죠.

 

파일명이 startup.s 입니다. 파일명.c는 어셈블리어로 프로그래밍된 파일입니다. 

 

C언어가 아니라 어셈블리어로 프로그래밍하는 이유는 C코드로 프로그래밍하기 위해서는

 

스택 메모리 할당이 전제가 되어야하기 때문입니다.

 

스타트업 코드는 보통 다음과 같은 절차를 구성합니다.

 

1. Disable all interrupts

2. Copy any initialized data from ROM to RAM.

3. Zero the uninitialized data area.

4. Allocate space for and initialize the stack.

5. Initialize the processor's stack pointer.

6. Create and initialize the heap.

7. Execute the constructors and initializers for all global variables

8. Enable interrupts.

9. Call main.

 

 

스타트업 코드 깔끔한 설명

 

Startup Code - Programming Embedded Systems in C and C++

If the same symbol is declared in more than one object file, the linker is unable to proceed. It will likely appeal to the programmer — by displaying an error message — and exit. However, if a symbol reference instead remains unresolved after all of the ob

www.e-reading.life

 

임베디드 책 추천

 

Programming Embedded Systems

If you have programming experience and a familiarity with C--the dominant language in embedded systems--Programming Embedded Systems, Second Edition is exactly what you need to get started with embedded software. This software is ubiquitous, hidden away in

books.google.co.kr

 

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

JTAG란?  (0) 2019.12.25
부트로더(Boot loader)란?  (0) 2019.10.28
툴체인(Toolchain)이란?  (0) 2019.10.26
모놀리식 커널(Monolithic kernel), 마이크로 커널(Micro kernel)  (0) 2019.10.26
ELF파일이란? (+HEX파일)  (0) 2019.10.25

https://www.geeksforgeeks.org/encapsulation-in-java/

캡슐화

 

이터와 데이터를 조작하는 연산을 하나로 묶는 것을 의미

 

다른말로 번들링(Bundling)이라고도 합니다.

 

인터페이스 간결, 추상화, 모듈화 향상, 내부 데이터의 보호, 모듈 독립성 향상의 효과가 있습니다.

 

기존에도 C언어에서 구조체나 공용체를 통해서 캡슐화를 시도했지만

 

객체지향 언어가 등장하면서 캡슐화가 완벽하게 지원됩니다.

 

 

추상화란?

 

복잡한 문제를 다루기 위해서 불필요한 부분들을 숨기고 중요한 부분만을 표현하는 것

 

또는 구체적인 사실들을 일반화시켜 기술한 것

 

공용체란?

 

구조체와 같이 여러 자료형을 멤버로 가지고 있지만

 

여러 멤버들이 메모리 공간을 공유하며 사용합니다.

 

가장 사이즈가 큰 멤버의 사이즈로 메모리를 할당하고 모든 멤버들이 해당 메모리 공간을 공유하며 사용합니다.

 

 

정보은닉

 

객체에 대한 구체적인 정보를 노출시키지 않도록하는 기법, 외부에서의 접근을 막는 기법

 

목적은 객체간의 결합도를 약화시켜 교체나 변경이 쉽도록 하는 것입니다.

 

객체지향 언어에서 추구하는 유연성(교체, 변경)을 정보은닉을 통해서 얻을 수 있습니다.

 

public : 외부에서 접근 가능

private : 외부에서 접근 불가

default : 동일 패키지로 묶인 클ㄹ스 내에서만 접근 가능

 

 

정리하자면 캡슐화는 데이터와 함수를 묶어주는 기법이고 정보은닉은 캡슐 속에 있는 데이터와 함수를

 

외부에 노출시키지 않는 기법입니다.

 

 

 

정보은닉, 캡슐화 추천 블로그

 

객체지향의 올바른 이해 : 5. 정보 은닉(information hiding)

우리가 어떻게 해서 유연성을 확보할 수 있었는가? 그것은 추상화(Abstraction)에서부터 시작되었다. 추상화를 통해 우리는 여러 요구사항들 중에서 공통점을 찾고, 이 공통점에서 목표한 것과 관련 없는 것들을..

effectiveprogramming.tistory.com

 

 

Information Hiding

소프트웨어 설계 시에 고려해야 할 기본 원리 중 가장 중요한 원리가 무엇이냐고 물어 본다면 주저 없이 ‘정보 은닉(Information Hiding)’이라고 대답할 것이다. 정보 은닉(또는 정보 은폐라고도 한다)은 1972년 Davis Parnas가 발표한 “On the Criteria To Be Used in Decomposing Systems Into

egloos.zum.com

 

툴체인

 

컴퓨터 프로그램을 제작하기 위해 필요한 개발도구 모음을 뜻합니다.

 

여기에 포함된 개발도구들은 연쇄적으로 사용됩니다.

 

연쇄적이란 어느 한 개발도구의 출력이 다른 개발도구의 입력이 된다는 뜻입니다.

 

간단한 툴체인은 소스 코드 편집을 위한 문서 편집기와 소스 코드를 실행 프로그램으로 변환하는 컴파일러와 링커, 운영체제의 기능을 제공하는 라이브러리로 구성됩니다.

 

여기까지 위키의 설명이었습니다.

 

툴체인은 크로스컴파일러를 보면 많이 나오는 용어입니다.

 

크로스컴파일러(Cross Compiler)

크로스컴파일러란? 컴파일러가 실행되는 플랫폼이 아닌 다른 플랫폼에서 실행 가능한 코드를 생성할 수 있는 컴파일러입니다. ex) 운영체제를 지원하지 않는 마이크로컨트롤러와 같이 컴파일이 실현 불가능한 플..

kkhipp.tistory.com

크로스컴파일러는 호스트 시스템에서 타겟 시스템을 위한 실행 가능한 코드를 생성해주는 컴파일러죠.

 

여기서 툴체인은 타겟 시스템에서 실행할 프로그램 개발을 위한 호스트 시스템의 소프트웨어, 개발환경을 통칭합니다.

 

여기서 프로그램 개발이라 하면 소스 코드를 컴파일하고 링킹하는 등 실행 가능한 파일을 생성하는 과정을 말합니다.

 

툴체인의 기본적인 구성입니다.

Compiler(gcc)

Debugger(gdb)

Library(glibc)

Util(binutils - gcc를 위한 어셈블러(as), 링커(ld), 라이브러리 관련 파일 모음)

 

 

 

 

 arm-linux-gcc 가 대표적인 툴체인 입니다.

https://ko.wikipedia.org/wiki/%EB%AA%A8%EB%86%80%EB%A6%AC%EC%8B%9D_%EC%BB%A4%EB%84%90

 

모놀리식 커널

 

입출력 기능, 네트워크 기능, 장치 지원 등 운영체제의 일반적인 기능을 커널과 동일한 메모리 공간에

적재, 실행하는 기법을 말한다. 단일성 커널이라고도 부른다. (위키)

 

쉽게 말해, 커널이 모든 기능을 포함하고 있는 커널 아키텍처

 

장점은 각 기능 간에 커뮤니케이션이 좋습니다. 그리고 시스템 호출에 의한 서비스가 빠릅니다.

 

단점은 새로운 디바이스를 추가하거나 기능 변경시 커널을 재빌드해야합니다.

 

각 가능 간에 효율성이 좋지만 같은 메모리 상에서 실행되어 한 기능이 문제가 생기면

 

시스템 전체에 영향을 줄 수 있습니다.

 

ex) UNIX, LINUX

 

 

 

마이크로 커널

 

OS를 구성하는 몇개의 요소, 기능을 커널 고간으로부터 떼어내어, 외부 모듈화 하는 등으로 추가하는 기법

 

쉽게 말해, 커널에 핵심적인 기능(스케줄링, 메모리 관리 등)만을 포함하고

 

적용 분야나 시스템에 따라 필요한 기능을 추가하는 방식의 아키텍처

 

예를 들면 위의 그림과 같이 디바이스 드라이버, 파일 시스템이 유저 모드에 들어갑니다.

 

커널의 크기가 작으므로 임베디드 시스템에 사용하기 용이합니다.

 

장점은 리얼 타임성 시스템에 강합니다.

 

ex) MacOS X, Windows NT

 

 

모놀리식 커널이 부품 수나 결선이 적어 경제성이 높으면 동시에 고장이 적어 신뢰성이 높다.

 

그 때문에 널리 사용되는 IC는 대부분 모놀리식이다. (컴퓨터인터넷IT용어대사전)

 

 

 

임베디드 좋은 사이트 추천

 

http://recipes.egloos.com/

 

임베디드 레시피

친절한 임베디드 개발자되기 강좌

recipes.egloos.com

https://selfish-developer.com/category/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B3%B5%EB%B6%80/%EB%A6%AC%EB%88%85%EC%8A%A4

 

'컴퓨터공부/리눅스' 카테고리의 글 목록

쉽고 간단한 단어와 문장으로 개발을 설명해보고자 합니다

selfish-developer.com

 

ELF(Executable and Linkable Format)

 

https://ko.wikipedia.org/wiki/ELF_%ED%8C%8C%EC%9D%BC_%ED%98%95%EC%8B%9D

리눅스, 유닉스 시스템의 표준 바이너리 파일 형식, 오브젝트 파일 형식(파일명.o)

 

윈도우 시스템에서는 PE파일 형식이 ELF파일 형식입니다.

 

결국에 링커를 거쳐서 나온 실행파일로 보시면 됩니다.

 

ELF파일은 ELF헤더와 파일 데이터로 이루어집니다.

 

HEX파일(intel)은 ELF로부터 생성되는 플래쉬 메모리에 다운로드되는 16진수로 인코딩된 파일입니다.

 

마이크로프로세서용의 오브젝트파일을 ASCII포맷의 파일로 인코딩한 파일이죠.

 

포럼을 보면

 

source -> compile -> ELF -> link -> hex -> Flash programmer -> Targer board

 

라고 설명도 해놨더라고요.

 

위에 내용으론 Link 다음이 ELF가 맞는건데 아직 뭐가 정답인줄 모르겠네요

 

HEX파일은 많이 다뤄봤는데 ELF는 이제 막 알게되어서 더 접해보고

 

아무튼 추후에 업데이트하겠습니다.

 

  

 

 

 

 

 

페이지(page), 페이징(paging)

 

가상 메모리는 페이지라는 고정 크기의 블록으로 나누어지고

 

물리 메모리는 프레임이라는 고정 크기의 블록으로 나누어입니다.

 

즉, 고정적인 데이터이며 시스템에 의해서 할당받는 메모리입니다. (물리적 내용의 단위)

 

페이징은 페이지로 가상 메모리를 분할하여 메모리를 할당하고 주소변환을 하는 기법입니다.

 

 

 

세그먼트(segment), 세그멘테이션(segmentation)

 

페이지 같은 개념이지만 같은 크기가 아니라 서로 다른 크기의 블록으로 나누는 개념입니다. (논리적 내용의 단위)

 

가변적인 데이터이며 사용자의 필요에 의한 메모리입니다. (malloc, calloc ... )

 

세그멘테이션은 가상 메모리를 세그먼트로 분할하여 메모리를 할당하고 주소변환을 하는 기법입니다.

 

세그먼트는 논리적 단위여서 중요도에 따라서 나눌 수 도 있고, 용도에 따라서 나눌 수 있어 보호와 공유에 용이합니다.

 

페이지와 다르게 미리 메모리를 분할해둘 수 없고(크기가 가변적) 사용자 관점의 가상 메모리 관리 기법입니다.

 

내부 단편화는 발생하지 않지만 외부 단편화 발생 가능성이 있습니다. (분할된 크기보다 프로그램의 크기가 더 큰 경우 )

 

이를 해결하기 위해 세그먼트를 다시 페이징하는 방법이 있습니다.

 

 

세그먼트 테이블, 페이지 테이블은 사용자가 정의한 주소를 실제 주소로 맵핑하는 정보

 

세마포어와 뮤텍스는 상호배제 기법입니다.

 

세마포어(Semaphore)

 

https://adithyaravik.wordpress.com/2015/03/31/semaphore-vs-mutex-vs-monitor/

멀티프로그래밍 환경에서 공유 자원에 대한 접근을 제한하는 방법으로 사용합니다.

 

세마포어 S는 정수값을 가지는 변수(Counter 라고도 표현)이며 P와 V라는 명령에 의해서만 접근할 수 있습니다.

 

S는 공유 자원에 접근할 수 있는 프로세스의 개수를 나타내는 변수로 볼 수 있습니다.

 

P는 임계구역에 들어가기 전에 수행되고 V는 임계구역에서 나올 때 수행됩니다..

 

P는 wait() 함수와 매칭되고 V는 signal() 함수와 매칭됩니다.

 

이해하기 쉽게 예를 들어보겠습니다. 회사에 프린터가 2개가 있다고 가정합시다. (S가 2인 상태입니다.)

 

여기서 1명이 프린터를 사용하면 S가 1로 변하고 또 1명의 사람이 프린터를 사용하면 S가 0이 됩니다.

 

그리고 추가로 1명이 사용을 하려면 S가 0이기 때문에 기다려야 합니다.

 

사용중인 1명이 사용이 끝나면 S가 1로 바뀌어서 사용이 가능해지죠. 

 

세마포어는 뮤텍스와 다르게 소유 개념이 없습니다.

 

교착상태에 대한 고전적인 해법이며 모든 교착상태를 해결해주진 못합니다.

 

임계영역(Critical Section)

 

공유자원에 접근하는 프로세스 내부의 코드영역으로

 

서로 다른 두 프로세스 혹은 스레드가 같이 접근해서는 안 되는 공유 영역입니다.

 

상호 배제

 

한 프로세스가 공유자원을 접근하는 임계영역 코드를 수행하고 있으면

 

다른 프로세스들은 공유 자원을 접근하는 임계영역 코드를 수행할 수 없다는 조건,

 

상호배제 방법에는 세마포어, 뮤텍스, 모니터 등이 있다.

 

 

뮤텍스(Mutex)

 

https://adithyaravik.wordpress.com/2015/03/31/semaphore-vs-mutex-vs-monitor/

세마포어가 공유자원의 여러 프로세스의 접근을 막는다면 뮤텍스는 쓰레드의 접근을 막습니다.

 

그리고 뮤텍스는 2개 이상의 쓰레드 접근을 막습니다.

 

임계영역 안에 1개의 스레드가 이미 작업 중(Lock)이면 다른 스레드는 간섭할 수 없습니다.

 

일종의 Binary Semaphore라고 볼수 있습니다.

 

일종의 Locking 매커니즘입니다.

 

위의 프린터 예제로 보면 뮤텍스의 경우 프린터가 1개인 경우죠.

 

여기서 세마포어는 뮤텍스가 될 수 있지만 뮤텍스는 세마포어가 될 수 없습니다.

 

 

세마포어와 뮤텍스을 설명하는 글을 보면

 

세마포어와 뮤텍스 모두 프로세스 혹은 스레드의 접근을 제어한다고 나와있는 경우도 있고

 

세마포어는 프로세스, 뮤텍스는 스레드와 연관이 있는 것처럼 설명해놓은 글이 많습니다.

 

무엇이 정확한 표현인지는 모르겠습니다.

 

 

프로세스와 스레드

 

프로세스 : 실행되고 있는 프로그램, 운영체제로부터 시스템 자원을 할당받는 작업의 단위

 

스레드 : 프로세스 내에서 실행되는 여러 흐름의 단위

 

멀티 프로세스 : 문맥 교환 중 오버헤드 발생

 

멀티 스레드 : 프로세스를 생성하여 자원을 할당하는 시스템콜이 줄어들어 자원을 효율적으로 관리 가능

 

동기화 문제, 설계하기가 까다로운 단점이 있습니다.

 

 

 

 

 

아무튼 뮤텍스와 세마포어를 정리하자면

 

둘다 공유자원에 대한 프로세스 혹은 스레드의 접근을 제어하는 것이고

 

차이점은 세마포어는 여러개의 프로세스가 사용이 가능하고, 뮤텍스는 오로지 1개의 스레드만 사용이 가능하다는 점! 

작업 집합, 작업 세트, 작업 셋 (Working Set)

 

실행중인 프로세스가 자주 참조하는 페이지들의 집합입니다.

 

Working Set는 스레싱을 예방하기 위해 존재합니다.

 

스레싱(Thrashing)이란?

https://www.studytonight.com/operating-system/virtual-memory

다중 프로그래밍 정도가 높아지면서(동시 실행 프로세스 수 증가) 메모리에 페이지 폴트가 많이 일어나

 

프로그램 수행보다 페이지 교환이 더 많이 일어나는 현상

 

결국 성능의 저하를 초래합니다. 악순환 같은 느낌입니다.

 

시스템 콜, 시스템 호출

https://www.linuxbnb.net/home/adding-a-system-call-to-linux-arm-architecture/

Shell(User mode) -> Kernel(Kernel mode)

 

사용자 모드에 있는 응용프로그램이 커널의 기능을 사용하게 하는 인터페이스입니다.

 

여기서 커널의 기능이란 다음과 같습니다.

 

프로세스 관리(fork, signal, load, wait time)

파일시스템 관리(open, read, write, close)

메모리 관리(alloc, kmalloc, kfree)

통신 관리(socket, bind)

주변장치 관리(request devices, attach, detach) 등등..

입출력 제어 방식은 크게 4가지가 있습니다.

 

1. 프로그램에 의한 I/O (CPU 개입 O)

2. 인터럽트에 의한 I/O (CPU 개입 O)

3. DMA에 의한 I/O      (CPU 개입 X)

4. 채널에 의한 I/O      (CPU 개입 X)

 

이제 DMA에 대해서 알아보겠습니다.

 

DMA(Direct Memory Access) 직접 메모리 접근

 

DMA는 주변장치(하드디스크, 그래픽 카드 등)들이 메모리에 직접 접근하여 읽거나 쓸 수 있도록 하는 기능입니다. 

 

중요한 건 CPU의 개입 없이 I/O 장치와 기억장치 사이의 데이터를 전송하는 접근 방식이라는 거죠.

 

PIO(Programmed Input/Output)은 CPU가 주변장치와 데이터를 주고받는 방식으로 효율이 떨어지는 방식입니다.

 

이를 극복하기 위해 DMA가 개발되었습니다.(IBM)

https://www.quora.com/What-is-the-function-of-DMA-in-a-computer

CPU 개입 없이라는 부분이 중요한 포인트입니다.

 

다른 관점으로 보면 CPU가 해야할 주변장치와의 데이터 전송을 DMA장치가 해주는 것이죠.

 

그만큼의 CPU 효율을 늘릴 수 있습니다.

 

고속의 I/O 장치의 경우 빈번한 인터럽트가 발생하는데 DMA를 사용함으로써

 

프로그램 수행 중 인터럽트의 발생 횟수를 최소화합니다.

 

DMA가 없다면 Data I/O 처리가 끝날 때까지 CPU는 대기해야 합니다.

 

 

동작 절차 : CPU 명령 - 버스 사용 요구(Bus Request) - 버스 사용 허가(Bus Grant) - 데이터 전송 - 인터럽트

 

동작모드 

 

1. 사이클 스틸링 : CPU가 DMA에 우선순위를 양보, 1 Cycle 정지, 빠른 입출력 가능, 한 번에 한 워드 전송

 

사이클 스틸링은 인터럽트와 많이 비교됨, 인터럽트는 1Cycle이 아니라 처리 기간 동안 정지

 

사이클 스틸링은 프로그램 상태 보존 필요 X, 반면에 인터럽트는 필요함

 

2. 버스트 모드 : DMA가 버스 사용권 획득 시 데이터 전송 완료까지 버스 사이클 독점, 블록 단위 데이터 전송

 

 

 

채널 제어 방식 - 여러 장치가 채널 제어기에 입출력 명령을 전달하여 CPU 개입 없이 입출력을 수행합니다.

 

DMA와 다르게 한 개의 명령에 여러 블럭 입출력 가능합니다.

 

DMA - PC, 채널 제어 - 대형서버

 

 

 

 

 

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

Working Set 이란? (+스레싱)  (0) 2019.10.21
시스템 콜(System Call)이란?  (0) 2019.10.21
MMU란?(+TLB)  (0) 2019.10.20
CISC, RISC  (0) 2019.10.20
반가산기, 전가산기, 반감산기, 전감산기  (0) 2019.10.20

+ Recent posts