나는 항상 Linux 커널이 페이징 가능하지 않다는 것을 읽었습니다.
제 기억이 맞다면 Windows에서는 시스템 가상 메모리를 페이징 풀과 비페이징 풀로 나눕니다.
페이징되지 않은 부분은 물리적 메모리에 직접 매핑되어 커널이 완료해야 하는 가장 중요한 작업을 담당하지만 덜 중요한 부분은 그렇지 않을 수 있으므로 항상 그곳에 남아 있습니다. 대신, Linux 커널은 로드 가능한 모듈로 나누어져 있지만 이러한 모듈이 어떻게 구현되는지에 대한 정보는 수집하지 않았습니다.
일시적으로 디스크에 전송할 수 있도록 페이징되었는지 이해가 되지 않습니다. 내가 주로 읽는 내용은 메모리를 언로드함으로써 메모리를 "해제"할 수 있다는 것입니다. 이것이 의미하는 바는 아직 나에게 모호합니다.
이 기사에서 "페이징됨" 또는 "페이징 가능"이라고 쓴 것은 디스크에서 이러한 페이지를 교환할 수 있다는 의미입니다. 일반적으로 Linux 커널은 페이징된 것으로 간주되지만 교체할 수 없기 때문에 이 문제를 해결했습니다.
답변1
Linux 커널의 어떤 부분도 호출할 수 없으며 모듈의 일부도 호출할 수 없습니다.
모듈에서 지원하는 경우 커널 모듈을 로드 및 언로드할 수 있습니다. 이는 사용자 공간 프로세스가 시스템 호출(일반적으로 로드용 유틸리티, 언로드용 유틸리티를 통해)을 통해 명시적인 요청을 할 init_module
때 항상 발생 합니다.delete_module
insmod
modprobe
rmmod
모듈이 로드되면 커널의 다른 부분과 마찬가지로 커널의 일부가 됩니다. 특히, 특정 모듈에서 사용하는 메모리를 분리할 수 있는 방법은 없습니다. 커널은 특정 모듈에 대한 코드가 포함된 메모리 부분을 추적하지만 모듈이 데이터를 저장할 수 있는 위치는 추적하지 않습니다. 결국 모듈은 모든 커널 데이터 구조를 수정할 수 있습니다.
모듈은 모든 커널 하위 시스템에 일부 코드를 추가할 수 있습니다. 대부분의 모듈은 하드웨어 드라이버이지만 일부는 그렇지 않습니다(예: 보안 기능, 파일 시스템, 네트워크 기능 등을 제공할 수 있음). 모듈에서 사용하는 데이터나 코드를 교체할 수 있는 경우 필요할 때 나머지 커널이 이를 로드해야 하므로 시스템 설계가 복잡해집니다. 또한 커널은 교체된 메모리 부분을 다시 교체할 필요가 없는지 확인해야 하는데 이는 어렵습니다. 스왑이 네트워크 파일 시스템의 스왑 파일에 있고 해당 모듈이 파일이 저장된 서버와의 통신과 관련된 방화벽 기능을 제공한다면 어떻게 될까요?
모듈이 아무 작업도 수행할 필요가 없도록 하는 코드를 제공하는 것이 모듈의 작업이므로 모듈을 완전히 제거하는 것이 가능합니다. 커널은 모듈의 종료 함수를 실행하고 해당 함수가 모듈을 언로드해도 안전하다고 보고하는 경우에만 모듈을 언로드합니다. 종료 함수는 모듈이 "소유한" 나머지 데이터 메모리(즉, 모듈에 필요하지만 커널의 다른 부분에는 필요하지 않은 데이터)를 해제해야 하며, 어떤 경우 호출할 코드가 모듈에 등록되어 있지 않은지 확인해야 합니다. 발생합니다. 교환을 위해 모듈의 데이터를 저장할 수 있는 방법은 없습니다. 모듈은 남아 있는 데이터가 없을 때만 RAM에서 삭제할 수 있습니다.
답변2
메모리 페이지 스와핑("페이징"이라고 함)과 Linux 커널 모듈 로드/언로드는 완전히 다른 두 가지 기능입니다.
Linux 커널 모듈은 커널에 로드될 수 있으며, 그런 다음 커널의 일부가 됩니다. 여기서 목표는 커널을 주어진 하드웨어에 맞게 조정하는 것입니다. 예를 들어, 수백 가지 유형의 네트워크 카드가 있고 이러한 카드를 지원하는 많은 커널 모듈이 있지만 특정 시스템에서는 특정 순간에 한 가지 유형의 네트워크 카드만 사용할 수 있습니다. Linux는 카드에 맞는 올바른 커널 모듈을 선택하고 이를 로드하며 다른 모든 모듈은 외부 메모리에 남겨둡니다.
커널 모듈에 대한 자세한 내용은 다음을 참조하세요.여기.