Search
Duplicate
📒

[Linux CLI] 01-2. 커널 구성요소

상태
완료
수업
Linux
주제
4 more properties
참고

커널 구성요소

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 시스템콜 완료되면 래퍼 라이브러리는 하드웨어 컨텍스트를 복구하고 프로그램은 실행은 사용자 영역에서 시작