Linux-headers是用于编译和安装内核模块的头文件集。 它包含在Linux内核中,并分为多个子包,以便根据需要安装仅适用的头文件。
一、什么是Linux-headers
作为内核开发者或驱动程序开发者,必须了解Linux系统中的头文件。 由于Linux内核源代码非常庞大,因此仅提供内核源代码并不足以编写内核模块或设备驱动程序。内核源代码中的许多函数,变量和结构需要与其他文件进行交互,其中一些位于内核的其他部分中,而其他则是来自其他软件包,例如标准C库。
因此,Linux内核源代码中的头文件是编写内核模块的重要一环。Linux-headers提供了一个集合,其中包括内核开发和驱动程序开发中的所有必需头文件。
二、Linux-headers的分析
在Linux-headers包中,有许多不同的头文件,每个头文件都有不同的功能。接下来,我们将一一介绍。
1. asm-header
asm-header需要被包含,以便在开发内核或内核模块时使用指令集相关的C编译器内建函数,该文件包含了大量必需的支持体系结构的函数。
/*
* asm-generic/atomic.h
*
* Atomic operations that C can't guarantee us. Useful for
* resource counting etc..
*/
#define ATOMIC_INIT(i) { (i) }
typedef struct {
int counter;
} atomic_t;
#define atomic_read(v) ((v)->counter)
#define atomic_set(v,i) (((v)->counter) = (i))
2. linux-header
linux-header是标准的Linux内核头文件补丁,提供了许多必要的结构和函数,包括内核参数、标准IO头文件和内存分配函数等。
/*
* linux-kernel.h
*
* This file contains most of the kernel definitions. It includes some
* headers to define things which are needed widely across the kernel.
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
3. kernel-header
kernel-header提供了大量的Linux内核函数,许多内存管理和分配函数都在这个头文件中定义。
/*
* kernel.h
*
* General kernel definitions and macros.
*
* Developed by Linus Torvalds
* More information in the accompanying file COPYING.
*/
#ifndef _LINUX_KERNEL_H
#define _LINUX_KERNEL_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#endif
三、为什么要使用Linux-headers
要为Linux系统编写内核模块或设备驱动程序,必须使用Linux-headers。 如果您未安装Linux-headers,则无法编译内核模块或驱动程序,因为缺乏系统定义的所有必需头文件。然而,在使用Linux-headers时,您可以避免许多已知的问题,例如:未能正确更新您的内核和头文件。
另外,应该始终使用匹配内核版本的Linux-headers。 当Linux内核更新时,新的内核很可能需要新的头文件。用决不兼容的版本安装头文件会在您试图编译内核模块时引发各种编译问题。
四、如何安装Linux-headers
在大多数Linux发行版中,安装方式如下:
$ sudo apt-get install linux-headers-$(uname -r)
在CentOS中,安装方式如下:
$ sudo yum install kernel-devel
在其他发行版中,安装方式类似,请参考官方文档。