Skip to content

Latest commit

 

History

History
204 lines (125 loc) · 11.6 KB

윤준석_Kernel.md

File metadata and controls

204 lines (125 loc) · 11.6 KB

Kernel

🖥️ 커널이란?

kernel

  • 하드웨어와 가장 가까이 있는 일종의 프로그램으로 항상 메모리에 상주하며 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공하는 역할을 함.
  • 즉, 컴퓨터 자원들을 관리하는 역할을 함.
  • 다만, 커널은 항상 컴퓨터 자원들을 바라만 보고 있기 때문에 사용자(user)와의 상호작용은 지원하지 않음 -> 사용자와의 직접적인 상호작용을 위한 shell이라는 프로그램이 존재함.

linux_kernel

windowsnt_kernel

Shell

shell

  • 사용자와 커널 사이에 위치하여 사용자가 커널에게 명령을 내리는 역할을 함.
  • 정확하게는 응용 프로그램의 명령어와 커널이 대화할 수 있도록 해줌. -> 이를 명령어 해석기라고 부름.
  • 커널마다 각각의 쉘을 가지고 있으며 종류도 다양함. Linux 커널의 경우 대표적으로 sh, csh, tcsh, ksh, bash, zsh 등이 있음.

linux_shell

Bourne Shell (/bin/sh)

  • 가장 기본적인 쉘, 유닉스 최초의 쉘.
  • 최초의 쉘이라 기능이 매우 단순함.
  • 일반 유저의 쉘 프롬프트는 $로 표시되며, root 유저의 쉘 프롬프트는 #로 표시됨.

bourne_shell

C Shell (/bin/csh)

  • C언어로 작성된 쉘로 Bourne Shell의 단점을 보완하기 위해 개발됨.
  • C언어 구문과 유사한 shell 문법을 가짐.

TC Shell (/bin/tcsh)

  • C shell에 명령행 완성과 명령행 편집 기능을 추가한 쉘.

Korn Shell (/bin/ksh)

  • Bourne Shell의 단점을 보완하기 위해 개발된 쉘로 csh의 기능들을 포함하여 개발됨.
  • Unix 계열에서 많이 사용됨.

Bourne Again Shell (/bin/bash)

  • Bourne Shell의 단점을 보완하기 위해 개발된 쉘로 현재 리눅스에서 표준으로 채택된 쉘임.
  • cshksh의 기능들을 통합/보완하여 개발됨.
  • sh에 비해 확장된 기능을 제공함.
    • history, alias, 자동 완성(tab), 연산, job control, etc.

커널의 자원 관리

kernel_resource

  • 커널의 가장 큰 목표는 시스템의 물리적 자원(하드웨어)과 추상화 자원을 관리하는 것임.
  • 추상화 자원이란?
    • 물리적으로 하나뿐인 자원을 여러 사용자(프로세스)들이 번갈아 사용할 수 있도록 여러개처럼 보이게 하는 것.
    • 커널이 물리적 자원을 관리함에 따라 각 사용자(프로세스)들이 하나의 하드웨어를 독점하는 것처럼 느낄 수 있도록 함.
  • 커널을 다음과 같은 작업을 수행함.
    • Task(Process) Management: 물리적 자원인 CPU를 추상적 자원인 Task로 제공
    • Memory Management: 물리적 자원인 메모리를 추상적 자원인 Page 또는 Segment로 제공
    • File System: 물리적 자원인 디스크를 추상적 자원인 File로 제공
    • Network Managment : 물리적 자원인 네트워크 장치를 추상적 자원인 Socket으로 제공
    • Device Driver Management : 각종 외부 장치에 대한 접근
    • Interrupt Handling : 인터럽트 핸들러
    • I/O Communication : 입출력 통신 관리

linux_kernel_manager

커널의 종류

Monolithic Kernel

  • 커널의 기능들(VFS, IPC, File System 등)을 하나의 커널에서 직접 처리하는 방식.
  • 각각의 서비스들은 커널 내부의 여러 계층에서 관리되며 사용자가 시스템 자원을 시스템 콜을 통해 사용할 수 있게 해줌.

linux_kernel

  • 모든 기능들이 하나의 커널에서 직접 처리되므로 커널 내부에서 서비스들이 시스템 자원을 공유하므로 효율적이며 속도가 빠른 장점이 있음.
  • 반면에 같은 맥락에서 커널의 크기가 크고, 하나의 오류만 발생해도 전 체 시스템에 영향을 줄 수 있으며, 커널의 기능이 늘어날수록 커널의 크기가 커지고 복잡해지는 단점이 있음.
  • 초기의 모놀리식 커널은 단일 모듈이었기 때문에 내부 서비스의 추가 및 수정이 어려웠으나, 현재는 모듈화되어 있어서 서비스의 추가 및 수정이 용이함.
  • 대표적인 모놀리식 커널을 사용하는 OS에는 Unix, Linux, MS-DOS, 윈도우 9X, Mac OS 8.6 이하 등이 있음.

Micro Kernel

micro_kernel

  • 기존의 모놀리식 커널에서 핵심 서비스(Process Management, Memory Management, Network Management)만을 남겨두고 나머지를 제외하여 가볍게 만든 커널.

micro_kernel_vs_monolithic_kernel

  • 기존의 모놀리식 커널의 시스템 서비스들(VFS, IPC, Device Driver 등)을 마이크로 커널에서는 개별적인 서버의 형태로 존재함.
  • 마이크로 커널은 핵심 서비스만을 가지고 있고 서버를 추가하는 방식이기에 커널 변경 없이 간단히 기능을 추가 및 수정할 수 있음.
  • 또한 프로세스가 각각의 서버 영역에서 수행되기 때문에 하나의 서비스가 다운되어도 다른 서비스에 영향을 끼치지 않음.
  • 하지만 커널 내의 서비스들이 각각의 서버 영역에 존재하므로 서비스끼리 리소스 공유를 위해서는 컨텍스트 스위칭이 필수적으로 발생하게 되어 성능 저하가 발생할 수 있음.
  • 대표적인 마이크로 커널을 사용하는 OS에는 Mach, 심비안 등이 있음.

Hybrid Kernel

windows_hybrid_kernel

  • 모놀리식 커널과 마이크로 커널의 장점을 결합한 커널.
  • 기존의 모놀리식 커널과 다를 것이 없다는 의견도 있음.

Linux Kernel

linux_source_level

linux_source

kernel

linux_kernel

  • 태스크 관리자가 구현된 디렉터리.
  • 태스크의 생성 및 소멸, 프로그램 실행, 스케쥴링, 시그널 처리등의 기능 구현.

arch

linux_arch

  • 하드웨어 종속적인 부분들이 구현된 디렉터리.

  • arch/x86: x86 아키텍처에서 사용되는 하드웨어 종속적인 부분들이 구현된 디렉터리. 여러 종류의 CPU 아키텍ㅊ처를 지원하기 위해 아키텍처별로 디렉터리를 구분함. x86, arm, mips, arc 등이 있음.

linux_arch_x86

  • arch/x86/boot: 시스템 부팅 시 사용하는 부트로더가 구현된 디렉터리.

linux_arch_x86_boot

  • arch/x86/kernel: 태스크 관리자 중 컨텍스트 스위칭 및 쓰레드 관리 기능이 구현된 디렉터리.

linux_arch_x86_kernel

  • arch/x86/mm: 메모리 관리자 중 페이징 및 하드웨어 종속 부분이 구현된 디렉터리.

linux_arch_x86_mm

  • arch/x86/lib: 커널이 사용하는 라이브러리 함수가 구현된 디렉터리.

linux_arch_x86_lib

  • arch/x86/math-emu: FPU(Floting Point Unit) 관련 기능이 구현된 디렉터리.

linux_arch_x86_fpu

fs

  • 다양한 파일시스템과 시스템 호출이 구현된 디렉터리.
  • open(), read(), write()와 같은 시스템 콜이 구현되어 있음.

linux_fs

mm

  • 메모리 관리자가 구현된 디렉터리.
  • 물리적 메모리, 가상 메모리, 동적 메모리 관리 기능이 구현되어 있음.

linux_mm

driver

  • 디바이스 드라이버가 구현된 디렉터리.
  • 여러가지 디바이스 드라이버가 구현되어 있음.
    • block device driver: 파일 시스템이 사용하는 디바이스 드라이버.
    • char device driver: 터미널이나 키보드 등의 장치파일을 위한 디바이스 드라이버.
    • network device driver: tcp, ip 등 네트워크를 위한 디바이스 드라이버.

linux_driver

net

  • 통신 프로토콜이 구현된 디렉터리.
  • TCP/IP 뿐만 아니라 UNIX domain socket, 802.11, IPX, RPC, 이더넷, 블루투스 등 다양한 통신 프로토콜이 구현되어 있음.
  • 사용자 인터페이스를 제공하는 소켓이 해당 디렉터리에 구현되어 있음.

linux_network

ipc

  • IPC(Inter Process Communication) 기능이 구현된 디렉터리.
  • 파이프는 fs에 시그널은 kernel에 소켓은 net에 구현되어 있음.

linux_ipc

init

  • 커널 초기화 부분, 커널의 메인 시작 함수가 구현된 디렉터리.
  • start_kernel() 함수를 통해 커널을 전역적으로 초기화함.

linux_init

linux_init_start_kernel

include

  • 헤더 파일들을 모아 놓은 디렉터리.

linux_include


linux_source