커널 소스 트리의 /include 및 /include/linux

커널 소스 트리의 /include 및 /include/linux

존재하다리눅스 커널 소스 코드, 일부 헤더 파일과 디렉터리는 다음 위치에 직접 위치합니다./포함하다, 그러나 일부는 다음 위치에 있습니다./include/리눅스. 왜 모든 것을 /include에 넣지 않는 걸까요? /include와 /include/linux의 차이점은 무엇입니까?

답변1

하지만 그뿐만 아니라 linux/내부 에는 특별한 디렉토리도 있습니다 . 이 공통 "포함" 디렉토리는 이기종입니다. 즉, 커널 자체입니다: 40MB의 .uapi/asm-generic/includeinclude/linuxinclude/


K&R "C"는 장 끝에 다음과 같이 명시합니다. "...더 큰 프로그램의 경우 더 많은 구성과 더 많은 헤더가 필요합니다."

따라서 중간 규모 프로젝트의 경우 처음부터 조직이 중요합니다. 이는 <.h>및 구문과 포함된 컴파일러 규칙 에도 반영됩니다 ".h". 또한 #ifndef... #define시스템 응용 프로그램에 의해 "보호"됩니다. 리눅스 커널은많은더 많은 조직.

마침내 실제 사례를 찾은 것 같습니다.

kernel/sched/자체적으로는 소형에서 중형 크기까지 있습니다. 8개의 헤더 파일이 있으며 그 중 하나는 다음 sched.h으로 시작합니다.

/*
 * Scheduler internal types and methods:
 */
#include <linux/sched.h>

...

이 "로컬" sched.h에는 하위 수준 항목만 포함되어 있습니다.


여기 include/linux/sched.h에는 다음이 포함됩니다.

#ifndef _LINUX_SCHED_H
#define _LINUX_SCHED_H

/*
 * Define 'struct task_struct' and provide the main scheduler
 * APIs (schedule(), wakeup variants, etc.)
 */

#include <uapi/linux/sched.h>

#include <asm/current.h>

#include <linux/pid.h>
...

이 모든 것은 실제로 매우 잘 문서화되고 정리되어 있습니다.

"uapi"에는 프로그램에서 "내보내기"/사용하기 위한 CLONE_ 플래그 및 SCHED_ 정책(예: RR=2) 정의가 포함됩니다.

asm/current.h현재 작업에 대한 낮은 수준의 액세스입니다.

linux/pid.hassibling은 linux/sched.h만큼 기본입니다.

-->는 include/linux/전역 "커널" 헤더 파일의 주요 중앙 컨테이너입니다.


다른 카탈로그 섹션은 (주로) include/"가져오기" 정의, 즉 통합 하드웨어를 위한 것입니다. 그들은 kernel/, mm/ 또는 fs/보다는 drivers/에 더 속합니다.


include/sound/또한 매우 흥미 롭습니다. sound/sound_core.c가지다:

/*
 * First, the common part.
 */
#include <linux/module.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/kdev_t.h>
#include <linux/major.h>
#include <sound/core.h>

따라서 (리눅스, 커널) 모듈, 버그 및 장치와 자체 "ALSA 드라이버 장치용 기본 헤더 파일...(1994-2001)"이 필요합니다 sound/core.h.

관련 정보