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

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

이것은 아마도 커널 헤더에 관한 일관되지 않은 질문일 것입니다. 왜냐하면 나는 커널 헤더가 어디서 어떻게 사용되는지 명확하게 이해하지 못하기 때문입니다. 제 생각엔 플래그가 붙을 수도 있을 것 같아요. 내 질문은 세 부분으로 구성됩니다.

  1. 커널 헤더는 커널의 다른 부분(예: 모듈)이 사용할 수 있도록 인터페이스를 제공한다고 생각합니다. 이것이 나의 책 지식입니다. 나는 커널 헤더를 사용하는 코드를 본 적도 발견한 적도 없습니다(누가 지적해 주시면 감사하겠습니다). 사용자 공간에서도 사용할 수 있나요? 모든 코드 예제를 높이 평가하겠습니다.

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

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

감사해요.

답변1

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

예, 커널 헤더는 커널의 나머지 부분에 대한 인터페이스를 제공합니다. 그 점에서는 전적으로 옳습니다. 또한 커널과 사용자 공간 사이의 인터페이스 정의도 포함하지만 일반적으로 "원시" 커널 인터페이스를 직접 사용하지 않고 (보통 glibc) C 라이브러리를 통해 사용합니다.

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

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

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

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

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

관련 정보