Linux 커널 이해하기
커널은 모듈을 관리할 때 두 가지 주요 작업을 수행해야 합니다. 첫 번째 작업은 커널의 나머지 부분이 주요 기능의 진입점과 같은 모듈의 전역 기호에 도달할 수 있도록 하는 것입니다. 모듈은 커널 및 기타 모듈의 기호 주소도 알아야 합니다. 그러므로,모듈을 연결하면 참조가 한 번 해결됩니다.두 번째 작업은 다른 모듈이나 커널의 다른 부분이 모듈을 사용하는 동안 모듈이 언로드되지 않도록 모듈 사용을 추적하는 것으로 구성됩니다. 간단한 참조 횟수를 통해 각 모듈의 사용량을 추적할 수 있습니다.
모든 공유 라이브러리는 동적으로 링크되고( 를 사용하여 LD_LIBRARY_PATH
) 동적으로 로드될 수 있습니다( dlopen()
, dlsym()
및 를 통해 dlclose()
). 이것이 맞습니까?
모듈은 Linux 커널의 공유 라이브러리입니까?
Linux 커널은 모듈을 어떻게 동적으로 사용합니까? 동적 연결( 사용)을 통해서인가요, LD_LIBRARY_PATH
아니면 동적 로딩( dlopen()
, dlsym()
및 을 통해 dlclose()
)을 통해서인가요?
답변1
모든 공유 라이브러리는 동적으로 링크되고( 를 사용하여
LD_LIBRARY_PATH
) 동적으로 로드될 수 있습니다(dlopen()
,dlsym()
및 를 통해dlclose()
). 이것이 맞습니까?
예. 차이점은 동적 링커가 동적 링커에 의해 구동되며 프로그램이 시작될 때(프로그램 작성자의 관점에서) 라이브러리가 이미 링크되었으며 모든 기호가 확인되어 이 모든 작업이 수동으로 수행된다는 점입니다.
모듈은 Linux 커널의 공유 라이브러리입니까?
다소간 로딩 메커니즘이 다릅니다. 동적 링커와 는 libdl
커널이 아닌 사용자 공간에서만 사용됩니다.
Linux 커널은 모듈을 어떻게 동적으로 사용합니까? 동적 연결( 사용)을 통해서인가요,
LD_LIBRARY_PATH
아니면 동적 로딩(dlopen()
,dlsym()
및 을 통해dlclose()
)을 통해서인가요?
커널은 다음을 사용하여 모듈을 로드합니다.load_module
, ELF 개체 로드, 필요한 세그먼트 매핑, 모든 재배치 수행 등 모든 작업을 자체적으로 수행합니다. 또한 라이센스 확인, 연결 sysfs
, 초기화 함수 호출 등 모듈별 작업도 수행합니다.
load_module
사용자 공간에서 접근init_module
또는 시스템 finit_module
호출.