linux内核头文件概览

linux驱动开发常用的头文件

目录介绍

一、核心头文件目录结构

  1. 通用内核头文件目录

    • 路径:include/linux/
    • 功能:包含与硬件无关的核心内核API和数据结构,如模块管理(module.h)、文件系统(fs.h)、内存管理(slab.h)等。
    • 设计原因:将通用功能抽象为独立模块,便于驱动开发者跨平台调用,减少代码冗余。
  2. 架构相关头文件目录

    • 路径:arch/[架构名]/include/asm/(如arch/arm/include/asm
    • 功能:定义特定处理器架构的寄存器操作(如asm/io.h)、中断控制(asm/irq.h)和原子操作(asm/atomic.h)。
    • 设计原因:隔离硬件差异,通过符号链接(asm指向具体架构目录)实现编译时的平台适配。
  3. 平台设备相关目录

    • 路径:arch/[架构名]/mach-*/include/mach/(如arch/arm/mach-s3c24xx/include/mach/
    • 功能:提供SoC芯片级寄存器定义(如三星S3C系列GPIO配置)。
    • 设计原因:针对特定嵌入式平台定制硬件描述,增强代码可移植性。
  4. 设备树(Device Tree)支持目录

    • 路径:include/linux/of.h
    • 功能:解析设备树(DTS)中的硬件配置信息,如of_property_read_u32读取设备属性。
    • 设计原因:解耦硬件描述与驱动代码,实现动态硬件配置。
bash
Linux内核源码目录示例 
linux/
├── include/                 # 通用头文件 
   ├── linux/               # 核心API(模块、文件系统等)
   └── asm-generic/         # 跨架构通用定义 
├── arch/                    
   └── arm/                 # ARM架构相关 
       ├── include/asm/     # 架构级硬件操作(如寄存器读写)
       └── mach-s3c24xx/    # 三星S3C24xx平台特定定义 
└── drivers/                 # 驱动代码目录 
    └── usb/                 # USB驱动实现

常用头文件介绍

一、基础模块与内核交互

  1. linux/module.h

    • 功能:模块化开发核心头文件,提供module_init/module_exit等宏,支持动态加载和卸载驱动模块。
  2. linux/kernel.h

    • 功能:包含内核常用函数原型(如printk日志输出)、宏定义(如container_of)和内核数据类型定义。
  3. linux/init.h

    • 功能:定义__init__exit宏,用于标记初始化函数和清理函数,优化内存占用。

二、字符设备与文件操作

  1. linux/fs.h

    • 功能:定义文件操作相关结构体(如file_operationsinodefile),支持注册字符设备(register_chrdev)。
  2. linux/cdev.h

    • 功能:提供字符设备结构体cdev及相关操作函数(如cdev_initcdev_add)。
  3. linux/uaccess.h

    • 功能:包含用户空间与内核空间数据交换函数(如copy_to_usercopy_from_user)。

三、设备模型与总线

  1. linux/device.h

    • 功能:定义设备模型相关结构体(deviceclassdriver),支持设备节点自动创建(如class_createdevice_create)。
  2. linux/platform_device.h

    • 功能:平台设备驱动框架,用于管理SoC集成外设(如GPIO、时钟控制器)。

四、中断与同步机制

  1. linux/interrupt.h

    • 功能:中断处理相关函数(如request_irqfree_irq)和中断描述符定义。
  2. linux/wait.h

    • 功能:定义等待队列(wait_queue_head_t)及相关操作(如wait_eventwake_up),用于进程阻塞与唤醒。
  3. linux/spinlock.h

    • 功能:提供自旋锁(spinlock_t)和互斥锁(mutex)机制,保护共享资源。

五、内存管理与IO操作

  1. linux/slab.h

    • 功能:内核内存分配函数(如kmallockzallockfree)。
  2. asm/io.h

    • 功能:提供IO内存操作函数(如ioremapiowrite32ioread32)和端口操作(inboutb)。
  3. linux/mm.h

    • 功能:内存管理相关函数,如页面分配(get_free_page)和内存映射操作。

六、平台相关头文件

  1. mach/*.hplat/*.h
    • 功能:针对特定处理器架构(如ARM)或平台(如三星S3C系列)的寄存器定义和硬件操作宏,通常位于arch/arm/mach-*/include/mach/目录。

七、其他关键头文件

  1. linux/errno.h

    • 功能:定义错误码(如EINVALENOMEM),便于驱动返回标准错误。
  2. linux/delay.h

    • 功能:提供延时函数(如mdelayudelay),支持忙等待或休眠。
  3. linux/of.h

    • 功能:设备树(Device Tree)解析函数(如of_find_node_by_nameof_property_read_u32),用于获取硬件配置信息。

设备树语法概览
解决 [Vivado 12-8300] Launch HLS failed! Please see vitis_hls.log for details.