들어가기 전에
학교 수업 때 배운걸 다시 정리해서 쓴 글입니다.
오타 및 잘못된 부분 지적은 언제나 환영입니다!
커널에 대해 대략적인 부분만 다루기 때문에 세부 내용들에 대해선 다루지 않습니다
커널이란?
운영체제에서 가장 핵심적인 부분
운영체제는 하드웨어와 소프트웨어 사이에 위치에 하드웨어의 자원 접근을 대신 관리해주고,
소프트웨어 최적의 상태로 실행 될 수 있도록 지원한다.
그만큼 운영체제는 많은 기능들이 있지만, 이를 모두 메모리에 올리는 것은 낭비다.
따라서, 핵심 기능만 메모리에 올리게 됐는데 이 기능들을 통틀어 커널이라 한다.
커널 모드
사용자가 하드웨어에 직접 접근을 하는 것은 치명적인 결과를 가져올 수 있다.
우리가 사용하는 유저 모드에서 하드웨어 자원에 접근하기 위에선 운영체제에 맡겨야 한다.
이 과정에서 프로세스의 자원은 운영체제가 사용하게 되는데 이렇게 전환된 모드를 커널 모드라 한다.
커널 모드로의 전환은 인터럽트로 전환할 수 있다.
cpu는 커널 모드와 유저 모드를 구분하기 위해 내부적으로 모드 비트를 사용한다.
0 : 커널 모드, 1 : 유저 모드
커널 모드로 전환 과정
여기에 대해 알기 위해선 먼저 인터럽트에 대해 알아야 한다.
인터럽트
운영체제 커널을 통해 작업해야 할 일이 있을 때 CPU에 보내는 신호
커널에는 각 인터럽트마다 할 일이 구현돼 있다.
인터럽트 벡터는 알맞은 인터럽트 핸들러가 있는 메모리 위치를 가리킨다.
인터럽트 핸들링
인터럽트가 발생한 경우에 핸들러가 하는 일들의 절차다.
프로세스의 자원을 운영체제가 사용하기 때문에 프로세스는 이전의 상태를 저장해야 한다.
운영체제는 실행 중인 프로그램에 대해 프로세스 제어 블록(PCB, Process Control Block)을 하나씩 가지고 있다.
이 PCB에 현재 프로세스 상태를 저장한 뒤 작업을 시작하고
작업이 끝난 뒤 PCB를 통해 상태를 복구하고 자원 제어권을 다시 프로세스에 넘겨준다.
HW 인터럽트, SW 인터럽트
일반적으로 인터럽트라 하면 HW 인터럽트를 의미한다.
SW 인터럽트의 경우 트랩(trap)이라 불리고, 여기서도 예외(Exception)와 시스템 콜(System call)로 나뉜다.
근데 넓은 의미에서 SW 인터럽트도 그냥 인터럽트다.
예외(Exception)
주로 0 / 0으로 나누는 비정상적인 연산같이
syntax 관점에선 맞지만, semantic 관점에선 아닌 경우이다.
최근엔 0 / 0의 경우 syntax 검사에서 오류를 내긴 한다.
시스템 콜(System Call)
운영체제에 CPU 자원은 넘기기 싫은데 운영체네 내부에 정의된 코드를 실행하고 싶을 때 쓰는 방법
linux syscall을 검색해보면 어떤 시스템 콜이 있는지 나온다.
http://faculty.nps.edu/cseagle/assembly/sys_call.html
시스템 콜이 어떤 식으로 호출되는지 보는 과정은 어렵지 않다!
우리가 프로그래밍을 처음 배울 때 쓰는 hello world 출력을 기준으로 보자
이제 리눅스 디버깅 툴 중 하나인 strace를 사용해 위 코드를 실행하는데 어떤 system call과 signal이 사용됐는지 보자
사실 결과를 하나하나 분석할 필요는 없다.
그냥 printf 하나를 사용하기 위해 어떤 system call이 사용됐는지만 확인하고 넘어가도 된다.
'학교 > os' 카테고리의 다른 글
주소 변환 (0) | 2022.07.10 |
---|---|
문맥 교환(context switching) (0) | 2022.06.27 |
프로세스의 생성과 통신 (0) | 2022.06.26 |
프로세스 구조 (0) | 2022.06.26 |
DMA(Direct Memory Access) (0) | 2022.06.25 |