컴퓨터 시스템과 임베디드 시스템 개념

Posted by ironmask84
2017. 9. 25. 23:56 나는 프로그래머다!/기초 다지기




임베디드 시스템?

전자제품을 동작시키는 SW와 HW를 통틀어 임베디드 시스템이라고 합니다.

전자제품이란 여러분이 잘 아시는 것처럼, 

전기밥솥, 세탁기, 냉장고 와 같은 가전에서부터 휴대폰, 자동차, 비행기 등 

첨단 전자제품 까지 20세기부터 매우 빠르게 발전해오고 있습니다.

최근엔 아두이노, 라즈베리파이와 같이 간단하게 임베디드 시스템을 

Study 할 수 있는 HW가 보급화되고 있습니다.

저 또한, 요즘 4차산업혁명에 핵심 키워드 중 하나인 IoT관련 부서에서 

업무를 맡게되어 많은 관심을 가지고 있고, 

라즈베리파이 개인 Study도 해보려고 하고 있습니다. 

http://ironmask.net/349


컴퓨터 시스템?

컴퓨터 시스템이라고 하면, 말 그대로 컴퓨터를 이용한 시스템입니다.

일반적으로 기업이나 관공서에서 관리하는 전산실 서버에서부터

기상청과 같이 특수하게 대량의 데이터 분석이 필요한 경우 등 다양하게 구성될 수 있습니다.

그리고 임베디드 시스템 또한, 컴퓨터 시스템 중에 하나입니다.

임베디드 기준으로 컴퓨터 시스템에 포함되는 개념들은 이렇습니다.

* HW

-MicroProcessor (요즘 CPU)

A microprocessor is a computer processor that incorporates the functions of a computer's central processing unit (CPU) on a single integrated circuit (IC),[1] or at most a few integrated circuits.[2] The microprocessor is a multipurpose, programmable device that accepts digital data as input, processes it according to instructions stored in its memory, and provides results as output. Microprocessors contain both combinational logic and sequential digital logic. Microprocessors operate on numbers and symbols represented in the binary numeral system.

ex)STM32, atmega128


좀 더 상세한 내용은 아래를 참조 해주세요.

마이크로프로세서

- 작은 실리콘 칩 위에 트랜지스터를 수천 만 개 집적한 소자

- 마이크로는 매우 작은 크기, 프로세서는 처리기 혹은 CPU를 뜻하므로 마이크로프로세서는 “매우 작은 처리기”를 의미

- 인텔에서 intel 4004라는 최초의 마이크로프로세서 개발(1971년)

 

마이크로프로세서의 2가지 형태

CPU형 마이크로프로세서

- CPU 기능 대부분을 칩 하나에 집적하고, CPU형 마이크로프로세서를 중심으로 ROM, RAM, 입출력장치 등을 추가하여

마이크로컴퓨터를 구성할 수 있다.

단일 칩 마이크로컴퓨터

- 마이크로컴퓨터에 들어가는 모든 부품들을 하나의 반도체 칩에 집적한 것

연산용과 제어용으로 분류하며, 제어용 단일 칩 마이크로컴퓨터를 마이크로 컨트롤러 라고 하고 8051,AVR, PIC 등이 있다.

마이크로프로세서의 분류

​메모리 구성 에 따라

폰 노이만 구조

- 데이터 영역과 프로그램 영역의 물리적인 구분이 없고 버스 크기도 동일

- 데이터와 프로그램 코드를 동일하게 취급하므로 데이터도 프로그램 코드에 함께 들어감

ex) 일반 데스크톱 PC​

하버드 구조

- 프로그램 버스와 데이터 버스가 별도로 있는 것이 특징이며 동시에 액세스가 가능한 방식. 데이터 메모리가 레지스터 파일 형태로 통합 관리

- 레지스터와 메모리간에 상호전송이 필요 없게 되어 명령어 수를 줄이고, 속도를 빠르게 할 수 있음

- 데이터 영역과 프로그램 영역이 물리적으로 구분되어 있고 각 버스의 크기들이 서로 다를 수 있음

- 데이터와 명령어를 분리해서 처리

ex) 8051, PIC, AVR

CMOS 구조

- 소비전력이 매우 적으며, 전달 특성이 우수하고 동작 전압의 범위가 넓음

​명령어 구조 에 따라

CISC(Complex Instruction Set Computer) 구조

- 복합 명령어 셋 컴퓨터’라는 의미를 지니는 방식이며, 대표적으로 인텔의 x86계열 CPU와 펜티엄 4도 이 방식을 사용

- CPU가 처리할 수 있는 명령어를 모두 내장하므로 CPU의 구조가 매우 복잡

- CISC 방식의 장점은 뛰어난 호환성에 있음

- 개인용 컴퓨터인 PC에 많이 사용. 8051은 CISC 방식

RISC(Reduced Instruction Set Computer) 구조

- 축소 명령어 셋 컴퓨터’라는 의미를 지니는 방식이며, 주로 대형컴퓨터나 워크스테이션에 사용

- CPU에 내장된 명령어를 줄여 보다 빠른 처리속도가 특징

- CPU의 구조를 보다 단순화

- 컴파일러에게 많은 짐을(연산과정)을 넘김으로써 CPU 내부 구조를 단순하게 제작

- 복잡한 명령어는 단순한 명령어를 조합해서 사용

프로그램이나 알고리즘을 신속하게 실행하기 위한 목적의 마이크로프로세서는 다양한 입출력 장치를 이용하여 자원을 관리하고 운영하는 장치이다.

마이크로컴퓨터는 마이크로와 컴퓨터가 결합된 용어로 작은 컴퓨터 시스템을 말한다.

마이크로컴퓨터는 작은 휴대용 시스템부터 휴대용 노트북, 스마트폰등 성능에 따라 여러 가지 기기에 이용되고 있다.



-MircoController (CPU를 탑재한 단일칩 형태의 컴퓨터)

A microcontroller is a small computer (SoC) on a single integrated circuit containing a processor core, memory, and programmable input/output peripherals. Program memory in the form of Ferroelectric RAM, NOR flash or OTP ROM is also often included on chip, as well as a typically small amount of RAM. Microcontrollers are designed for embedded applications, in contrast to the microprocessors used in personal computers or other general purpose applications consisting of various discrete chips..

Microcontrollers are used in automatically controlled products and devices, such as automobile engine control systems, implantable medical devices, remote controls, office machines, appliances, power tools, toys and other embedded systems. By reducing the size and cost compared to a design that uses a separate microprocessor, memory, and input/output devices, microcontrollers make it economical to digitally control even more devices and processes. Mixed signal microcontrollers are common, integrating analog components needed to control non-digital electronic systems.

MCU를 통합시킨것 시킨 것, SOC(System On Chip)


-MicroComputer (일반적인 PC)

A microcomputer is a small, relatively inexpensive computer with a microprocessor as its central processing unit (CPU).[2] It includes a microprocessor, memory, and input/output (I/O) facilities. Microcomputers became popular in the 1970s and 80s with the advent of increasingly powerful microprocessors. The predecessors to these computers, mainframes and minicomputers, were comparatively much larger and more expensive (though indeed present-day mainframes such as the IBM System z machines use one or more custom microprocessors as their CPUs). Many microcomputers (when equipped with a keyboard and screen for input and output) are also personal computers (in the generic sense).[3]

기타 외부 장치( I/O핀 등)을 모듈화 시킨 것

ex)SBC(single Board Computer)


* SW

os를 사용 안한 하위제어

- 펌웨어 firmware

하드웨어와 소프트웨어 중간 http://blog.naver.com/kangusreport/220628959921

In electronic systems and computing, firmware[a] is a type of software that provides control, monitoring and data manipulation of engineered products and systems. Typical examples of devices containing firmware are embedded systems (such as traffic lights, consumer appliances, and digital watches), computers, computer peripherals, mobile phones, and digital cameras. The firmware contained in these devices provides the low-level control program for the device. As of 2013, most firmware can be updated.[2]


os를 사용한 상위제어
- platform 

Computing platform, a framework on which applications may be run

The term computing platform can refer to different abstraction levels, including a certain hardware architecture, an operating system (OS), and runtime libraries.[1] In total it can be said to be the stage on which computer programs can run.


-커널 Kernel(핵심) https://en.wikipedia.org/wiki/Kernel_(operating_system)
예)Linux, Ubuntu(Ubuntu (operating system), a Linux distribution)
Kernel (operating system), the central component of most operating systems(OS)


In computing, the kernel is a computer program that manages input/output requests from software, and translates them into data processing instructions for the central processing unit and other electronic components of a computer. The kernel is a fundamental part of a modern computer's operating system.[1]


To perform useful functions, processes need access to the peripherals connected to the computer, which are controlled by the kernel through device drivers. A device driver is a computer program that enables the operating system to interact with a hardware device.


리눅스는 커널이라는 말이 맞지만, 인터페이스(쉘), 어플리케이션이 있어야 사용가능 하므로 보통
리눅스 = "커널" + "인터페이스" + "어플리케이션"이라고 함
커널은 메모리를 관리하고 디스크를 관리하고, 그 밖으 모든 컴퓨터 자원을 관리하는 메인 프로세스입니다.
이 커널에 명령을 넣어줄 수 있는것이 인터페이스 입니다. 흔히들 쉘 이라고 불리웁니다. 즉 커널 자체만
으로는 입력이 없기 때문에 동작이 의미가 없고 사용자로부터 인터페이스를 통해 입력값을 주면 커널은
거기에대한 동작을 하거나 결과값을 내줍니다. 어플리케이션는 이러한 일련의 동작을 뭉터기로 모아서
커널에 명령을 전달하는 수단이 되겠습니다.

http://m.kin.naver.com/mobile/qna/detail.nhn?d1id=1&dirId=10302&docId=189452439&qb=7Jq07JiB7LK07KCc7JmAIOy7pOuEkCDssKjsnbTsoJA=&enc=utf8&section=kin&rank=1&search_sort=0&spq=0

Framework http://cafe.naver.com/openrt/6527

예)ROS로봇소프트웨어 개발하는데 필요한 것을 지원해주는 것
   GUI 기반의 소프트웨어 개발에 필요한 도구들을 제공 

Framework들은 복잡하게 구성이 되어 있는 로봇의 소프트웨어 요소들을 기반으로, 다른 어떠한 로봇 소프트웨어을 개발하고 연동시키는데 필요한 기능들을 제공합니다. 따라서, 본인이 로봇의 소프트웨어를 처음부터 끝까지 모두 만들 것이 아니라면, 이러한Framework들을 이용하는 것이 현명하며, 또한 Team-work을 통하여 로봇의 소프트웨어를 개발할때도, 상호연동의 편의성을 위하여 이러한 Framework를 사용하는 것이 좋습니다.

ROS 가 대표적인 예 입니다. ROS 는 ROS 의 각 요소(노드) 들이, 원활하게 데이터를 주고 받을 수 있는 메커니즘을 제공함과 동시에, 여러 명령어, 개발된 소프트웨어를 빌드할 수 있는 도구, 시뮬레이터와 같은 유용한 도구들을 제공하죠. 이렇게, 뭔가 통합적으로 제공되는것을 통틀어 프래임워크(Framework) 라고 합니다. 다음에는, 이러한 로봇 개발을 위한 프래임 워크에 대하여 살펴 보기로 하죠
좀 귀찮더라도, 로봇의 소프트웨어쪽을 하시고 싶으신 분들은, 반드시 framework기반으로 공부를 하시는 것을 권장 드립니다


Software framework, a reusable set of libraries or classes for a software system (or subsystem)
Application framework, used to implement the standard structure of an application for a specific operating system


- 미들웨어 Middleware 

소프트웨어의 중간 http://cafe.naver.com/openrt/6512 

운영체제와 응용프로그램 사이의 i/O나 통신

예) ROS


Middleware is computer software that provides services to software applications beyond those available from the operating system. It can be described as "software glue".[1] Middleware makes it easier for software developers to perform communication and input/output, so they can focus on the specific purpose of their application. Middleware is the software that connects software components or enterprise applications. Middleware is the software layer that lies between the operating system and the applications on each side of a distributed computer network. Typically, it supports complex, distributed business software applications.


- 프레임워크=미들웨어,런타임,빌드도구 등

-applications

Application software, computer software designed to help the user to perform specific tasks

An application program (app or application for short) is a computer program designed to perform a group of coordinated functions, tasks, or activities for the benefit of the user. Examples of an application include a word processor, a spreadsheet, an accounting application, a web browser, a media player, an aeronautical flight simulator, a console game or a photo editor. The collective noun application software refers to all applications collectively.[1] This contrasts with system software, which is mainly involved with running the computer.

OS중 핵심구성요소 Kernel - FrameWork 중 Middleware  - applications

이 전체를 플랫폼이라고 함!


출처
http://kangusreport.blog.me/220629130686
http://blog.naver.com/dustmd0815/220807532921


'나는 프로그래머다! > 기초 다지기' 카테고리의 다른 글

유니코드 이해 하기  (0) 2017.09.19
디자인패턴  (0) 2017.04.01
윈도우 환경에서의 gcc  (0) 2016.10.31
SW 프로그램과 개발환경(리눅스)  (0) 2016.10.31
 

유니코드 이해 하기

Posted by ironmask84
2017. 9. 19. 10:11 나는 프로그래머다!/기초 다지기


컴퓨터의 문자셋 (Character Set)

컴퓨터가 문자를 표현하는 방식은 0 과 1을 이용해서 입니다.

간단하게 풀어서 얘기하면, 전기적 신호가 차단되었는지 인가되었는지를 0 과 1로 구분하는 것입니다.

이러한 0 과 1의 연속된 패턴값이 가지고 2진수의 표현인 것이고,

이 2진수로 이루어진 연속된 패턴은 bit에 의해 자리수가 결정됩니다.

예를들어, 2bit면 00, 01, 10, 11  으로 4가지 표현이 가능하지요.

컴퓨터에서는 Byte단위로 문자를 표현합니다.

1Byte는 8bits 입니다. 


ASCII 코드 등장

그렇다면, 2의 8승인 256가지의 표현이 가능합니다.

이러한 문자표기 중 유명한 것으로 ASCII 코드가 있습니다.

ASCII 코드는 7bits만 사용하고, 영문자와 특수기호 등을 128가지 안에 표현한 것입니다.

참고로, 65인 0100 0001 이 대문자 알파벳 'A' 를 의미합니다.

하지만, 이 아스키 코드로는 한국어, 일본어, 중국어와 같은 문자 종류가 매우 많은 언어는 

8bits로는 표현이 불가능 합니다.

그리고 왜 영문 표현인 ASCII 코드가 먼저 만들어졌을까?

아는분들은 아시지만, 컴퓨터 보급화는 미국에서 시작되었고,

운영체제를 비롯한 여러 유명 SW들이 미국에서 대부분 시작되었습니다.


유니코드 등장

그리하여, 여러가지 문자셋 코드가 등장하다가,

국제 표준 문자셋 코드가 등장했으니,

이것이 유니코드 입니다. (UCS, Universal Character Set, 범용 문자 집합)

그 중에서도 현재 가장 많이 쓰이고 표준화 될 가능성이 높은 것이 UTF-8 입니다.

자세하게 잘 정리된 블로그가 있어서 아래에 링크 올립니당 ^^


http://maximer.tistory.com/100

http://yun4794.blog.me/220990159709

http://egloos.zum.com/chucky1/v/1185578


 

디자인패턴

Posted by ironmask84
2017. 4. 1. 15:06 나는 프로그래머다!/기초 다지기


  • 생성 디자인 패턴
    • 싱글톤패턴
      • 어떤 클래스의 인스턴스 개수가 최대 한 개를 넘지 않도록 하는 패턴
      • 이 하나의 인스턴스는 공유자원에 대한 문지기 또는 중앙에 있는 소통의 중심 역할을 한다.
      • 애플리케이션에서 새 인스턴스를 만들 수 없으며, 모든 메소드는 싱글톤을 통해서만 액세스할 수 있다.
      • 애플리케이션에서는 클래스에 있는 정적 메소드를 호출하여 싱글톤을 가져온다.
      • 상속과 인터페이스(싱글톤은 객체다. 따라서 베이스 클래스로부터 상속을 받고 인터페이스를 구현할 수 있다.)
      • 다수 객체로 전환 가능(나중에 마음이 바뀌어 여러 객체를 만들고자 하는 경우에 코드를 많이 바꾸지 않고도 원하는 바를 이룰 수 있다.)
      • 동적 바인딩(싱글통을 생성하기 위해 실제로 사용하는 클래스를 컴파일시가 아닌 실행시에 결정할 수 있다.)
      • 싱글턴 패턴을 구현 할 때는 private 생성자와 정적 메소드, 정적 변수를 사용한다. 

 

 public class Singleton {

1
2
3
4
5
6
7
8
9
 private static Singleton uniqueInstance;
 
 private Singleton(){} //다른 클래스에서 new키워드를 사용할 수 없게 된다.
 public static Singleton getInstance(){  //그래서 getInstance()를 사용할 수 밖에 없다.
  if(uniqueInstance == null){
   uniqueInstance = new Singleton();
  }
  return uniqueInstance;
 }


 

  • 빌더패턴
    • 객체가 어떤 식으로 구축되는지에 대해 모르는 상황에서 단계별로 객체를 생성하는 패턴이다.
    • 객체를 직접 구축하는 대신 빌더의 인스턴스를 만들고 빌더에서 객체를 직접 구축하는 대신 빌더의 인스턴스를 만들고 빌더에서 객체를 대신 만들도록 하는 방식이다.
    • 객체를 초기화하는 데 여러 생성자 매개변수가 필요한 경우, 그 중에서도 특히 동일 또는 유사한 유형의 매개변수가 여럿 필요한 경우에 특히 이 빌더 패턴이 유용하다.
    • 빌더패턴 예시

 

 적용 전

 적용 후

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Window{
 
     public Window(bloolean visible,boolean modal,boolean diaog){
 
         this.visible=visible;
 
         this.modal=modal;
 
         this.dialog=dialog;
 
     }
 
 
 
    private boolean visible;
 
    private boolean modal;
 
    private boolean dialog;
 
}


  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class WindowBuilder{
 
 
 
   public WindowBuilder(){}
 
   
 
   public WindowBuilder setDialog(boolean flag){
 
  
 
        dialog=flag;
 
        return this;
 
    }
 
   public WindowBuilder setModal(boolean flag){
 
  
 
        modal=flag;
 
        return this;
 
    }
 
   public WindowBuilder setVisible(boolean flag){
 
  
 
        visible=flag;
 
        return this;
 
    }
 
   public Window build(){
 
         return new Window(visible,modal,dialog);
 
    }
 
    private boolean visible;
 
    private boolean modal;
 
    private boolean dialog;



 

윈도우 환경에서의 gcc

Posted by ironmask84
2016. 10. 31. 15:24 나는 프로그래머다!/기초 다지기


GCC (GNU Compiler Collection)는 다양한 프로그램 언어의 컴파일을 지원하는 컴파일러 시스템이며, 특히 C와 C++의 컴파일에 활용될 수 있습니다. 리눅스나 FreeBSD 등의 유닉스 계열 OS에서 매우 광범위하게 사용되어 오면서 뛰어난 성능을 검증받았습니다.

 

윈도의 경우, cygwin과 MinGW가 윈도로 포팅된 gcc의 양대산맥이라고 할 수 있는데, 둘의 성격은 꽤 다른 편입니다. cygwin의 경우 윈도에서 리눅스 환경을 느끼면서 코딩할 수 있도록 배려한 라이브러리가 포함되어 있으며, 주로 유닉스 계열에서 쓰이는 POSIX API 집합을 지원합니다. 따라서 cygwin으로 컴파일된 프로그램을 실행하기 위해서는 별도의 라이브러리(cygwin1.dll)가 필요합니다. (cygwin이 GPL 라이센스를 따르므로 라이브러리 사용시 일부 라이센스 문제가 있을 수 있습니다.)

 

한편 MinGW의 경우 MS에서 제공하는 C 런타임 라이브러리(msvcrt)를 기반으로 동작합니다. 따라서 cygwin과 달리 런타임 라이브러리는 필요하지 않으나, msvcrt가 C99의 기능들을 지원하지 않는 관계로 libmingwex라는 추가 라이브러리를 통해 해당 부분에 대한 지원을 시도하는 중입니다. (출처) 해당 문제점은 MinGW에서 갈라져 나온 새로운 가지인 MinGW-w64에서 해결되었는데, C99의 기능 뿐만 아니라 더 다양한 API, 64비트 윈도우 등에 대한 지원이 추가되었으며, 32비트용 컴파일 또한 지원합니다.

 

결론적으로, 기존에 리눅스 환경에서 실행되던 프로그램을 윈도로 포팅하는 경우에는 cygwin을 사용하고, 일반적인 윈도용 어플리케이션을 개발하기 위한 범용 컴파일러는 MinGW-w64를 사용하는 것이 좋을것 같습니다.


http://jscript.blog.me/220084163392 펌


MinGW은 이클립스 플러그인으로도 제공됩니다.

MinGW에 간단 사용기 : http://neuro.tistory.com/32


 

SW 프로그램과 개발환경(리눅스)

Posted by ironmask84
2016. 10. 31. 14:48 나는 프로그래머다!/기초 다지기





컴퓨터 공학 전공으로 졸업하고, 어언 6년이 지났건만.. 
아직 기초가 부족한 부분이 많은 것 같습니다.


학부 때는 단순히 윈도우 환경에서 Visual Studio나 Eclipse 프로그램을 사용하여
자연스런 컴파일 환경을 통해 프로그래밍 언어를 습득하기에만 정신이 없었고...

모바일 폰 개발 회사에서 재직하는 동안에도 선배들이 만들어놓은 개발 환경을 그대로 이용만 하여,
프로그래밍을 해왔기에..  개발 환경에 대해 제대로 개념을 익히는 시간이 거의 없었습니다..

학부 때 잠시나마 배웠던, 컴파일에 대한 개념도 가물가물 해졌습니다. ㅜㅜ (밑에 간단 정리..)


c언어 코딩 부터 실행파일까지의 기본 순서 : *.c -> *.s -> *.o -> *.exe or *.elf 등등

*compiler : 고수준코드(*.c)에서 목적 코드(*.o)로 옮기는 과정을 통합하여 수행하는 프로그램을 가리킨다.

*좁은 의미의 compiler : 고수준 코드(*.c)를 저수준 코드 (*.s)로 옮기는 과정을 수행하는 프로그램.

*assembler : 저수준 코드(*.s)를 목적 코드 (*o)로 옮기는 작업을 수행하는 프로그램.

*linker : 컴파일러가 만든 목적 코드 (*.o)와 library를 모아 기계어인 실행파일 (*.elf or *.exe)로 변환하는 프로그램.


사실 SW 개발자 입장에서 개발 환경은 한 번 셋팅 해놓으면, 크게 신경을 쓰지 않기에 지나치기 쉬운 것 같습니다.


임베디드 SW를 만드는 업을 해왔지만, 주로 윗단을 (Application 단 + Framework 단) 다루다가,
최근에 아랫단를 (펌웨어) 개발해야 할 기회가 왔기에.. 다시금 개발환경에 대해 파악해보려 합니다.


모바일 폰에 사용되는 칩셋(CPU)의 Core는 ARM을 이용합니다.


그리고 펌웨어 개발 환경은 대부분 리눅스 커널 환경을 사용하기에 이에 대해 잠시 집고 가볼까 합니다.

잘 정리해 주신 블로거님이 계시기에 아래에 퍼왔습니다.


일단 결론을 말씀드리자면, 아래와 같습니다.

1. 리눅스 환경에서 개발 시에는 거기서 제공하는 tool chain을 다운로드하여 사용
   (apt-get 툴을 이용해 필요한 버전의 툴 체인 설치)
2. 윈도우 환경에서 개발 시에는 주로 Cygwin(gcc 제공)을 이용하게 됩니다.

** ARM 타깃용 크로스 툴 체인 --> http://linaro.org 참조


우리가 윈도우즈 환경에서 리눅스 ARM 용 프로그램을 빌드하기 위해서는, 그에 맞는 바이너리를 생성해 줄 수 있는 환경( 컴파일러, API 등 )을 구성할 필요가 있다. 윈도우즈에서 이를 가능하게 해 주는 것이 POSIX 기반의 시그윈 개발 환경이다. 
--> Cygwin 에서는 Windows에서 사용가능한 리눅스 환경의 API들을 제공하고,
     tool chain (ARM용 gcc 크로스 툴 체인, 
git 등)을 제공합니다.


우리는  시그윈 환경을 이용해 리눅스 ARM 용 프로그램을 빌드하고, 그것을 안드로이드 장치로 복사하고 설치하게 된다. 이것이 윈도우즈와 리눅스 간의  크로스 플래폼 개발이다. 안드로이드 SDK 를 사용하게 되면 자바 바이트 코드( 플래폼에 독립적인 중간 코드 )를 생성하기 때문에 빌드 환경이 중요하지 않지만, 안드로이드 NDK 는 실제 리눅스 API 를 이용하고 기계어로 컴파일하기 때문에 반드시 올바른 환경에서 개발해야만 한다.



좀 더 자세한 내용은 아래 펌 참고...

http://lifeisforu.tistory.com/132  (안드로이드 NDK 개발환경 예시)



NDK 로 개발을 한다는 것이 의미하는 바가 무엇인지 생각해 볼 필요가 있다. 많이들 알고 있는 사실이겠지만, 어떤 프로그램이 어떤 머신에서 실행되기 위해서는 해당 머신에 맞는 실행가능한 파일( executable )을 만들어야만 한다. 그것이 소위 우리가 알고 있는 '컴파일'과 '링크'라는 작업이다. 이 컴파일 작업과 링크 작업을 합쳐서 '빌드'라고 표현한다.


우리가 열심히 코딩한 라인들은 어셈블리어로 변환되고, 이 어셈블리어들은 다시 기계어로 변환된다. 그리고 CPU 는 이 기계어를 마이크로 명령어로 나누어서 프로그램을 실행하게 된다. 그런데 이 CPU 가 어떠한 명령어 집합 구조( Instruction Set Architecture, ISA )를 제공하느냐에 따라서 다른 기계어를 만들어야 하기 때문에, 프로그램을 빌드할 때는 해당 CPU 에 맞는 구성을 만들어야 한다. 예를 들어 CPU 가 x86 ISA 를 제공한다면 x86 에 맞는 빌드 구성을 해야 하고, CPU 가 x86/64 를 제공한다면 거기에 맞는 빌드 구성을 만들어야 한다.


자 우리가 NDK 를 통해 만든 바이너리를 실행할 플래폼의 환경은 어떠한가? 일반적으로 현재 안드로이드 OS 가 돌아 가는 환경은 ARM 코어를 사용하는 리눅스 환경이다. 이는 어떠한 사실을 내포할까?


    • 우리가 C/C++ 응용프로그램을 개발할 때 CreateFile() 과 같은 Win32 API 를 사용할 수 없다.

    • Visual Studio 를 이용할 수 없다. --> VC++ 컴파일러를 사용할 수 없다.


사실 Visual Studio 의 컴파일러를 GCC( GNU Compiler Collection ) C++ 컴파일러로 연결해 놓고 개발할 수는 있을 것이다. 하지만 기본 환경 자체가 Win32 서브시스템과 x86 혹은 x86-64 아키텍처를 위한 개발에 최적화되어 있으므로 참 어려운 일이 될 것이다. 구글링을 해 보면 여러 가지 자료들이 나오기는 하는데 얼마나 편한 지는 잘 모르겠다. 어쨌든 우리는 리눅스 OS 를 기반으로 ARM ISA 에 맞춰서 빌드해야만 하는 상황이고, 윈도우즈 환경에서 이를 가능하게 만들 수 있는 방법을 찾아야만 한다. 


이때 우리에게 한 줄기 빛을 비춰주는 존재가 있으니, 그것이 바로 시그윈이다.


Cygwin 이란 무엇인가?



일단 시그윈 공식 사이트의 설명을 인용해 보도록 하겠다. 출처 : http://cygwin.com/index.html


시그윈은 :

  • 윈도우즈를 위해 리눅스처럼 느껴지는 환경을 제공하는 도구들의 집합이다.

  • 많은 리눅스 API 기능을 제공하는 리눅스 API 레이어로서 동작하는 DLL( cygwin1.dll )이다.


그리고 다음과 같이 착각하지 말라고 경고하고 있다.


시그윈은  :

  • 윈도우즈 상에서 네이티브 리눅스 앱들을 실행하는 방법이 아니다. 당신이 윈도우즈 상에서 프로그램을 실행하기 원한다면, 소스로부터 앱들을 리빌드해야만 한다.
  • signal, pty 등과 같은 유닉스 기능들을 인지하는 네이티브 윈도우즈 앱들을 마술처럼 만들어 주는 방법이 아니다. 다시 말하지만, 당신이 시그윈 기능의 이점을 취하기 원한다면, 소스로부터 앱들을 리빌드할 필요가 있다.


앞에서도 언급했지만 특정 CPU 아키텍처에 대해 리눅스용으로 빌드된 프로그램은 윈도우즈에서 실행될 수 없다. 당연히 윈도우즈 환경에 맞는 구성으로 다시 빌드해야만 한다. 시그윈은 크로스 플래폼 개발을 가능하게 해주는 환경일 뿐이지, 에뮬레이터가 아니라는 것을 명심해야만 한다.


Cygwin 의 작동 원리.



그렇다면 시그윈은 어떻게 해서 리눅스와 같은 개발 환경을 지원하게 되는 것일까?


여러분은 Visual Sutdio 를 통해 프로젝트 설정을 하다가 '서브시스템' 이라는 항목을 본 적이 있을 것이다. 윈도우즈는 여러 개의 서브시스템을 가지고 있는데, 우리가 주로 사용하는 것이 Win32 서브시스템이다. 아래 그림은 Windows NT 의 시스템 아키텍처에서의 POSIX 서브시스템을 보여 주고 있다.


윈도우즈 NT 시스템 아키텍처( 출처 : 위키피디아 )


이 POSIX 라는 것은 Portable Operating System Interface 의 약자로 IEEE 가 운영체제 간의 호환성을 유지하기 위해서 제정한 표준이다.


POSIX( 대충 '파직스'라고 발음됨 )는 "Portable Operating System Interface" 의 머리글자들이며, 운영체제 간의 호환성을 유지하기 위해서 IEEE 에 의해 제정된 표준 패밀리이다. POSIX 는 다양한 유닉스 및 다른 운영 체제들 간의 소프트웨어 호환성을 위해 응용프로그램 인터페이스( API )와 명령줄 쉘, 그리고 유틸리티 인터페이스들을 정의한다.


중략...


유닉스 같은 운영 체제 환경을 위한 POSIX 명세는 원래 코어 프로그래밍 인터페이스를 위한 단일 문서로 구성되어 있었지만, 결국에는 19 개의 분리된 문서로 늘어 났다( 예를 들면 POSIX1, POSIX2, 등 ). 표준화된 사용자 명령 줄과 스크립팅 인터페이스들은 Korn Shell 에 기반했다. awk, echo, ed 등을 포함하는 많은 사용자 수준 프로그램, 서비스, 유틸리티들도 표준화되었으며, 기본적인 I/O( 파일, 터미널, 네트웤 )을 포함하는 프로그램 수준 서비스들도 포함한다. POSIX 는 표준 스레딩 라이브러리 API 도 정의하는데, 이는 현대의 거의 대부분의 OS 에 의해서 지원된다. 요새는 대부분의 POSIX 파트들이 하나의 IEEE Std 1003. 1-2008 표준에 포하모디었으며, 이는 POSIX 1-2008 로 알려져 있다.


하략...


- 출처 : 위키피디아, POSIX


OS/2 라는 것은 MS 와 IBM 이 초기에 제작한 운영체제로 요새는 별로 의미가 없으므로 관심있는 분들은 위키피디아의 OS/2 라는 글을 따로 읽어 보기 바란다.


POSIX 를 지원하는 OS 리스트는 다음 링크의 'POSIX-oriented operating systems' 절에서 찾아 볼 수 있다 : 위키피디아, POSIXGNU/Linux 같은 경우에는 POSIX 에 대해 '거의 대부분의 호환성' 을 가지고 있다. 시그윈은 POSIX 에 대해 '많은 호환성' 을 가지고 있다고 표현되고 있다. 즉 안드로이드 시스템의 기반이 되는 리눅스가 POSIX 를 거의 완벽하게 지원하고 있기 때문에, 우리는 윈도우즈 상에서 시그윈을 통해 거기에 맞는 환경을 구성할 수 있는 것이다.


위에서 윈도우즈의 POSIX 서브시스템에서 언급을 했는데 여기에서 윈도우즈의 POSIX 를 언급한 것은 그냥 예를 든 것 뿐이다. 시그윈이 윈도우즈의 POSIX 서브시스템의 레이어라는 이야기는 아니다. 왜 그럴까? 윈도우즈의 POSIX 서브시스템은 POSIX 표준을 제대로 지키고 있지 않기 때문이다. 


시그윈은 윈도우즈의 POSIX 와는 개별적으로 동작하는 개발환경이다. 시그윈 환경, 시그윈 서브시스템, 시그윈 플래폼 등의 용어를 사용해도 무방하지 않을까 싶다. 시그윈이 윈도우즈의 POSIX 서브시스템의 레이어로서 동작하지 않는 이유는 다음 글을 보면 좀 더 이해가 가지 않을까 싶다 : The Sad History of the Microsoft POSIX Subsystem. 아래에 일부만 인용해 보았다. 요약하면 윈도우즈 POSIX 가 허접(?)이란 것과 XP 부터는 POSIX 서브시스템을 지원하지 않는다는 것이다. 그 뒤의 이야기가 쭉 나오는데 다 읽어 보지는 못했다.


윈도우즈 NT 가 처음 개발되고 있었을 때, 목표 중의 하나는 커널을 프로그래밍 인터페이스와 분리하는 것이었다. NT 는 원래 OS/2 를 성공시키기 위한 것이었지만, 마이크로소프트는 윈도우즈 3.x 응용프로그램들을 실행하기 위한 호환성을 포함시키고, 방위산업 시장에 판매하기 위한 1980 년대 DoD( 국방성 ) Orange Book 과 FIPS 명세들을 만족시키기 원했다. 결과적으로 윈도우즈 NT 는 복잡한 자유재량에 의한 접근 제어 기능을 가진 멀티유저 플래폼으로서 개발되었으며, 하이브리드 마이크로커널 3 유저랜드1 환경들로서 구현되었다 :


  • Windows( Win32 )
  • OS/2
  • POSIX


마이크로소프트는 Win32 문제를 가지고 IBM 과 다퉜으며, NT 프로젝트는 OS/2 와 갈라섰다. 팀의 초점은 Win32 로 이동했다. 그래서 Win32 API 를 호스트하는 Client Server Runtime Subsystem( CSRSS ) 은 의무적이 되었으며, OS/2 와 POSIX 서브시스템이 실제로 완료되지 않았음에도 불구하고 그것들은 윈도우즈 NT 부터 윈도우즈 2000 까지 5 개의 버전에 포함되었다. OS/2 서브시스템은 단지 OS/2 1.0 명령줄 프로그램들만을 실행할 수 있으며, presentation manager 에 대한 지원이 존재하지 않았다. POSIX 서브시스템은 POSIX.1 명세를 지원했지만, 모든 종류의 쉘이나 유닉스 같은 환경을 제공하지 않았다. Win32 가 윈도우즈 95 의 형태에서 성공하면서, OS/2 와 POSIX 서브시스템의 개발은 중단되었다. 그것들은 윈도우즈 XP 와 윈도우즈 서버 2003 에서 완전히 죽고 사라졌다.


반면에 Softway Systems 는 1996 년 쯤에 OpenNT 라고 불리는 유닉스-윈도우즈 NT 간 포팅 시스템을 개발했다. OpenNT 는 NT POSIX 서브시스템 상에서 빌드되었지만, 그것에 살을 붙여 이용할 수 있는 유닉스 환경을 제공했다. 이는 유닉스 시스템이 매우 비싸진 시점이었다. Softway 는 OpenNT 를 사용해서 US Federal agency 들을 위한 여러 유닉스 응용프로그램들을 윈도우즈 NT 로 변경했다. 1998 년에 OpenNT 는 Interix 라고 이름을 바꿨다. Softway Systems 는, 마이크로소프트 POSIX 서브시스템이 지원하지 않았던 시스템 호출을 구현하고, 풍부한 libc,  파일 시스템에 대한 single-rooted view, 그리고 실용적인 gcc 를 개발하기 위해, 최종적으로 NT POSIX 서브시스템에 대한 완전한 대체물을 만들었다.


하략...


위키피디아에 의하면 Windows Server 2003 R2 부터는 사실은 Interix 의 변형인 SUA( Subsystem for UNIX-based Applications )를 통해서 POSIX 를 지원하고 있다고 한다. 이것은 SFU( Windows Services for UNIX )라고 불리기도 한다. Windows Vista 및 Windows 7 의 Enterprise 에디션과 Ultimate 에디션도 SUA 를 포함하고 있다고 한다. 자세한 내용은 Windows Services for UNIX 를 참조하라.


결론.



우리가 윈도우즈 환경에서 리눅스 ARM 용 프로그램을 빌드하기 위해서는, 그에 맞는 바이너리를 생성해 줄 수 있는 환경( 컴파일러, API 등 )을 구성할 필요가 있다. 윈도우즈에서 이를 가능하게 해 주는 것이 POSIX 기반의 시그윈 개발 환경이다. 


우리는  시그윈 환경을 이용해 리눅스 ARM 용 프로그램을 빌드하고, 그것을 안드로이드 장치로 복사하고 설치하게 된다. 이것이 윈도우즈와 리눅스 간의  크로스 플래폼 개발이다. 안드로이드 SDK 를 사용하게 되면 자바 바이트 코드( 플래폼에 독립적인 중간 코드 )를 생성하기 때문에 빌드 환경이 중요하지 않지만, 안드로이드 NDK 는 실제 리눅스 API 를 이용하고 기계어로 컴파일하기 때문에 반드시 올바른 환경에서 개발해야만 한다.


이제 시그윈이라는 것의 정체에 대해 어느 정도 이해할 수 있게 되었을 것이라 생각한다. 그리고 시그윈을 통해 뭔가를 빌드한다는 것의 의미에 대해서 이해할 수 있게 되었을 것이라 생각한다.



'나는 프로그래머다! > 기초 다지기' 카테고리의 다른 글

컴퓨터 시스템과 임베디드 시스템 개념  (0) 2017.09.25
유니코드 이해 하기  (0) 2017.09.19
디자인패턴  (0) 2017.04.01
윈도우 환경에서의 gcc  (0) 2016.10.31