Linux 커널 모듈 사용의 단점을 이해하려고 노력 중입니다. 나는 이를 사용하면 기본 시스템을 다시 컴파일하고 다시 시작할 필요 없이 실행 중인 시스템에 동적으로 코드를 삽입할 수 있다는 이점을 이해합니다. 이러한 성능을 고려하면 대부분의 커널 코드가 기본 커널의 일부가 아닌 커널 모듈에 있어야 한다고 추측했을 것입니다. 그러나 실제로는 그렇지 않은 것 같습니다. 많은 핵심 하위 시스템(예: 메모리 관리)이 여전히 커널에 포함되어 있습니다. 기본 커널.
제가 생각할 수 있는 한 가지 이유는 커널 모듈이 부팅 프로세스의 매우 늦게 로드되므로 핵심 기능이 기본 커널에 들어가야 한다는 것입니다. 내가 읽은 또 다른 이유는 단편화에 관한 것이었습니다.
커널 모듈이 메모리 조각화를 일으키는 이유를 잘 모르겠습니다. 누군가 설명할 수 있습니까? 커널 모듈을 사용하면 다른 단점이 있습니까?
답변1
예, 기본 구성 요소(예: mm)가 로드 가능한 모듈이 될 수 없는 이유는 이러한 구성 요소가 필수적이기 때문입니다. 커널이 없으면 커널이 작동하지 않습니다.
로드 가능한 모듈에 대한 메모리 조각화의 영향이 중요하다고 주장하는 참조는 찾을 수 없지만이 부분LLKM How-To Guide가 흥미로울 수 있습니다.
나는 이 문제가 실제로 메모리 조각화 문제의 큰 부분이라고 생각합니다. 이는 일반적으로 커널 mm 하위 시스템에 의해 관리되는 실제 메모리 조각화와 매우 큰 응용 프로그램에서 발생할 수 있는 가상 주소 공간 조각화라는 두 가지 수준에서 발생합니다.제 생각에는주로 설계 및 컴파일 방식의 결과입니다.
실제 메모리의 조각화에 관해서는 페이지 크기(4KB)보다 더 미세한 단위에서는 이것이 가능하지 않다고 생각합니다. 따라서 실제로는 1024페이지로 100% 조각화되어 있는 1MB의 가상 연속 공간을 읽는 경우아마도1,000건의 추가 경미한 수술이 필요합니다. 방법 가이드의 이 부분에서는 다음 내용을 읽었습니다.
기본 커널에는 소중한 연속 도메인에 재사용 가능한 대규모 메모리(kmalloc 풀)가 포함되어 있습니다. 일부 Linux 버전에서는 모듈 로더가 먼저 이 풀에서 연속 메모리를 확보하여 LKM을 로드하려고 시도하고, 사용 가능한 공간이 충분하지 않은 경우에만 vmalloc 공간으로 이동합니다. Andi Kleen은 2002년 10월 Linux 2.5에서 이를 수행하는 코드를 제출했습니다. 그는 그 차이가 몇 퍼센트 범위에 있다고 주장했습니다.
여기서 vmalloc 공간(사용자 공간 애플리케이션이 존재하는 곳)은 페이지로 쉽게 조각화될 수 있습니다. 이것이 현대 운영 체제의 현실입니다(모두 가상 주소 지정을 통해 메모리를 관리합니다). 가상 주소 지정은 사용자 공간에서 "몇 퍼센트 포인트"의 성능 손실을 초래할 수도 있지만 가상 주소 지정에 관한 한 이를 통해 추론할 수 있습니다.필요하고 피할 수 없는사용자 영역에서는 전적으로 이론적인 내용에만 관련됩니다.
프로세스의 가상 주소 공간(그 뒤에 있는 실제 메모리가 아닌)의 조각화가 조각화를 더욱 복잡하게 만들 수 있지만 이는 커널 모듈에는 적용되지 않습니다(마지막 문단에서는 분명히 적용됩니다).
내 의견을 원한다면 고려할 가치가 없습니다. 고도로 모듈화된 커널을 사용하더라도 가장 일반적으로 사용되는 구성 요소(파일 시스템, 네트워크 등)는 매우 일찍 로드되어 로드된 상태를 유지하는 경향이 있으므로 실제 메모리의 연속 영역에 있을 것입니다. 그것은 가치가 있는 일입니다. (이것이 하지 말아야 할 이유가 될 수 있습니다.무의미한 모듈 로드 및 언로드).
답변2
모놀리식 코어를 사용하면 이론적으로 단일 연속 메모리 블록을 코어에 할당하는 것이 가능합니다. 모듈이 요청 시 로드(및 언로드)되면 모든 커널 메모리는 연속될 수 없으므로 정의에 따라 조각화됩니다. 단점은 모듈식 코어가 일반적으로 모놀리식 코어보다 적은 메모리를 사용한다는 것입니다. 이는 사용되지 않은 드라이버가 많을 수 있는 기본 배포 모놀리식 커널의 경우에 해당되지만 자체 모놀리식 커널을 빌드하는 경우에는 해당되지 않습니다.
일부 하위 시스템은 모듈화에 적합하지 않습니다. 메모리 관리는 분명히 하나이고 SMP는 또 다른 것입니다. 프로세스 스케줄링은 모듈식이 아니지만 I/O 스케줄링 정책은 모듈식입니다. TCP/IP와 같은 복잡한 상호 의존성으로 인해 다른 하위 시스템은 모듈화되지 않을 수 있습니다.
모듈의 또 다른 문제는 부팅해야 하는 장치를 구동하는 경우 모듈이 좋지 않다는 것입니다. 이와 같은 솔루션은 initrd
이 문제를 해결합니다.
마지막 고려 사항은 보안입니다. 커널 로드 가능 루트킷 등과 같은 로드 가능한 모듈을 허용하는 것은 잠재적인 위험입니다.기교. 바라보다http://www.la-samhna.de/library/rootkits/index.html그리고http://www.sans.org/security-resources/malwarefaq/Ptrace.php. 서명된 모듈(커널 3.7 기준)을 강제로 로드할 수 있습니다.봉쇄모듈은 마지막으로, 또는 다른 방식으로 강화되었습니다.
답변3
커널 이미지에 직접적으로 코드를 컴파일하는 것이 아니라 로드 가능한 커널 모듈로 코드를 컴파일하는 데 어떤 다른 단점이 있는지는 모르겠지만 특정 예를 사용하려면 메모리 관리를 가정하십시오.예전에는커널 바이너리 이미지 자체에 내장되지 않고 커널 모듈로 내장됩니다.
- 커널은 초기 RAM 디스크에 메모리를 어떻게 할당합니까?
- 커널은 파일 시스템을 마운트하는 데 필요한 구조에 메모리를 어떻게 할당합니까?
- 커널은 메모리 관리 모듈을 로드하기 위해 메모리를 어떻게 할당합니까?
- 메모리 관리 모듈은 커널의 다른 부분(메모리 관리 모듈에 액세스하는 데 필요한 다른 로드 가능한 커널 모듈)이 어떤 메모리를 요구했는지 어떻게 알 수 있습니까?
보시다시피, 이는 즉시 잠재적인 웜 전체를 열어줍니다. 작업 스케줄링은 또 다른 유사한 핵심 커널 개념입니다.
다른 관점에서 보면 메모리 관리 모듈 없이 커널이 또 어떤 유용한 작업을 수행할 수 있습니까? 이는 하드웨어가 시스템에 설치되지 않은 경우 간단히 비활성화할 수 있는 하드웨어 드라이버와는 다릅니다. 커널 자체를 부팅해야 하는 기본 기능입니다.
진정한 마이크로커널은 관심사와 코드 가독성/이해성 관점의 분리로 인해 특정 이점을 갖고 있지만,필요커널 자체 내부의 무언가가 작동하지 않습니다. 메모리 및 작업 처리는 멀티태스킹 운영 체제 커널의 핵심 개념 중 하나이며 위 목록에서 볼 수 있듯이 필요한 모든 작업의 모든 의도와 목적에 적용됩니다. 다른 것이 없다면, 별도로 로드된 구성 요소로 분리하려고 하면 아무 이점도 없이 복잡성만 추가될 것입니다(어차피 모든 사람이 모듈을 로드하게 되므로).
답변4
리눅스 커널 모듈 코드가 사용되었습니다 vmalloc()
. vmalloc()
가상 메모리이기 때문에 조각화 문제가 없습니다. 메모리는 일반적으로 4Kb의 페이지로 나누어지며, 가상 메모리를 사용하면 조각난 물리적 페이지를 연속적인 가상 블록으로 다시 매핑할 수 있습니다.
다른 구석에는 별도의 가상 주소 공간에 가상으로 연속된(그러나 물리적으로 분산된) 페이지를 할당하는 vmalloc()이 있습니다. vmalloc()은 상대적으로 느리지만 커널과 연속적으로 보이는 대규모 할당을 수행할 수 있습니다. 예를 들어, 로드 가능한 모듈의 코드 공간을 할당하는 데 사용됩니다.