2010.12.08 10:49

2010.12.07





리눅스 시스템은 많은 컴포넌트로 구성되어 있다.
각각의 컴포넌트를 설정하는 방법을 알고 서로간의 상호작용을 알고
 그 조합을 최적화를 위해 시스템 아키텍쳐에 대해서 알아보도록 하자

전체 리눅스 시스템의 아키텍쳐이다.




그림에서는
커널과 기타 컴포넌트의 내부요소를 상당한 수준까지 추상화 했지만
여기에서 제시한 수준이면 충분하다,

1. 하드웨어

리눅스 시스템을 운영하기위해서는
하드웨어가 몇가지 지원해줘야 한다

- 먼저 메모리 관리 유닛 (MMU, Memory Management Unit)이 있는 최소 32Bit CPU 이어야 한다.
- 시스템을 효과적으로 운영하기 위해 충분한 양의 메모리도 필요하다
- 타겟에서 제대로 디버깅을 하고자 한다면 최소한의 입출력 장치도 필요하다
- 커널이 영구적인 스토리지나 네트워크 스토리지를 통해 루트 파일시스템을 로드하거나 루트 파일 시스템에 접근이 가능해야한다


2. 리눅스 커널

커널은 운영체제의 핵심 컴포넌트로  하드웨어 바로 위에 위치하여
하드웨어와 긴밀한 관계를 유지하며 사용자 수준의 소프트웽어에 고수준 추상을 제공해준다.
리눅스는 장치를 구동하고 입출력접근을 관리 프로세스를 스케쥴링 메모리 공유를 지원 시그널을 처리 등등
시스템에 대한 여러가지를 관리를 한다.

따라서 커널이 제공하는 API를 사용하는 응용 프로그램은 그 커널이 지원하는 다양한 아키텍처에서는
코드를 변경하지 않고 조금만 바꾸면 쉽게 이식이 가능하다
이는 리눅스에서 흔한 경우로 리눅스가 지원하는 모든 아키텍처에서 동일하게 사용되는 응용프로그램을 한번 참조해보아라!

커널 내에는 응용프로그램에 필요한 기능을 제공하는 두 개의 계층화된 서비스 부류가 있다.
저수준 인터페이스
고수준 컴포넌트


1) 저수준 인터페이스

 커널이 동작하고 있는 하드웨어 구성마다 고유한 부분으로
하드웨어에 독립적인 API를 사용해 하드웨어 자원을 직접 제어가능케 해준다.

레지스터나 메모리 페이지를 다루는 방식이 PowerPC시스템 이나 ARM 시스템에서 각각 다르나
약간의 예외를 제외하고는 거의 공통적인 API를 사용하여 고수준의 커널 컴포넌트로 접근 가능하다.

일반적으로 저수준 서비스는 CPU 고유의 연산이나 아키텍처 고유의 메모리 연산, 장치에 대한 기본 인터페이스를 다룬다.


2) 고수준 컴포넌트

저수준 서비스 위에 존재하여 모든 유닉스 시스템에 공통적인 추상, 즉 프로세스, 파일, 소켓, 시그널 등을 제공한다.
커널이 제공하는 저수준 API는 모든 아키텍처에서 동일하므로 고수준 추상을 구현하는 코드는 아키텍처에 상관없이 거의 동일하다.
드물긴하나 고수준의 커널 코드가 아키텍처마다 다른 함수를 가지는 경우도 있다.

이처럼 두가지 수준의 추상 사이에서 커널은 어떤 장치로 부터 나오거나
반대로 그장치로 보내지는 구조화된 데이터를 이해하고 처리하기위해 때때로 컴포넌트라 하는 것이 필요하다
파일시스템, 네트워킹 프로토콜이 바로 그런 컴포넌트의 예이다.

커널은 이를 통해서 구조화된 데이터를 이해하고 처리하므로 커널에 대해 자세히 알 필요가 있다.




3. 응용프로그램

커널이 제공하는 서비스는 응용프로그램이 직접 사용하기에 부적합하다.
그래서 응용프로그램의 기능을 얻기위해 응용프로그램 대신 
커널과 상호작용하는 추상 서비스와 API를 제공하는 라이브러리를 사용한다.

대부분의 리눅스 응용 프로그램이 사용하는 가장 인기 있는 라이브어리는 GNU C라이브러리 이다.
허나 크기가 막대하기에 다른 라이브어리를 사용도 한다.
대표적인 예로 Qt, XML, MD5등등 수 많은 라이브러리와 다양한 유틸리티와 API를 제공한다.


라이브어리

일반적으로 라이브러리는 응용 프로그램에 동적으로 링크된다.
즉 응용프로그램의 바이너리 일부가 아니라 응용프로그램 시작시 으용프로그램의 메모리 공간에 로드된다.
이로소 응용프로그램이 각각의 복사본 없이도 동일한 라이브러리를 사용할 수 있는 것이다.
상황에 따라 정적 이나 동적으로 사용하는게 맞는 것이다.

Posted by 차출발 차출발

댓글을 달아 주세요