사용자 공간에서 사용할 수 있는 커널 헤더란 무엇입니까? 서명이나 인터페이스가 다른 디렉터리의 헤더와 다릅니까?

사용자 공간에서 사용할 수 있는 커널 헤더란 무엇입니까? 서명이나 인터페이스가 다른 디렉터리의 헤더와 다릅니까?

커널 헤더에 대한 명확한 이해가 없고 그것이 어디서 어떻게 사용되는지에 대해 일관되지 않은 질문일 수 있습니다. 제 생각엔 플래그가 다운될 수도 있을 것 같아요. 내 질문은 세 부분으로 구성됩니다.

  1. 커널 헤더는 모듈과 같은 커널의 다른 부분이 이를 사용할 수 있도록 인터페이스를 제공한다고 생각합니다. 그게 내 책 지식이야. 커널 헤더를 사용하는 코드를 보거나 찾지 못했습니다(누가 알려주시면 감사하겠습니다). 사용자 공간에서도 사용할 수 있나요? 모든 코드 예제를 높이 평가하겠습니다.

  2. 커널 헤더를 사용하는 것은 사용자 공간에 의해 노출된다는 것을 알았지 make headers_install만 동시에 사용자 공간에서 커널 헤더를 사용하는 것은 권장되지 않습니다. 권장되지 않는 경우 이를 사용자 공간에 노출하는 것이 무슨 소용이 있습니까?

  3. 에 따라이것그리고이것, 커널 헤더 파일(.h 파일)은 다음 세 위치에 있어야 합니다. /usr/include/linux/kernel.h이는 사용자 공간을 위한 것입니다. b. /lib/modules/$(uname -r)/build/include/linux/sched.h외부 모듈입니다. c. /usr/src/...커널 모듈에 사용되는 것은 서로 다른 디렉토리의 헤더 파일이 서로 다른 목적이나 인터페이스 또는 서명을 가지고 있다는 의미입니까? 즉, #include <linux/xyz.h> 사용자 공간 코드는 #include <linux/xyz.h>커널 모듈과 다른 의미를 갖습니까? 외부 모듈도 커널 모듈과 동일합니까?

감사해요.

답변1

Unix 및 Linux StackExchange에 오신 것을 환영합니다!

예, 커널 헤더는 커널의 다른 부분에 대한 인터페이스를 제공합니다. 이는 완전히 정확합니다. 여기에는 커널과 사용자 공간 사이의 인터페이스에 대한 정의도 포함되어 있습니다. 그러나 일반적으로 "원시" 커널 인터페이스는 직접 사용되지 않고 C 라이브러리를 통해(종종 glibc) 사용됩니다.

사용자 공간 커널 인터페이스에는 이전 버전과의 호환성을 위해 특정 시스템 호출의 여러 버전이 포함될 수 있습니다. C 라이브러리를 통해 시스템 호출을 수행하면 모든 응용 프로그램이 실제 시스템 호출과 동일한 버전을 얻게 되므로 일관된 동작이 보장됩니다. 또한 커널 인터페이스의 관련 부분이 업데이트되면 C 라이브러리만 업데이트하면 새로운 기능을 활용할 수 있습니다.

(예를 들어, Y2K38 문제를 피하기 위해 time_t가 32비트 아키텍처에서 64비트로 확장되면 C 라이브러리는 항상 64비트 버전의 커널 인터페이스를 사용하도록 이동할 수 있지만 애플리케이션에 대해 사용자 공간 구성 가능한 매핑이 있습니다. 이 시점에서 32비트 time_t를 사용하는 함수는 더 이상 사용되지 않고 커널에서 제거될 수 있으며 C 라이브러리는 여전히 32비트 유형을 사용하는 레거시 애플리케이션에 대해 더 나은 해결 방법을 제공할 수 있습니다.

따라서 C 라이브러리의 자체 버전도 컴파일하지 않는 한 일반적으로 커널 헤더를 직접 사용하는 대신 C 라이브러리의 개발 헤더를 선호해야 합니다.

헤더는 /usr/include/linux/일반적으로 C 라이브러리의 개발 헤더 패키지와 함께 제공되며 C 라이브러리가 컴파일된 커널 버전을 설명합니다. 이것이 사용자 공간 애플리케이션 개발자에게 일반적으로 필요한 것입니다.

/lib/modules/$(uname -r)/build/usr/src/...실제 실행 중인 커널 버전의 헤더나 전체 소스 코드가 저장된 위치 에 대한 심볼릭 링크인 경우가 많습니다 . 이는 외부(타사라고도 함) 커널 모듈, 즉 기본 커널 소스 코드에 통합되지 않은 소스의 커널 모듈을 컴파일할 때 사용됩니다. 이러한 헤더에는 모듈이 버전별 커널 내부 API를 사용할 수 있도록 필요한 커널 API 버전 서명이 포함되어 있습니다.

관련 정보