드라이버 모듈은 자동으로 로드 및 언로드됩니까?

드라이버 모듈은 자동으로 로드 및 언로드됩니까?

Ubuntu 14.04에서 외부 무선 어댑터를 연결하지 않아도 해당 모듈이 rt2800usb여전히 나타나는 것을 발견했습니다 lsmod.

  1. 드라이버 모듈은 언제 자동으로 로드됩니까? 기기가 컴퓨터에 연결되었을 때인가요, 아니면 운영 체제가 시작될 때인가요?

  2. 드라이버 모듈은 언제 자동으로 제거됩니까? 장치가 컴퓨터에서 분리되었을 때입니까, 아니면 운영 체제가 종료되었을 때입니까?

답변1

커널이 새 장치를 감지하면 이 프로그램을 실행합니다.modprobe장치를 식별하는 이름을 전달합니다. 대부분의 장치는 공급업체 및 모델 등록 번호로 식별됩니다.PCI또는USB신원 표시. 프로그램 modprobe은 모듈 별칭 테이블을 참조하여 특정 장치에 대한 드라이버가 포함된 파일 이름을 찾습니다. 파일 시스템 및 암호화 알고리즘과 같은 비하드웨어 장치용 드라이버에도 유사한 원칙이 적용됩니다. 자세한 내용은 다음을 참조하세요./lib/modules/VERSION/modules.alias데비안 재부팅 후 직렬 PCI 카드가 감지되지 않습니다

modprobe가 요청한 드라이버가 포함된 모듈 파일( )을 확인하면 .ko모듈 파일을 커널에 로드합니다. 모듈 코드는 다음과 같습니다.동적 로딩커널을 입력하십시오. 모듈이 성공적으로 로드되면 목록에 표시됩니다 lsmod.

커널이 새로운 핫 플러그 ​​가능 하드웨어를 감지하면(예: USB 주변 장치를 연결하는 경우) 모듈이 자동으로 로드됩니다. 또한 운영 체제는 부팅 시 존재하는 주변 장치용 드라이버를 로드하기 위해 부팅 초기에 시스템에 있는 모든 하드웨어를 열거합니다.

modprobe또는 명령을 사용하여 모듈이 로드되도록 수동으로 요청할 수도 있습니다 insmod. 대부분의 배포판에는 에 나열된 모듈을 로드하는 시작 스크립트가 포함되어 있습니다 /etc/modules. 모듈을 로드하는 또 다른 방법은 모듈의 종속성인 경우입니다. 모듈 A가 모듈 B에 종속된 경우 modprobe AA가 로드되기 전에 B가 로드됩니다.

모듈이 로드되면 드라이버를 사용하는 모든 장치의 연결이 끊어지더라도 명시적으로 언로드될 때까지 로드된 상태로 유지됩니다. 오래 전에 사용하지 않는 모듈을 자동으로 언로드하는 메커니즘이 있었지만, 내 기억이 맞다면 udev가 등장했을 때 제거되었습니다. 나는 자동 모듈 언로드가 일반적인 기능이 아니라고 생각합니다. 왜냐하면 이를 요구하는 경향이 있는 시스템은 대부분 (드라이버 코드 규모에서) 많은 메모리를 갖춘 데스크톱 PC이기 때문입니다.

답변2

시스템이 시작되면 다음과 같은 방법으로 모듈을 로드합니다.초기 RAM 디스크(initrd라고도 함). 근거 섹션에는 다음과 같이 명시되어 있습니다.

많은 Linux 배포판은 배포판 개발자가 다양한 하드웨어에서 부팅하기 위해 특별히 생성한 공통 Linux 커널 이미지를 제공합니다. 이 범용 커널 이미지용 장치 드라이버는 로드 가능한 커널 모듈로 포함됩니다. 왜냐하면 많은 드라이버를 단일 커널로 정적 컴파일하면 커널 이미지가 더 커지고 메모리가 제한된 시스템에서 부팅하기에는 너무 클 수 있기 때문입니다. 이로 인해 부팅 시 루트 파일 시스템을 설치하는 데 필요한 모듈을 감지하고 로드하거나 루트 파일 시스템이 어디에 있는지 또는 무엇인지 추론하는 문제가 발생합니다.

다른 많은 배포판과 마찬가지로 Ubuntu는 드라이버가 필요한지 또는 장치가 시스템에 있는지 여부에 관계없이 모든 장치 드라이버를 이 initrd에 로드하도록 선택합니다. Giles가 지적했듯이 모든 것이 RAM에 로드된 다음 부팅 시 사용된 모듈이 감지되고 사용되지 않는 모듈이 RAM에서 제거됩니다. 이 방법을 사용하면 설정에 관계없이 Ubuntu가 항상 모든 시스템에서 부팅됩니다. Ubuntu는 마이크로커널 구조를 사용하여 모놀리식 커널을 모방합니다. 바라보다이것을 하는 이유


  1. 이 모듈은 rt2800usb다음에 포함되어 있으므로 시작 시 항상 로드됩니다.파일 시스템 초기화자일스가 언급했다. initramfs는 initrd의 후속이므로 항상 로 표시됩니다 lsmod. modprobe모듈 이름을 따라 새로 컴파일된 모듈을 커널에 삽입 할 수 있습니다 .

테스트로 무선 어댑터를 분리한 상태에서 시스템을 다시 시작합니다. 모든 것이 순조롭게 진행되면 lsmod부팅 중에 initramfs 및 init sstem에 의해 시작된 계측 프로세스가 계측 중에 장치를 찾지 못했고 모듈이 RAM에서 제거되었기 때문에 모듈이 s 출력에 나열되지 않습니다 .

  1. 시스템이 실행 중인 동안 모듈을 제거하려면 , rmmod또는 와 같은 명령 modprobe -r뒤에 모듈 이름을 입력하면 됩니다. 다음 시작 시 모듈이 다시 로드됩니다. 찾다. 대부분의 경우 모듈은 핫 플러깅을 비활성화하므로 동적으로 제거되지 않습니다. 즉, 모듈이 제거되면 해당 모듈을 사용하는 장치를 다시 삽입할 때 다시 감지할 수 없습니다.

모듈을 제거하려면 lsmod선택한 모듈 없이 커널을 다시 컴파일한 후 이미지를 다시 빌드하여 생성된 initramfs 이미지에서 해당 모듈을 제거해야 합니다. 이렇게 하면 모듈에 대한 모든 계측이 비활성화됩니다.

관련 정보