#include <linux/init.h>
时间: 2025-04-18 15:02:47 浏览: 23
### Linux 内核初始化头文件的用途与使用方法
#### 头文件概述
Linux 内核初始化过程中涉及多个重要的头文件,这些文件定义了必要的宏、数据结构以及函数原型。主要的头文件位于 `include/linux` 和 `include/asm-generic` 目录下。
#### 关键头文件及其作用
##### 1. `<linux/init.h>`
该头文件提供了用于标记内核模块或驱动程序中的初始化代码的关键字[^1]。常见的关键字有:
- `__init`: 表明函数仅在启动期间调用一次,在之后不再需要。
- `__exit`: 标识退出处理函数,通常只适用于可加载模块。
- `module_init()`: 定义模块入口点。
- `module_exit()`: 定义模块出口点。
```c
#include <linux/init.h>
static int __init hello_start(void){
printk(KERN_INFO "Loading Hello module...\n");
return 0;
}
static void __exit hello_end(void){
printk(KERN_INFO "Cleaning up Hello module.\n");
}
module_init(hello_start);
module_exit(hello_end);
```
##### 2. `<linux/moduleparam.h>`
此头文件允许开发者向模块传递参数并设置默认值。通过这种方式可以灵活调整模块行为而无需重新编译整个内核。
```c
#include <linux/moduleparam.h>
int param_int = 1;
module_param(param_int, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(param_int,"An integer parameter example.");
```
##### 3. `<linux/slab.h>` 或者 `<linux/vmalloc.h>`
当涉及到内存分配时会用到这两个头文件之一来请求动态内存空间。前者适合小规模对象池管理;后者则更适合大规模连续地址区域的需求。
```c
#include <linux/slab.h> /* or #include <linux/vmalloc.h> */
struct my_struct *ptr;
// 使用 slab 分配器创建单个实例
ptr = kmalloc(sizeof(*ptr), GFP_KERNEL);
if (!ptr) {
// 错误处理...
}
// 初始化 ptr...
// 当完成工作后释放资源
kfree(ptr);
```
##### 4. `<linux/fs.h>`
对于实现新的文件系统或是操作现有文件系统的功能来说必不可少。它包含了大量关于超级块、索引节点(inode)、目录项(dentry)等概念的数据结构声明。
```c
#include <linux/fs.h>
static struct file_operations fops = {
.owner = THIS_MODULE,
.open = device_open,
.read = device_read,
.write = device_write,
.release = device_release,
};
register_chrdev(MAJOR_NUM, DEVICE_NAME, &fops);
```
阅读全文
相关推荐



















