참고
커널 구성요소
NOTE
리눅스 커널은 모놀리식 커널(모든 구성요소가 단일 바이너리의 일부)이지만 코드베이스에는 특정 역할을 식별하고 부여할 수 있는 기능 영역이 나뉘어 있다.
커널에서 하는 5가지를 확인!
•
하드웨어 계층
◦
CPU와 메인 메모리부터 디스크 드라이브, 네트워크 인터페이스는 물론 키보드나 모니터 같은 주변 디바이스를 말한다.
•
커널 계층
◦
커널 - 사용자 영역 사이에는 init시스템과 시스템 서비스(네트워킹 등)처럼 많은 구성요소가 있다.
◦
엄밀히 말하면 이들은 커널의 일부가 아니다.
•
사용자 영역 계층
◦
shell같은 운영체제의 구성요소, ps나 ssh같은 유틸리티, x윈도우 시스템 기반 데스크톱 같은 그래픽 사용자 인터페이스를 비롯해 대부분의 앱이 실행되는 곳을 일컫는다.
프로세스 관리
NOTE
커널에는 프로세스 관리(인터럽트, 실행, 스케줄링)을 진행할 수 있다!
리눅스에서는 아래와 같이 가장 큰 단위에서 가장 작은 단위로 나눌 수 있다.
•
세션(SID)
◦
하나 이상의 프로세스 그룹을 포함하고 선택적으로 tty(프로세스가 연결된 터미널)가 연결된 상위 수준의 사용자 대면 유닛을 나타낸다.
•
프로세스 그룹(PGID)
◦
하나 이상의 프로세스가 포함돼 있으면 한 세션에는 포어그라운드 프로세스 그룹이 둘 이상일 수 없다.
•
프로세스(PID)
◦
실행 가능한 프로그램을 기반으로하며, 사용자가 대면하는 유닛
◦
여러 리소스를 그룹으로 추상화한 것이며, 커널은 /proc/self를 통해 현재 프로세스를 사용자에게 노출한다.
•
스레드(TID, TGID)
◦
프로세스 컨텍스트상의 실행 유닛, 커널에 의해 프로세스로 구현된 유닛을 말한다.
◦
스레드를 나타내는 전용 데이터 구조는 없으며, 스레드는 특정 리소스를 다른 프로세스와 공유하는 프로세스다.
•
태스크
◦
커널에는 schedule.h에 정의된 task_struct라는 데이터 구조가 있으며, 이는 프로세스와 스레드 구현의 기반을 형성한다.
◦
이 데이터 구조는 스케줄링 관련 정보, 식별자, 시그널 처리기, 성능이나 보안과 관련된 기타 정보를 수집한다.
프로세스는 그림의 상태중 하나를 가진다.
•
엄밀히 말하면 프로세스는 이보다 더 복잡하다.
◦
인터럽트 가능한 절전 모드와 인터럽트 불가능한 절전 모드를 구분한다.
◦
좀비 상태(부모 프로세스를 잃은 상태)
•
이벤트가 일어날 때마다 상태 전환이 발생하며, 실행 중인 프로세스가 I/O 작업을 진행했으나 이를 실행할 수 없을 때 대기 상태로 전환될 수 도 있다.
메모리 관리
NOTE
커널은 컴퓨터 시스템의 메모리 리소스를 효율적으로 할당하는 역할을 담당한다!
메모리 자원 접근 및 할당
가상 메모리를 통한 메모리 효율성 증가.
모든 프로세스는 많은 (가상) 메모리를 가지며, 가상 메모리의 동작 방식과 같다.
•
물리 메모리와 가상 메모리는 모두 페이지라고 불리는 고정 길이의 청크로 나뉜다.
•
각 프로세스 수준의 페이지 테이블을 통해 가상 페이지가 동일한 물리적 페이지를 가리킬 수 있다.
•
이를 통해서 각 프로세스에 그들의 페이지가 실제로 RAM에 존재한다는 환상을 일으킨다.
•
CPU가 프로세스의 가상페이지에 접근한다면 물리 주소로 변경해줘야 한다.
grep MemTotal /proc/meminfo. # 물리적 메모리에 대한 세부정보
grep VmallocTotal /proc/meminfo # 가상메모리 세부정보
gre Huge /proc/meminfo # 대형 페이지 정보 나열
Bash
복사
메모리 관련 정보를 확인하는 명령어
네트워킹
NOTE
커널은 네트워크 인터페이스 관리나 보안, 데이터 전송의 효율성을 관리할 수 있다!
리눅스의 네트워크 스택은 아래의 계층화된 아키텍쳐를 따른다.
•
소켓: 추상화된 커뮤니케이션을 위해 추상화
•
전송 제어 프로토콜(TCP) 및 사용자 데이터그램 프로토콜(UDP): 연결형 통신과 비연결형 통신
•
인터넷 프로토콜: 기기의 주소 지정을 위해 필요
HTTP나 SSH같은 애플리케이션 계층 프로토콜은 주로 사용자 영역에서 구현된다. 다음에서 네트워크 인터페이스 개요를 확인할 수 있다.
ip link # nic 정보확인
ip route # 라우트 정보
Bash
복사
파일시스템
NOTE
커널은 컴퓨터 시스템의 메모리 리소스를 효율적으로 할당하는 역할을 담당한다!
리눅스는 파일시스템을 이용해 하드 디스크 드라이브(HDD), 솔리드 스테이트 드라이브(SSD)와 같은 저장 디바이스의 파일과 디렉터리를 구성한다.
•
ext4, brtfs, NFTS와 같은 다양한 유형의 파일시스템이 있으며 동일한것도 여러개 사용가능
가상 파일시스템(VFS)는 원래 여러 파일시스템을 지원하기위해 도입되었다.
•
VFS는 공통 API 추상화를 제공하며, VFS의 촤하위 계층은 주어진 파일시스템에 대한 플러그인이라고 불리는 파일시스템 추상화다.
디바이스 드라이버
NOTE
커널은 컴퓨터 시스템의 메모리 리소스를 효율적으로 할당하는 역할을 담당한다!
•
드라이버는 커널에서 실행되는 코드이다.
◦
키보드, 마우스, 하드디스크와 같은 실제 하드웨어 디바이스나 의사 터미널 디바이스를 관리하는 것이다.
•
하드웨어 클래스 중 그래픽 처리장치(GUI)는 전통적으로 그래픽 출력을 가속화하고 CPU부하를 완화할때 사용되었다.
ls -al /sys/devices/ # 드라이버 상호작용 힌트?
mount # 마운트된 디바이스 나열
Bash
복사
시스템콜, 이중모드(유저 - 커널)
NOTE
커널에서는 중요한 자원을 관리하기 때문에, 그 중요한 자원에 접근하지 못하도록 모드를 2가지로 나누었다.
운영체제가 응용 프로그램들이 자원에 접근하려할 떄 자기자신을 통해서만 접근하도록 함
사용자 모드 커널모드는 생각보다 자주자주 변경된다.
유저모드(상대적으로 느리지만 안전하고 편리한 추상화)
•
유저(사용자)가 접근할 수 있는 영역을 제한적으로 두고, 프로그램의 자원에 함부로 침범하지 못하는 모드이다.
•
일반적으로 코드 작성, 프로세스를 실행하는 행동을 할 수 있다.
•
커널모드로 넘어가기 위해서는 system call로 커널에 요청을 해야 한다.
커널모드(추상화를 제한함으로써 빠르게 실행)
•
모든 자원(드라이버, 메모리, CPU)에 접근하고 명령할 수 있다.
•
유저모드와 달리 컴퓨터 내부에서 모든 행동을 할 수 있다.
•
system call의 요청을 받은 커널의 작업이 끝나면 결과값을 리턴하고 유저모드로 돌아온다.
리눅스의 시스템 콜 실행 단계
대표적인 시스템 호출 메서드 (자원에 관련된게 많다.)
시스템 콜은 일반적으로 C표준 라이브러리라고 부르는것을 통해 호출한다.
1.
syscall.h와 아키텍쳐 종속 파일에 정의되어 메모리에 있는 함수 포인터 배열(sys_call_table 이라는 변수에 저장됨)을 통해 시스템 콜과 핸들러 추적
2.
시스템 콜 멀티플렉서처럼 동작하는 system_call() 함수를 사용하면 먼저 하드웨어 컨텍스트를 스택에 저장 다음 검사를 수행하고 sys_call_table의 각 시스템 콜 번호의 인덱스가 가리키는 함수로 점프
3.
sysexit 시스템콜 완료되면 래퍼 라이브러리는 하드웨어 컨텍스트를 복구하고 프로그램은 실행은 사용자 영역에서 시작