答案1
但不仅如此linux/
,uapi/
而且asm-generic/
里面还有特殊的目录include
。这个通用的“include”目录是异构的——include/linux
是内核本身:40MB 的include/
.
K&R“C”在本章末尾指出:“……对于更大的程序,需要更多的组织和更多的标头”。
因此,从一开始,对于中型项目来说,一切都与组织有关。这也反映在<.h>
and".h"
语法以及包含的编译器规则中。还受到#ifndef
……#define
系统应用的“保护”。 Linux内核有很多更多组织。
我想我终于找到了一个有效的例子:
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.h
assibling 与 linux/sched.h 一样基本。
-->include/linux/
是全局“内核”头文件的主要中央容器。
其他目录(大部分)include/
部分用于“导入”定义,即集成硬件。它们更多地属于 drivers/ 而不是 kernel/ 或 mm/ 或 fs/。
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>
因此它需要(linux-、内核-)模块、错误和设备,加上它自己的“ALSA 驱动程序设备的主头文件...(1994-2001)” sound/core.h
。