본문 바로가기

공부 기록/OS

[OS/공룡책] Chapter 2. 운영체제 구조 - 운영체제 빌딩과 부팅, 운영체제 디버깅

운영체제 빌딩과 부팅

- 일반적으로 운영체제는 다양한 주변장치 구성을 가진 모든 종류의 컴퓨터에서 실행되도록 설계된다.

 

운영체제 생성

- 운영체제를 처음부터 생성(또는 빌딩)하는 경우 다음 절차를 밟아야 한다.

   1. 운영체제 소스 코드를 작성한다.(또는 이전에 작성된 소스 코드를 확보한다.)

   2. 운영체제가 실행될 시스템의 운영체제를 구성한다.

   3. 운영체제를 컴파일 한다.

   4. 운영체제를 설치한다.

   5. 컴퓨터와 새 운영체제를 부팅한다.

 

- 리눅스 시스템을 처음부터 빌드하는 방법

   1. http://www.kernel.org에서 서 Linux 소스 코드를 다운로드한다.

   2. "make menuconfig" 명령어로 커널을 구성한다. => .config 구성 파일을 생성한다.

   3. "make" 명령어로 메인 커널을 컴파일한다. => .config 파일에서 식별된 구성 매개변수를 기반으로 커널을 컴파일하여 커널 이미지인 vmlinuz 파일을 생성한다.

   4. "make modules" 명령어로 커널 모듈을 컴파일한다. => .config 파일에 지정된 구성 매개변수에 따라 다르다.

   5. "make modules install" 명령어로 커널 모듈을 vmlinuz에 설치한다.

   6. "make install" 명령어로 시스템에 새 커널을 설치한다.


시스템 부트

- (시스템) 부팅 : 커널을 적재하여 컴퓨터를 시작하는 과정

 

- 부팅 과정

   1. 부트스트랩 프로그램 또는 부트 로더라고 불리는 작은 코드가 커널의 위치를 찾는다.

   2. 커널이 메모리에 적재되고 시작된다.

   3. 커널은 하드웨어를 초기화한다.

   4. 루트 파일 시스템이 마운트된다.

 

- BIOS 기반 (다단계) 부팅 과정 => 컴퓨터 전원을 처음 켜면 BIOS라고 하는 비휘발성 펌웨어에 있는 소형 부트 로더가 실행된다. 이 부트 로더는 일반적으로 부트 블록이라고 하는 디스크의 정해진 위치에 있는 두 번째 부트 로더를 적재하는 작업만 한다.

- 많은 최신 컴퓨터 시스템이 UEFI(Unified Extensible Firmware Interface)로 대체하였다. => BIOS와 비교할 때의 장점 : 64비트 시스템과 용량이 큰 디스크를 더 잘 지원한다. UEFI가 하나의 완전한 부팅 관리자이므로 더 빠르다.

- 부트스트랩 프로그램은 커널 프로그램이 포함된 파일을 메모리에 적재하는 것 외에도 진단을 실시하여 메모리와 CPU를 점검하고 장치 검색과 같은 시스템 상태를 확인한다.

- GRUB : Linux 및 UNIX 시스템을 위한 공개 소스 부트스트랩 프로그램

- 부트 메커니즘은 부트 로더와 독립적이지 않다. => BIOS와 UEFI용 특정 GRUB 부트 로더 버전이 있으며 펌웨어는 어떤 특정 부트 로더가 사용되는지 알아야 한다.

- 대부분의 운영체제의 부트 로더는 하드웨어 문제 진단, 손상된 파일 시스템 복구 및 운영체제 재설치 등의 작업을 할 수 있는 복구 모드 또는 단일 사용자 모드로 부팅할 수 있는 기능을 제공한다.


운영체제 디버깅

- 디버깅 : 넓게는 하드웨어와 소프트웨어에서의 시스템의 오류를 발견하고 수정하는 행위

- 시스템에서 처리 중에 발생하는 병목 현상을 제거하여 성능을 향상시키려는 성능 조정도 디버깅에 포함된다.

 

장애 분석

- 운영체제 대부분은 프로세스 실패 시 오류 정보를 로그 파일에 기록한다. 또한 프로세스가 사용하던 메모리를 캡처한 코어 덤프(core dump)를 취하고 차후 분석을 위해 파일로 저장한다.

- 커널 장애는 크래시(crash)라고 불린다. 프로세스 장애와 마찬가지로 오류 정보가 로그 파일에 저장되고 메모리의 상태가 크래시 덤프(crash dump)에 저장된다.


성능 관찰 및 조정

- 병목 지점을 제거함으로써 성능을 향상시킨다. => 병목 지점을 발견하기 위해 시스템 성능을 감시할 수 있다.

 

카운터

- 운영체제는 일련의 카운터를 통해 호출된 시스템 콜 횟수 또는 네트워크 장치 또는 디스크에 수행된 작업 수와 같은 시스템 활동을 추적한다.

- ps, top, vmstat, netstat, iostat

- Linux 시스템의 카운터 기반 도구 대부분은 /proc 파일 시스템에서 통계를 읽는다. /proc은 커널 메모리에만 존재하는 "의사" 파일 시스템이며, 주로 다양한 프로세스 별 통계와 커널 통계를 질의하는 데 사용된다.

- Windows 시스템은 Windows 작업 관리자를 제공한다.


추적

- 카운터 기반 도구는 커널에서 유지 관리하는 특정 통계의 현재 값에 대해 간단히 문의하는 반면, 추적 도구는 시스템 콜과 관련된 단계와 같은 특정 이벤트에 대한 데이터를 수집한다.

- strace, gdb, perf, tcpdump


BCC

- 사용자 수준과 커널 코드의 상호 작용을 디버깅하는 것은 양쪽의 코드를 이해하고 상호작용을 계측할 수 있는 도구의 집합 없이는 거의 불가능하다. => 그런 도구 집합은 디버깅을 염두에 두지 않고 작성된 부분을 포함한 시스템의 어느 부분도 디버깅할 수 있어야 하며, 시스템의 안정성을 해치지 않고 작업할 수 있어야 한다. 또한 성능에 미치는 영향을 최소로 해야 한다.

- BCC 도구 집합은 위의 요구 조건을 만족시키면서 동적이고, 안전하며 낮은 영향력을 미치는 디버깅 환경을 제공한다.

- BCC(BPF Compiler Collection)는 Linux 시스템을 위한 추적 기능을 제공하는 풍부한 툴킷이다.

- BCC는 시스템에 해를 끼치지 않고 중요한 응용 프로그램을 실행하는 실제 프로덕션 시스템에서 해당 도구를 사용할 수 있다는 점에서 특히 강력하다.