内核源代码树中的 /include 与 /include/linux

内核源代码树中的 /include 与 /include/linux

Linux内核源码,一些头文件和目录直接位于/包括,但其他一些位于/包括/linux。为什么他们不把所有东西都放入 /include 中? /include 和 /include/linux 有什么区别?

答案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.hassibling 与 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

相关内容