Yuanlijun의 기사 중 많은 부분이 Linux 커널의 기능에 관한 것이라는 것은 모두 알고 있습니다. 우리는 공개 계정의 원칙에 따라 원칙만 이야기하고 복잡한 코드를 이해하기 쉬운 텍스트와 그림으로 변환합니다. 드디어 여러분께 선보였습니다. Yuanli 씨는 대규모 프레임워크에서 Linux 커널 아키텍처를 체계적으로 분류한 적이 없다고 말할 수 있습니다. 그렇다면 이 글의 목적은 산 꼭대기에 서서 올려다보는 것입니다.
Linux 시스템의 계층적 프레임워크
그림에서 두 가지 레벨로 나눌 수 있습니다:
사용자 공간 커널 공간
하단에는 애플리케이션이 실행되는 사용자 공간이 있습니다. 사용자 공간의 상위 계층은 Linux 메모리 관리에 일반적으로 사용되는 gblic 라이브러리입니다. 그 기능은 시스템 호출 소켓을 캡슐화하는 것입니다. gblic 라이브러리를 사용하지 않고 수많은 시스템 호출 소켓을 직접 사용하는 것은 매우 현명하지 못한 선택입니다. 사용자 공간에서 실행되는 프로세스는 각각 고유한 가상 주소 공간을 갖고 있는 반면, 커널은 별도의 주소 공간을 갖습니다.
상위 레이어는 커널 공간입니다. Linux 커널 공간은 세 가지 계층으로 나뉩니다:
시스템 호출 계층; 가장 낮은 계층에 속하며 사용자 공간과 커널 공간 간의 통신 형태를 제공합니다. 리눅스 커널(Linux kernel): 더 정확하게는 아키텍처에 독립적인 커널 코드라고 해야 할 것이다. 이 범용 코드는 어떤 아키텍처에도 적용 가능하다. 아키텍처 종속 코드: 이 부분을 일반적으로 BSP라고 합니다. 이러한 종류의 코드는 주로 다른 플랫폼이나 프로세서와 호환되도록 도입됩니다.
Linux 커널은 많은 중요한 아키텍처 속성을 구현합니다. 더 높거나 낮은 수준에서 커널은 하위 시스템으로 정의됩니다. Linux는 모든 기본 서비스를 커널에 통합하므로 전체로 볼 수도 있습니다. 이는 마이크로커널 아키텍처와 다릅니다. 전자는 통신, I/O, 메모리 및 프로세스 관리와 같은 몇 가지 기본 서비스를 제공하며 보다 구체적인 서비스가 마이크로커널 계층에 삽입됩니다. 각 커널에는 고유한 장점이 있지만 여기서는 이에 대해 논의하지 않습니다.
시간이 지남에 따라 Linux 커널은 비디오 메모리 및 CPU 사용량 측면에서 더욱 효율적이었으며 매우 안정적입니다. 그리고 Linux의 가장 흥미로운 점은 이러한 크기와 복잡성에도 불구하고 여전히 뛰어난 이식성을 갖추고 있다는 것입니다. Linux는 다양한 아키텍처 제약 조건과 요구 사항을 지닌 수많은 프로세서와 플랫폼에서 실행되도록 컴파일되었습니다. 반례로는 Linux가 그래픽 메모리 관리 장치(MMU)가 있는 프로세서에서 실행되거나 MMU를 제공하지 않는 프로세서에서 실행될 수 있다는 것입니다. Linux 커널의 uClinux 포트는 비 MMU에 대한 지원을 제공합니다.
Linux 커널 아키텍처
Linux 커널의 주요 구성 요소는 다음과 같습니다.
시스템 호출 소켓 프로세스 관리, 비디오 메모리 관리, 가상 파일 시스템, 네트워크 스택, 장치 드라이버 및 하드웨어 아키텍처 관련 코드.
(1) 시스템 호출 소켓
시스템 호출 계층은 사용자 공간에서 커널로 함수 호출을 수행하는 개별 메커니즘을 제공합니다. 아키텍처에 따라 다릅니다. 이 계층에서는 다중화 및 역다중화 서비스가 제공됩니다.
(2) 프로세스 관리
프로세스 관리의 핵심은 프로세스 스케줄링입니다. Linux 커널에서 프로세스 스케줄링의 단위는 프로세스이며, 스레드는 스케줄링을 위한 프로세스의 개념과 동일합니다. 커널은 시스템 호출을 통해 애플리케이션 프로그래밍 소켓을 제공합니다. 예: 새 프로세스 생성(fork, exec), 프로세스 종료(kill, 종료), 제어 프로세스 제공linux 커널 이식 단계, 프로세스 동기화 및 프로세스 간 통신을 위한 소켓.
프로세스 관리에는 활성 프로세스 간에 CPU를 공유해야 하는 필요성을 처리하는 것도 포함됩니다. 커널은 CFS 완전 공정 스케줄러를 사용합니다. 이에 대해서는 이전 기사 "Linux 완전 공정 스케줄러 CFS"에서 자세히 설명했습니다.
(3) 비디오 메모리 관리
커널이 관리하는 또 다른 중요한 리소스는 비디오 메모리입니다. Yuanlijun의 또 다른 기사인 "Linux 비디오 메모리 관리 이해, 이 유일한 기사"에서는 Linux 비디오 메모리 관리에 대해 자세히 설명합니다. 효율성을 높이기 위해 가상 비디오 메모리 개념이 도입되었습니다. 비디오 메모리는 소위 비디오 메모리 페이지 형식(보통 비디오 메모리 페이지 크기는 4KB와 8KB이며 대부분 4KB임)에 따라 관리됩니다. 사용 가능한 비디오 메모리를 관리하는 Linux의 방법 외에도 수학 및 가상 매핑에 사용되는 하드웨어 메커니즘이 있습니다. 그러나 비디오 메모리 관리에서는 4KB 버퍼 이상을 관리해야 합니다. Linux는 슬랩 할당자와 같은 4KB 버퍼의 구체적인 표현을 제공합니다. 이러한 메모리 관리 모드는 4KB 버퍼를 기본으로 사용하고, 그로부터 구조를 할당하고, 어떤 메모리 페이지가 가득 찼는지, 어떤 페이지가 완전히 사용되지 않았는지, 어떤 페이지가 비어 있는지 등 메모리 페이지 사용량을 추적합니다. 이를 통해 모드는 시스템 요구에 따라 비디오 메모리 사용량을 동적으로 조정할 수 있습니다. 여러 사용자의 비디오 메모리 사용을 지원하기 위해 때때로 사용 가능한 비디오 메모리가 소모됩니다. 이러한 이유로 페이지를 비디오 메모리에서 꺼내 c 드라이브에 넣을 수 있습니다. 페이지가 비디오 메모리에서 하드 드라이브로 교환되기 때문에 이 프로세스를 교환이라고 합니다. 비디오 메모리 관리를 위한 소스 코드는 ./linux/mm에서 찾을 수 있습니다.
(4)가상 파일 시스템
가상 파일 시스템(VFS)은 파일 시스템에 대한 범용 인터페이스 표현을 제공하므로 Linux 커널의 매우 유용한 측면입니다. VFS는 시스템 호출과 커널이 지원하는 파일 시스템 사이에 보호막을 제공합니다. 오른쪽 그림과 같이:
VFS에서는 열기, 닫기, 읽기, 쓰기 등의 기능을 나타내는 일반적인 API입니다. VFS에는 하위 수준 기능의 구현 방법을 정의하는 파일 시스템 표현이 있습니다. 특정 파일 시스템(50개 이상)을 위한 플러그인입니다. 파일 시스템의 소스 코드는 ./linux/fs에서 찾을 수 있습니다. 파일 시스템 계층 아래에는 특정 파일 시스템과 관계없이 파일 시스템 계층에 대한 공통 기능 세트를 제공하는 버퍼 캐시가 있습니다. 이 캐싱 계층은 일정 기간 동안 데이터를 보관하거나 필요할 때 사용할 수 있도록 나중에 데이터를 미리 가져옴으로써 화학 장비에 대한 액세스를 최적화합니다. 버퍼 캐시 아래에는 특정 화학 장치용 소켓을 구현하는 장치 드라이버가 있습니다.
(5) 네트워크 계약 스택
네트워크 계약 스택은 시뮬레이션된 계약 자체의 계층화된 아키텍처를 따르도록 설계되었습니다. linux 커널 이식 단계를 떠올려 보세요. IP(InternetProtocol)는 전송 계약(일반적으로 전송 제어 계약 또는 TCP라고 함)에 따른 핵심 네트워크 계층 계약입니다. TCP 내부에는 시스템 호출 계층을 통해 호출되는 소켓 계층이 있습니다. 소켓 계층은 다양한 네트워크 계약을 위한 사용자 소켓을 제공하는 네트워크 하위 시스템의 표준 API입니다. 원시 프레임 액세스부터 IP PDU(계약 데이터 단위), TCP 및 UDP(사용자 데이터그램 프로토콜)에 이르기까지 소켓 계층은 연결을 관리하고 다양한 끝점 간에 데이터를 통신하는 표준화된 방법을 제공합니다. 커널의 네트워크 소스 코드는 ./linux/net에서 찾을 수 있습니다.
(6) 장치 드라이버
Linux 커널의 많은 양의 코드는 특정 하드웨어 장치를 실행할 수 있는 장치 드라이버에 있습니다. Linux 소스 트리는 Bluetooth, I2C, 직렬 등과 같은 다양한 지원 장치로 추가로 정의되는 드라이버 하위 디렉터리를 제공합니다. 장치 드라이버의 코드는 ./linux/drivers에서 찾을 수 있습니다.
(7) 아키텍처 종속 코드
Linux는 실행 중인 아키텍처와 크게 독립적이지만 아키텍처가 제대로 작동하고 더 큰 효율성을 달성하려면 고려해야 할 요소가 있습니다. ./linux/arch 하위 디렉터리는 다양한 아키텍처 관련 하위 디렉터리(함께 BSP를 구성함)를 포함하는 커널 소스 코드의 아키텍처 종속 부분을 정의합니다. 일반적인 데스크탑 시스템의 경우 x86 디렉토리가 사용됩니다. 각 아키텍처 하위 디렉터리에는 다른 많은 하위 디렉터리가 포함되어 있으며 각 하위 디렉터리는 부팅, 커널, 메모리 관리 등과 같은 커널의 특정 측면에 중점을 둡니다. 이 아키텍처 종속 코드는 ./linux/arch에서 찾을 수 있습니다.
Linux는 소프트웨어 구성 요소의 동적 추가 또는 삭제를 지원하는 동적 커널이기도 합니다. 동적으로 로드 가능한 커널 모듈이라고 알려진 이 모듈은 부팅 시 요청 시(현재 특정 장치에 모듈이 필요함) 또는 사용자가 언제든지 삽입할 수 있습니다.
참고
겐리군이 이 글을 참고했어요
위 내용은 Linux 커널 계층 구조 내부 살펴보기: 산 꼭대기에서 본 풍경의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!