2.5 링커와 로더
일반적으로 프로그램은 디스크에 이진 실행파일(a.out or prog.exe)로 존재
CPU에서 실행하려면 프로그램을 메모리로 가져와 프로세스 형태로 배치되어야 한다.
소스파일은 임의의 물리 메모리 위치에 적재되도록 설계된 오브젝트 파일로 컴파일 된다.(재배치가능오브젝트파일)
다음으로 링커는 이러한 재배치 가능 오브젝트 파일을 하나의 이진 실행 파일로 결합한다.
링킹 단계에서 표준 또는 라이브러리와 같은 다른 오브젝트 파일 또는 라이브러리도 포함될 수 있다.
로더는 이진 실행 파일을 메모리에 적재하는 데 사용되며, CPU에서 실행할 수 있는 상태가 된다.
즉 링커와 로더의 관련된 활동은 '재배치'로, 프로그램에 최종 주소를 할당하고 코드와 데이터를 해당 주소와 일치한다.
링커에서 추가되는 라이브러리는 2가지 종류가 있다. 정적(Static)과 동적(Dynamic) 라이브러리이다.
정적 라이브러리는 링킹될때 링크된 모든 라이브러리가 실행 파일에 링크되어 메모리에 적재된다.
동적 라이브러리는 링킹될때 재배치 정보를 삽입하고, 프로그램이 적재될때 라이브러리를 링크한다.
동적 라이브러리 장점으로 여러 프로세스가 동적으로 링크된 라이브러리를 공유가능하여 메모리 사용이 적다.
2.6 응용프로그램이 운영체제마다 다른 이유
기본적으로 한 운영체제에서 컴파일된 프로그램은 다른 운영체제에서 실행할 수 없다.
각기의 운영체제가 제공하는 서비스 집합들이 상이하기 때문이다.
1. 각 운영체제에는 헤더, 명령어 및 변수의 배치를 강제하는 응용 프로그램 이진 형식이 존재한다. 이런 구성요소는 명시된 구조 형태로 실행 파일 내의 특정 위치에 있어야 운영체제가 파일을 열고 응용프로그램을 적재하여 올바르게 실행가능하다.
2. CPU는 다양한 명령어 집합을 가지며 해당 명령어가 포함된 응용 프로그램만 올바르게 실행 가능하다..
3. 운영체제는 응용 프로그램이 사용할 수 있는 다양한 시스템 콜을 제공한다. 이러한 시스템 콜은 시스템마다 호출하는 법, 시스템 콜 번호, 의미, 반환결과 등 여러 측면에서 상이하다.
2.7 운영체제 설계 및 구현
2.7.1 설계목표
사용자 목적 : 사용하기 쉽고 편리하며, 배우기 쉽고, 신뢰성 있으며, 안전하고, 신속해야 한다.
시스템 목적 : 설계, 구현, 유지보수가 쉬워야 하며, 적응성, 신뢰성, 무오류, 효율성을 가져야한다.
2.7.2 기법과 정책
기법(Mechanism)과 정책(Policy)를 분리하는 것이 가장 중요한 원칙이다.
기법은 어떤 일을 어떻게 할 것인가를 결정하는것, 정책은 무엇을 할 것인가 결정하는 것이다.
만약 정책의 변경이 기법의 변경을 야기한다면 최악의 경우이다.
따라서 융퉁성있는 일반적인 기법을 사용한다면 정책의 변경은 시스템의 일부 매개변수만을 재정의 하도록 요구한다.
2.7.3 구현
운영체제의 설계가 완료되면 구현되어야 한다.
초기 운영체제는 어셈블리 언어로 작성되었다. 최근은 C또는 C++와 같은 고급 언어로 작성되며, 일부가 어셈블리어로 작성된다.
고급 언어로 작성할 때의 장점은 개발 시간 단축, 이해 및 디버깅 쉬움, 개선된 컴파일러, 포팅의 쉬움 등이 있다. 단점으로는 성능의 하락이 가장 크다. 따라서 성능에 중요한 부분은 이후 어셈블리 언어로 대체한다.
2.8 운영체제 구조
운영체제는 크고 복잡한 시스템으로 적절하게 동작하고 쉽게 변경될 수 있도록 신중히 제작해야한다.
일반적인 접근 방법은 태스크를 작은 구성요소로 분할 하는 것이다. 즉 main()이외의 함수를 정의하는 것이다.
2.8.1 모놀리식 구조(Monolithic Structure)
커널의 모든 기능을 단일 주소 공간에서 실행되는 단일 정적 이진 파일에 넣는다.
최초의 UNIX 운영체제는 커널과 시스템 프로그램의 두 부분으로 구성된다.
시스템 콜 인터페이스 아래와 물리적하드웨어 위의 모든 것이 커널이다. 커널은 시스템콜을 통해 파일 시스템, 스케쥴링, 메모리 관리등 많은 운영체제 기능을 제공한다.
유지보수와 개발이 어렵지만, 기능적인 측면에서 뚜렷한 이점이 있다. 시스템 콜 인터페이스에는 오버헤드가 거의 존재하지 않기 때문이다.
이러한 방법은 '밀접하게 결합된 시스템'으로 불린다.
2.8.2 계층적 접근(Layered Approach)
위와 다르게 '느슨하게 결합된 시스템'으로 불린다.
기능이 특정 기능 및 한정된 기능을 가진 개별적이며 작은 구성요소로 나뉜다. 모든 구성요소가 합쳐 커널을 구성한다.
이러한 방식중 하나가 계층적 접근 방식이다.
운영체제가 여러 개의 층으로 나누어진다. 최하위 층(Layer 0)는 하드웨어이고 최상위층 (Layer N)은 사용자 인터페이스이다.
각 층은 데이터와 이를 조작하는 연산으로 구성된 추상화된 객체의 구현이다.
예를들어 Layer M 은 자료구조와 Layer M+1 에서 호출할 수 있는 루틴으 집합으로 구성되며, Layer M-1에 대한 연산을 호출할 수 있다.
이러한 방식의 주된 장점은 구현과 디버깅의 간단함에 있다. 각 층들은 단지 자신의 하위층들과의 서비스와 기능들만을 사용하도록 구성하면 된다.
하지만 각 계층의 기능을 적절히 정의하는것에 어려움이 있으며, 사용자 프로그램이 여러 계층을 통과해야하는 오버헤드가 존재한다.
2.8.3 마이크로 커널(Microkernels)
커널을 모듈화한 Mach운영체제를 개발한다. 중요치 않은 구성요소를 커널로부터 분리하고, 사용자 수준 프로그램으로 구현하여 운영체제를 구성하는 방법이다. 즉 매우 작은 커널이다.
마이크로커널의 주 기능은 사용자 프로그램과 사용자 공간에서 수행되는 다양한 서비스 간에 통신을 제공하는 것이다.
만약 프로그램이 파일에 접근하기 원한다면, 파일 서버와 반드시 상호 작용을 해야한다. 프로그램과 서비스는 결코 직접 상호작용하지 않는다. 대신 메세지 패싱을 통해 간접적으로 상호 작용한다.
장점으로 운영체제의 확장이 쉽고 높은 보안성과 신뢰성을 제공한다. 각 서비스가 사용자 공간에 추가되기 때문이다.
단점으로 성능의 감소가 있다.
macOS 및 iOS등이 사용하고 있다.
2.8.4 모듈(Modules)
적재가능 커널 모듈(Loadable Kernel Modules, LKM)기법을 사용한다.
커널은 핵심적인 구성요소의 집합을 가지고 있고 부팅 혹은 실행 중에 부가적인 서비스들을 모듈을 통해 링크할 수있다. Linux, Mac OS X, Solaris, Windows등 현대 UNIX를 구현하는 일반적인 추세이다.
커널의 각 부분이 정의되고 보호된 인터페이스를 가진다는 점에서 계층 구조와 비슷하지만, 모듈에서 다른 임의의 모듈을 호출할 수 있다는 점에서 계층 구조보다 유연하다.
커널은 단지 핵심 기능만 가지고 있고 다른 모듈의 적재 방법과 통신 방법에 대해 안다는 점에서 마이크로 커널과 유사하지만, 메세지 패싱을 사용하지 않아도 된다는 점에서 더 효율적이다.
2.8.5 하이브리드 시스템(Hybrid Systems)
다양한 구조를 결합하여 성능, 보안 및 편리성 문제를 해결하려는 혼용 구조로 구성된다.
예를들어 Linux는 운영체제 전부가 하나의 주소 공간에 존재하여 효율적인 성능을 제공하기 때문에 모놀리식 구조이다. 하지만 모듈을 사용하기 때문에 새로운 기능을 동적으로 커널에 추가할 수있다.
Appendix
macOS and iOS
User Experience : 사용자가 컴퓨팅 장치와 상호 작용할 수있는 소프트웨어 인터페이스를 정의한다. macOS는 마우스 용으로 설계된 Aqua, iOS는 터치 장치로 설계된 Springboard를 사용한다.
Application Frameworks : Cocoa 및 Cocoa Touch 프레임 워크가 포함되며 Objective-C or Swift 언어에 대한 API를 제공한다.
Core Frameworks : Quicktime 및 OpenGL을 포함한 그래픽 및 미디어를 지원하는 프레임워크를 정의한다.
Kernel Env : Darwin으로 불리는 이 환경은 Mach 커널과, BSD UNIX 커널이 포함된다.
응용프로그램(Applications)는 각 단계와 직접 상호 작용하도록 설계될 수 있다. 또한 프레임워크를 완전히 버리고 커널 환경과 직접 통신할 수 있다.(이는 POSIX 시스템콜을 수행하도록 작성된 C 프로그램)
macOS는 x86 아키텍처에서 실행되도록 컴파일된다. iOS는 ARM 아키텍쳐에서 실행되도록 컴파일된다.
2020년 Apple은 macOS 또한 ARM 아키텍쳐로 완전한 전환을 선언하고 제품을 선보였다.
iOS는 macOS에 비해 훨씬 더 제한적이며 폐쇄적이다. POSIX 및 BSD API에 대한 액세스를 제한하며 전원관리 및 공격적인 메모리 관리와 같은 모바일 시스템의 특정 기능과 요구를 해결하기 위해 약간 수정되었다.
Darwin은 Mach 시스템 콜(Trap)과 BSD 시스템콜(POSIX) 두개의 시스템콜 인터페이스를 제공한다.
Mach는 메모리 관리, CPU 스케쥴링, 메시지 패싱 및 RPC와 같은 IPC 기능을 포함한 기본 운영체제 서비스를 제공한다.
Mach에서 제공하는 대부분의 기능은 커널 추상화를 통해 사용가능하다. 또한 적재가능 모듈(kext)개발을 위한 I/O키트를 제공한다.
Android
Google이 주도하고 스마트폰과 태블릿을 위해 개발된 운영체제이다.
안드로이드 장치의 소프트웨어 개발자는 JAVA 언어로 응용 프로그램을 개발하지만 일반 표준 JAVA API를 사용하지않고 별도의 Android API를 사용한다.
ART(Android RunTime)에서 실행 가능하도록 컴파일 된다. ART는 메모리와 CPU 처리능력이 제한된 모바일 장치 가상머신이다.
대부분의 JAVA 프로그램들이 JIT(Just in time)컴파일을 수행하는 반면, AOT(Ahead of time)컴파일을 수행한다.
즉 장치에 설치될때 해당 기계어 코드로 컴파일되어 ART에서 실행될 수 있게 한다.
HAL을 통해 물리적 하드웨어를 추상화가 가능하여 특정 하드웨어와 상관없이 일관된 뷰를 프로그램에게 제공한다.
Linux 커널을 수정하여 전원관리와 같은 요구를 지원하고 메모리관리 및 할당을 변경했다.
WSL1(Windows Subsystem For Linux1)
Windows 10에서 Linux 용 Windows 서브시스템이 추가되어 네이티브 Linux 응용 프로그램을 실행할 수있다.
통상 bash.exe를 통해 사용자가 사용가능하다.
내부적으로 WSL은 init 프로세스로 구성된 Linux 인스턴스를 생성하고 네이티브 Linux 프로그램 /bin/bash를 실행하는 bash shell 프로세스를 생성한다. 이 프로세스는 네이티브 Linux 바이너리를 프로세스의 자체 주소 공간에 적재하여 Linux 프로그램을 실행할 수 있는 환경을 제공한다. 각 프로세스는 Windows Pico 프로세스에서 실행된다.
Pico 프로세스는 가능한 한 Linux 시스템콜을 네이티브 Windows 시스템콜로 변환한다.(WSL1)
Linux 프로세스가 요구한 시스템콜이 Windows 시스템콜에 일대일 관계로 매칭된다면 Linux-Windows 커널의 동등한 시스템 콜로 직접 전달된다. 하지만 Windows 시스템콜이 없는 요구를 한다면 동등한 기능을 제공해야한다.
시스템별 시스템콜은 비슷하지만 동일하지는 않아서 일부기능을 제공하고 나머지 기능을 제공하기위해 유사한 Windows 시스템콜을 호출한다.
예를들어 Linux fork()가 요청될때 사례를 보여준다. Windows CreateProcess()는 Linux fork()와 유사하지만 완전한 동일 기능을 제공하지 않는다. 따라서 WSL1에서 fork()가 호출되면 LXSS서비스(Pico 프로세스는 LXCore 및 LXSS와 통신해 시스템콜을 제공한다)는 fork() 일부를 수행한 다음 CreateProcess()를 호출하여 나머지 작업을 수행한다.
2020년에 WSL2가 정식 출시되어 많은점이 업데이트 되었다.
기능 | WSL1 | WSL2 |
Windows와 Linux 통합 | ✅ | ✅ |
빠른 부팅 시간 | ✅ | ✅ |
작은 리소스 공간 | ✅ | ✅ |
관리 VM | ❌ | ✅ |
전체 Linux 커널 | ❌ | ✅ |
전체 시스템 호출 호환성 | ❌ | ✅ |
현재 버전의 VMWare 및 VirtualBox로 실행 | ✅ | ❌ |
OS 파일 시스템 간 성능 | ✅ | ❌ |
WSL2는 WSL1과 다른 VM 환경(Hyper-V 사용)을 사용한다. WSL 1에서 Linux의 시스템 콜을 Windows 시스템 콜로 변환하는 구조였다고 하면, WSL 2에서는 윈도우즈에 리눅스 커널을 올렸다고 볼 수있다.
GPU Access가 가능하며 네트워크 서비스는 VM과 마찬가지로 가상화된 네트워킹 구성 요소를 사용한다.
'책 > 운영체제' 카테고리의 다른 글
운영체제 Ch03_'Process-2' (0) | 2021.01.08 |
---|---|
운영체제 Ch03_'Process-1' (0) | 2021.01.07 |
운영체제 Ch02_'Operating-System Structure-1' (1) | 2021.01.03 |
운영체제 Ch01_'Introduction' (0) | 2020.12.18 |
운영체제 레퍼런스 (0) | 2020.12.18 |