kmod_load 커널 서비스

용도

커널에 객체 파일을 로드하거나 이미 로드된 객체 파일을 쿼리합니다.

구문

#include <sys/ldr.h>
#include <sys/types.h>
#include <sys/errno.h>

int kmod_load (pathp,  
flags,libpathp, kmidp)
caddr_t  pathp;
uint  flags;
caddr_t
libpathp;
mid_t * kmidp;

매개변수

항목 설명
경로 로드하거나 쿼리할 개체 파일의 경로 이름이 포함된 문자열을 가리킵니다.
플래그 호출할 로더 옵션을 설명하는 로더 플래그 세트를 지정합니다. 다음 플래그가 정의됩니다.
LD_USRPATH
가 가리키는 문자열 경로 그리고 libpathp 매개변수는 사용자 주소 공간에 있습니다. 만약 LD_USRPATH 플래그가 설정되지 않은 경우 문자열은 커널 또는 시스템 공간에 있는 것으로 간주됩니다.
LD_KERNELEX
이 개체 파일의 내보낸 기호를/usr/lib/boot/unix 이름 공간. 지정된 파일에 대한 기호 확인으로 인해 로드된 추가 개체 파일에는 커널 이름 공간에 배치된 내보낸 기호가 없습니다.
LD_SINGLELOAD
이 플래그가 설정되면 경로 매개변수는 동일한 경로 이름을 가진 객체 파일이 아직 로드되지 않은 경우에만 커널에 로드됩니다. 동일한 경로 이름을 가진 개체 파일이 이미 로드된 경우 해당 모듈 ID가 반환됩니다( kmidp 매개변수) 및 로드 횟수가 증가합니다. 개체 파일이 아직 로드되지 않은 경우 이 서비스는 플래그가 설정되지 않은 것처럼 로드를 수행합니다.

이 옵션은 루틴과 해당 데이터의 복사본이 하나만 존재할 수 있는 전역 커널 루틴을 지원하는 데 유용합니다. 일반적으로 커널 이름 공간에 추가할 기호를 내보내는 루틴이 이 유형입니다.

메모: 동일한 개체 파일이 이미 로드되었는지 확인하기 위해 경로 이름 비교가 수행됩니다. 개체 파일에 대한 경로 이름이 이전 로드 요청과 다르게 표시되면 이 서비스는 개체 파일의 새 복사본을 커널에 잘못 로드합니다.

이 플래그도 아니고 LD_QUERY 플래그가 설정되면 이 서비스는 개체 파일의 새 복사본을 커널에 로드합니다. 이는 개체 파일의 다른 복사본이 이전에 로드된 경우에도 발생합니다.

LD_QUERY
이 플래그는 쿼리 작업이 개체 파일에 지정된 개체 파일인지 여부를 결정하도록 지정합니다. 경로 매개변수가 로드되었습니다. 로드되지 않은 경우 다음을 사용하여 커널 모듈 ID 0이 반환됩니다. kmidp 매개변수. 그렇지 않으면 개체 파일에 할당된 커널 모듈 ID가 반환됩니다.

이 파일의 여러 인스턴스가 커널에 로드된 경우 가장 최근에 로드된 개체 파일의 커널 모듈 ID가 반환됩니다.

그만큼 libpathp 이 옵션에는 매개변수가 사용되지 않습니다.

메모: 동일한 개체 파일이 로드되었는지 확인하기 위해 경로 이름 비교가 수행됩니다. 이 서비스는 실수로not loaded개체 파일에 대한 경로 이름이 이전 로드 요청과 다르게 표현되는 경우입니다.

이 플래그가 설정되면 개체 파일이 로드되지 않으며 LD_SINGLELOAD 그리고 LD_KERNELEX 설정된 경우 플래그는 무시됩니다.

libpathp 이 로드에 대한 기호 해석을 완료하는 데 필요한 개체 파일을 찾는 데 사용할 검색 경로가 포함된 문자열을 가리킵니다. 매개변수가 null인 경우 검색 경로는 다음에서 지정한 개체 파일에 대한 개체 파일 헤더의 사양에서 설정됩니다. 경로 매개변수.
kmidp 지정된 모듈의 이 로드와 연관된 커널 모듈 ID가 반환될 영역을 가리킵니다. 이 영역의 데이터는 다음과 같은 경우 유효하지 않습니다. kmod_load 서비스가 0이 아닌 반환 코드를 반환합니다.

설명

그만큼 kmod_load 커널 서비스는 다음에 의해 지정된 커널 확장 개체 파일을 커널에 로드합니다. 경로 매개변수. 이 서비스는 해당 모듈 인스턴스에 대한 커널 모듈 ID를 반환합니다.

단일 로드를 요청하는 플래그를 지정할 수 있습니다. 그러면 개체 파일의 복사본이 하나만 커널에 로드됩니다. 추가 옵션은 단순히 주어진 개체 파일(경로 이름으로 지정)을 쿼리하는 것입니다. 이를 통해 사용자는 모듈이 이미 로드되었는지 확인한 다음 할당된 커널 모듈 ID에 액세스할 수 있습니다.

그만큼 kmod_load 서비스는 또한 로드된 모듈의 가져온 기호에 대한 로드 시간 기호 확인을 제공합니다. 그만큼 kmod_load 서비스는 기호 확인에 필요한 경우 추가 커널 개체 모듈을 로드합니다.

로더 기호 바인딩 지원

커널 네임스페이스에서 가져온 기호는 로드 시 커널 네임스페이스에 존재하는 기호로 확인됩니다. (기호는 다음을 지정하여 커널 이름 공간에서 가져옵니다. #!/유닉스 문자열을 링크 편집 시 가져오기 목록의 첫 번째 필드로 사용합니다.)

커널 모듈은 다른 커널 개체 모듈에서 기호를 가져올 수도 있습니다. 이러한 다른 커널 개체 모듈은 가져온 기호를 확인하는 데 필요한 경우 지정된 개체 모듈과 함께 로드됩니다.

지정된 커널 개체 모듈에서 내보낸 모든 기호는 다음과 같은 경우 커널 이름 공간에 추가됩니다. 깃발 매개변수에는 LD_KERNELEX 플래그가 설정되었습니다. 이렇게 하면 이후에 로드되는 다른 커널 개체 모듈에서 해당 기호를 사용할 수 있습니다. 지정된 커널 개체 모듈을 대신하여 로드된 커널 개체 모듈(가져온 기호를 확인하기 위해)에는 내보낸 기호가 커널 이름 공간에 추가되지 않습니다.

링크 편집 시에 지정된 커널 내보내기 기호 시스템콜 기본 모듈의 내보내기 목록에 있는 키워드가 시스템 호출 테이블에 추가됩니다. 이러한 커널 내보내기 기호는 응용 프로그램에서 시스템 호출로 사용할 수 있습니다.

기호 참조를 해결하기 위한 공유 객체 모듈 찾기

검색 경로 검색 문자열은 다음에서 지정한 개체 모듈의 모듈 헤더에서 가져옵니다. 경로 매개변수 libpathp 매개변수가 null입니다. 에 의해 지정된 개체 모듈의 모듈 헤더 경로 매개변수가 사용됩니다.

모듈 헤더에 기호에 대한 규정되지 않은 기본 파일 이름이 포함된 경우(이름에 / [슬래시] 문자 없음) 검색 문자열을 사용하여 가져오기를 해결하는 데 필요한 공유 객체 모듈의 위치를 찾습니다. 이 검색 문자열은 두 위치 중 하나에서 가져올 수 있습니다. 만약 libpathp 호출에 대한 매개변수 kmod_load service가 null이 아니면 사용할 검색 경로를 지정하는 문자열을 가리킵니다. 그러나 만약 libpathp 매개변수가 null이면 검색 경로는 다음에 지정된 객체 모듈의 모듈 헤더에서 가져옵니다. 경로 매개변수.

가져온 기호를 확인하기 위해 로드된 개체 모듈에 있는 검색 경로 사양은 사용되지 않습니다. 커널 로더 서비스는 지연된 기호 확인을 지원하지 않습니다. 가져온 기호를 확인할 수 없으면 오류와 함께 커널 모듈 로드가 종료됩니다.

실행 환경

그만큼 kmod_load 커널 서비스는 다음에서 호출될 수 있습니다. 프로세스 환경 오직.

리턴 값

에러 없이 객체 파일이 로드되면 모듈 ID가 가리키는 위치에 모듈 ID가 반환됩니다. kmidp 매개변수이며 반환 코드는 0으로 설정됩니다.

오류 코드

오류가 발생하면 모듈이 로드되지 않고 커널 모듈 ID가 반환되지 않습니다. 반환 코드는 다음 반환 값 중 하나로 설정됩니다.

리턴값 설명
EACCES 로드할 개체 모듈이 일반 파일이 아니거나 개체 모듈 파일의 모드가 읽기 전용 액세스를 거부함을 나타냅니다.
EACCES 경로 접두사의 구성 요소에 대한 검색 권한이 거부되었습니다.
실패 호출 프로세스에 설명된 데이터 영역에 액세스할 수 있는 충분한 권한이 없음을 나타냅니다. 경로 또는 libpathp 매개변수 LD_USRPATH 플래그가 설정되었습니다. 이 영역의 데이터에 액세스할 때 I/O 오류가 발생하는 경우에도 이 오류 코드가 반환됩니다.
에노젝 프로그램 파일에 적절한 액세스 권한이 있지만 헤더에 유효하지 않은 XCOFF 표시기가 있음을 나타냅니다. 그만큼 kmod_load 커널 서비스는 XCOFF(Extended Common Object File Format) 개체 파일 로드만 지원합니다. 로더가 가져온 기호를 확인할 수 없는 경우에도 이 오류 코드가 반환됩니다.
EINVAL 프로그램 파일의 헤더에 유효한 XCOFF 표시기가 있지만 파일이 로드될 시스템에 대해 헤더가 손상되었거나 올바르지 않음을 나타냅니다.
ENOMEM 로드에는 시스템에서 허용하는 최대값보다 더 많은 커널 메모리가 필요함을 나타냅니다.
ETXTBSY 개체 파일이 현재 일부 프로세스에서 쓰기 위해 열려 있음을 나타냅니다.
ENOTDIR 경로 접두어의 구성 요소가 디렉터리가 아님을 나타냅니다.
ENOENT 해당 파일이나 디렉터리가 존재하지 않거나 경로 이름이 null임을 나타냅니다.
에스탈레 호출자의 루트 또는 현재 디렉터리가 마운트 해제된 가상 파일 시스템에 있음을 나타냅니다.
엘루프 번역하는 동안 너무 많은 기호 링크가 발견되었음을 나타냅니다. 또는 libpathp 매개변수.
ENAMETOOLONG 경로 이름의 구성 요소가 255자를 초과했거나 전체 경로 이름이 1023자를 초과했음을 나타냅니다.
EIO 작업 중에 I/O 오류가 발생했음을 나타냅니다.