커널

sameul__choi·2021년 8월 2일
0

Operation System

목록 보기
2/3

커널


Mentor's Qusetion

1. OS에서 Kernel이 하는 역할은 정확히 무엇이고 어떠한 종류가 있는가?

2. 단순하고, 성능 좋은 Monolithic Kernel만 사용하면 될 텐데... 왜 여러 커널이 생겨났을까요? 각 Kernel별 장단점에 대해서 알아봐요~

3. Unix 및 Linux 계열의 역사. (Ubuntu, CentOS, MacOS, )

4. User space와 Kernel space를 나눈 이유는 무엇이냐

1. About Kernel

  • Computer Science에서 커널(kernel)은 컴퓨터의 OS의 핵심이 되는 컴퓨터 프로그램의 하나로, 시스템의 모든것을 완전히 통제한다. OS의 다른 부분 및 응용 프로그램 수행에 필요한 여러 가지 서비스를 제공한다.

2. 커널의 역할

커널은 운영체제의 핵심 부분, 커널의 역할 역시 운영체제의 핵심 역할이라고 할 수 있다.

  • 커널은 컴퓨터 하드웨어와 프로세스의 보안을 책임지고,

  • 한정된 시스템 자원을 효율적으로 관리, 프로그램의 실행을 원활하게 한다. 특히 프로세스에 처러기를 할당하는 것을 스케줄링이라고 한다.

  • 같은 종류의 부품에 대해 다양한 하드웨어를 설계할 수 있기 때문에 하드웨어에 접근하는 것은 문제를 복잡하게 만든다. 일반적으로 커널은 OS의 복잡한 내부를 감추고 깔끔하고 일관성있는 Interface를 하드웨어에 제공하기 위해 몇가지 추상화들로 구현된다. (자바..OOP....추상화? 추상화라는 개념은 CS에서 굉장히 많은 범위에서 잘 쓰이는구나. OS를 강조한 멘토님의 말씀이 이해가 간다)

3. 커널의 역사

초기의 커널로 부터

초창기의 컴퓨터에서 운영 체제 커널은 필수적인 것이 아니었다. 초기의 프로그램은 하드웨어 추상화나 운영 체제의 지원을 받지 않고도 컴퓨터만으로 불러들인 다음 실행될 수 있었으며, 이것은 초창기 컴퓨터들의 일반적인 운영 방식이었다. 다른 프로그램을 실행하기 위해서는 컴퓨터의 전원을 껐다가 켬으로써 다시 입력자료를 읽어들여야 하는 방식이었다. 이러한 과정이 반복되면서 사람들은 로더디버거 같은 작은 프로그램들이 상주해 있는 것이, 다른 프로그램으로 교체하거나 새로운 프로그램을 개발하는 데 유리하다는 사실을 알게 되었다. 이와 같은 로더, 디버거들이 초기 운영 체제 커널의 기초가 되었다.

4. 커널의 종류

1. 단일형 커널

커널의 다양한 서비스 및 높은 수준의 하드웨어 추상화를 하나의 덩어리(주소 공간)로 묶은 것이다. 운영 체제 개발자 입장에서 유지 보수가 일반적으로 더 어려우나 성능이 좋다.

  • Monolithic kernel은 커널의 구조 및 설계 사상을 가르키는 용어이다. 단일형 커널이라고도 하는데, 입출력 기능, NW기능, 장치 지원 등 운영 체제의 일반적인 기능커널과 동일한 메모리 공간에 적재, 실행하는 기법을 말한다.

  • 대표적인 모놀리식 커널 OS : 고전적인 UNIX 계열 운영체제

  • 마이크로 커널과의 관계에 대하여

    • 운영 체제의 구성요소를 단일의 메모리 공간에서 실행하는 모놀리식 커널에 대해, OS를 구성하는 몇 개의 요소, 기능을 커널 공간으로부터 떼어내어, 외부 모듈화하는 등으로 추가하는 기법을 마이크로 커널이라고 부른다. 모놀리식 커널의 설계 사상 및 개념 그 자체는 예전부터 존재했지만, 모놀리식 커널이라고 하는 용어가 성립된 것은, 마이크로 커널이라는 개념이 등장하면서 그 반대 개념으로서 명명되었다.
  • 커널 구현 방식에 대하여

    • 마이크로 커널 방식의 OS에 비해 운영 체제의 기능의 거의 모든 것이 단일 메모리에서 행해진다. 동일한 프로세스를 처리할 때 사용되는 문맥 교환이나 프로세스 간 통신 등에 의한 과부하는 상대적으로 적어서, 실질적인 성능 면에서 유리하다는 주장이 있다.

    • 20세기 말에서 21세기에 이르면서, 클럭이 장족의 진보를 이루어 처리능력이 몇 배 향상하면서, L4 프로젝트에서 프로세스간 통신의 튜닝등을 통한 마이크로커널 구현 시 고속화 기법이 진전되고, 필요에 따라 마이크로 커널적인 구조를 기반으로 하면서, 일부 성능이 요구되는 하부 조직만 커널 공간에 추가한다던지, 모놀리식 커널을 기반으로 하면서도 유연성이나 신뢰성이 요구되는 부분을 마이크로 커널적인 설계 방법을 도입하기도 하는 등, 현실적인 하이브리드 커널로 부를 수 있는 설계 방법도 등장했다.

    • 한편, 모놀리식 커널에 여러 기능을 중도에 추가하여 덩치가 커지게 되면 운영 체제의 기능을 동적으로 바꾸거나 갱신하거나 하는 것이(마이크로 커널과 비교했을 경우에) 어렵게 되는 문제가 발생할 가능성이 높다.

      연구 개발의 세계에서는 커널의 기능을 최소한으로 하는 마이크로 커널이 주류가 된 1990년대 당초, 모놀리식 커널을 시대착오라고 생각되기도 했다. 그러나 구현 수준의 차이가 작동 상의 치명적인 설계 문제는 아니며, 현재는 필요한 기능을 필요한 성능 수준으로만 제공할 수 있으면 문제가 없다고 결론되었다.

2. 마이크로 커널

마이크로커널(microkernel) - 하드웨어 추상화에 대한 간결한 작은 집합을 제공하고 더 많은 기능은 서버라고 불리는 응용 소프트웨어를 통해 제공한다.

  • 마이크로 커널은 컴퓨터 과학에서 운영체제에 추가 되어야 하는 메커니즘을 최소한으로 제공하는 초소형 커널
  • 이러한 미니멀리티 메커니즘에는 낮은 수준의 주소 공간 관리, 스레드 관리, 프로세스 간 통신(IPC)을 포함한다.
왜 마이크로 커널이 나오게 되었나요 ?

마이크로커널은 1980년대에 컴퓨터 세상의 변화에 발맞추고 기존의 모노 커널(mono-kernel)을 이 새로운 시스템에 적응시키는 데 대한 문제점에 마주하면서 개발되었다. 새로운 장치 드라이버, 프로토콜 스택, 파일 시스템 및 기타 낮은 수준의 시스템들이 내내 개발되고 있었다. 이 코드는 일반적으로 모놀리딕 커널에 위치했기 때문에 상당한 작업과 주의가 필요한 코드 관리가 필요했다.

단일형 커널의 연산들 (프로세스 관리, 동시성, 메모리관리 등 운영체제 서비스를 구현하기 위한 시스템 콜)을 제공하는 모든 모듈이 전체로부터 분리되어 있더라도 모든 모듈이 같은 주소 공간에서 실행되기 때문에 코드의 집적도는 매우 조밀하며 수정하기 어렵고 한 모듈의 버그는 시스템 전반을 멈추게 할 수 있다.

그럼 왜 모놀리딕을 아직도 쓰는거야?**
- 모놀리딕 커널은 구현이 신뢰할 수 있을 정도로 완성되면 구성 요소의 내부 집적이 내부의 시스템 이용을 효과적이게 하여 높은 효율을 보이기 때문이다. 단일형 커널의 지지자들은 코드의 정확성 여부와 그런 코드(부정확한 코드)가 커널에 포함되었는지를 확인할 수 있고 그것은 마이크로커널에 비해 조금 더 우위에 있다고 주장한다.
마이크로 커널 설계에 소극적...

운영 체제는 서버를 다른 일반적인 프로그램처럼 간단히 시작하고 끌 수 있다. 이를테면 네트워킹 지원이 필요 없는 작은 시스템에서는 간단히 서버를 끄면 된다. 이 경우 전통적인 시스템에서는 재컴파일이 필요했고 일반 사용자의 능력 밖의 일이다. 이론적으로 마이크로커널에서 시스템은 더 안정적이다. 서버가 중단될 때 커널의 충돌이 아니기 때문에 단 하나의 프로그램만 내려버리면 된다.

그러나 서버가 실패한 후 시스템 상태도 잃어버릴 경우 응용 프로그램이 계속 수행되는 것은 그 응용 프로그램이 막 복사된 다른 서버를 이용하게 되더라도 보통은 매우 힘들다. 예를 들어 TCP/IP 연결을 요구하는 (이론적인) 서버가 다시 시작되면 응용 소프트웨어는 연결이 "끊어졌습니다."라고 말하고 서버의 새 인스턴스를 찾아서 다시 연결한다. 그러나 파일과 같은 다른 시스템 객체는 이렇게 편리한 의미론이 없다. 이러한 편리가 믿음직스럽지 못하고 마음대로 이용할 수 없다. 기록할 정보들은 모두 미리 보관해 두어야 한다. 서버 간의 하나의 서버를 다시 시작할 때 중요 상태를 보호하기 위해 트랜잭션, 복제, 대조점데이터베이스 기술이 요구된다.

일반적으로 마이크로 커널은 전통적인 디자인의 수행을 잘 하지 못한다. 거기다가 극단적이다. 그 이유는 application과 server 간의 자료교환을 위해 커널을 출입하는 context switching 때문이다. 오버헤드를 극적으로 줄여줄 것 으로 기대했지만, 90년대 중반부터 대부분의 연구원들이 시도를 포기했다. (why? 포기한지 아시나요) 이 후 최근에 성능을 최우선으로 설계하여 이 문제에 대해 넓은 부분에서 다루고는 있다만, 현 운영체제 시장은 자기 몸을 사리며 마이크로커널 설계에 소극적이라고 한다.

3. 혼합형 커널

  • 하이브리드 커널(hybrid kernel)은 컴퓨터 운영 체제에서 쓰이는 마이크로커널모노리딕 커널 아키텍처라는 양면을 합쳐 놓은 커널 아키텍처이다. 이 구조는 모노리딕 커널과의 유사성 때문에 논란이 되기도 한다. 어떤 사람들은 이 용어가 단지 마케팅을 위한 용어일뿐이라며 일축하기도 한다. 보통 모노리딕 커널과 마이크로커널이라는 구분이 받아들여진다.
  • 혼합형 커널은 본질적으로 마이크로커널을 따르나, 일부 커널의 비(非)본질적 기능이더라도 사용자 레벨에서 수행될 때 성능상 느린 코드들을 커널 레벨에서 수행하도록 수정한 것을 말한다. 이는 다양한 운영 체제 개발자들이 마이크로커널 기반의 설계를 받아들이던 시점에 순수한 마이크로커널의 성능상의 한계를 인식하고 타협한 결과이다.

4. 나노 커널

나노커널(nanokernel) - 실질적으로 모든 서비스를 책임진다.

5. 엑소커널

엑소커널(exokernel) - 낮은 수준의 하드웨어 접근을 위한 최소한의 추상화를 제공한다. 전형적으로 엑소커널 시스템에서는 커널이 아닌 라이브러리가 단일형 커널 수준의 추상을 제공한다.

5. What is the difference between the kernel space and the user space ?

The really simplified answer is that the kernel runs in kernel space, and normal programs run in user space. User space is basically a form of sand-boxing -- it restricts user programs so they can't mess with memory (and other resources) owned by other programs or by the OS kernel. This limits (but usually doesn't entirely eliminate) their ability to do bad things like crashing the machine.

The kernel is the core of the operating system. It normally has full access to all memory and machine hardware (and everything else on the machine). To keep the machine as stable as possible, you normally want only the most trusted, well-tested code to run in kernel mode/kernel space.

The stack is just another part of memory, so naturally it's segregated right along with the rest of memory.

출처 : https://stackoverflow.com/questions/5957570/what-is-the-difference-between-the-kernel-space-and-the-user-space/9867964

꼭읽어보기 ! ! !

ring 0 ? ring 3 ?

CPU rings are the most clear distinction

In x86 protected mode, the CPU is always in one of 4 rings. The Linux kernel only uses 0 and 3:

  • 0 for kernel
  • 3 for users

This is the most hard and fast definition of kernel vs userland.

Why Linux does not use rings 1 and 2: CPU Privilege Rings: Why rings 1 and 2 aren't used?

How is the current ring determined?

The current ring is selected by a combination of:

  • global descriptor table: a in-memory table of GDT entries, and each entry has a field Privl which encodes the ring.

    The LGDT instruction sets the address to the current descriptor table.

    See also: http://wiki.osdev.org/Global_Descriptor_Table

  • the segment registers CS, DS, etc., which point to the index of an entry in the GDT.

    For example, CS = 0 means the first entry of the GDT is currently active for the executing code.

What can each ring do?

The CPU chip is physically built so that:

  • ring 0 can do anything

  • ring 3 cannot run several instructions and write to several registers, most notably:

    • cannot change its own ring! Otherwise, it could set itself to ring 0 and rings would be useless.

      In other words, cannot modify the current segment descriptor, which determines the current ring.

    • cannot modify the page tables: How does x86 paging work?

      In other words, cannot modify the CR3 register, and paging itself prevents modification of the page tables.

      This prevents one process from seeing the memory of other processes for security / ease of programming reasons.

    • cannot register interrupt handlers. Those are configured by writing to memory locations, which is also prevented by paging.

      Handlers run in ring 0, and would break the security model.

      In other words, cannot use the LGDT and LIDT instructions.

    • cannot do IO instructions like in and out, and thus have arbitrary hardware accesses.

      Otherwise, for example, file permissions would be useless if any program could directly read from disk.

      More precisely thanks to Michael Petch: it is actually possible for the OS to allow IO instructions on ring 3, this is actually controlled by the Task state segment.

      What is not possible is for ring 3 to give itself permission to do so if it didn't have it in the first place.

      Linux always disallows it. See also: Why doesn't Linux use the hardware context switch via the TSS?

0개의 댓글