linux的uapi文件夹,【linux】Linux kernel uapi header file(用户态头文件)

Linux从3.7版本后引入uapi目录,将用户空间API的头文件独立,以解决头文件循环包含的问题。这减少了内核头文件的复杂性,简化了API之间的依赖,并方便用户追踪API的变化,通过git历史查看更新。

uapi目录的创建原因

Linux在3.7以后把很多header file移到 include/uapi或是arch/xxxx/include/uapi下,为了解决include recursive(循环包含头文件)的问题。

英文参考文档:https://lwn.net/Articles/507794/

解决include recursive问题的方法

例如:在A.h中inline function时发现里面用到的某些struct定义在B.h中,而B.h中又有inline function需要用到A.h中的struct,就会造成循环包含recursive include

uapi的创建

把userspace API的文件独立到 include/uapi跟arch/xxxx/include/uapi下,

举例来说本来header中

/* Header comments (copyright, etc.) */

#ifndef _XXXXXX_H /* Guard macro preventing double inclusion */

#define _XXXXXX_H

[User-space definitions]

#ifdef __KERNEL__

[Kernel-space definitions]

#endif /* __KERNEL__ */

[User-space definitions]

#endif /* End prevent double inclusion */

换成如下两个文件

a. kernel space的东西放在原本路径下

/* Header comments (copyright, etc.) */

#ifndef _XXXXXX_H /* Guard macro preventing double inclusion */

#define _XXXXXX_H

#include [Kernel-space definitions]

#endif /* End prevent double inclusion */

/* Header comments (copyright, etc.) */

b. uapi目录下创建同名文件

#ifndef _UAPI__XXXXXX_H /* Guard macro preventing double inclusion */

#define _UAPI__XXXXXX_H

[User-space definitions]

#endif /* End prevent double inclusion */

好处

减少与简化kernel-only header的size;

现在kernel header有的是文件中一部分export给userspace用。这样做简化了头文件间的交互相依性。

处理用户态的人更容易追踪API的变更,透过git来追踪uapi下的log更容易在每个kernel的释放版本中知道做了那些修改

转发自:http://vh21.github.io/linux/2014/11/21/linux-kernel-uapi-include-file.html

<think>根据用户的问题,我们需要讨论在VSCode中进行Linux驱动开发时,如何配置`intelliSenseMode`。这个问题涉及到C/C++扩展的配置,尤其是在驱动开发这种需要特定编译器和内核头文件的场景。 从引用[2]中可以看到一个配置示例,其中指定了`intelliSenseMode`为`linux-gcc-x64`。在Linux驱动开发中,我们通常需要交叉编译,所以可能需要调整这个模式。 在VSCode中,`intelliSenseMode`用于告诉C/C++扩展使用哪种IntelliSense引擎来提供代码补全、错误检查等功能。对于Linux驱动开发,我们通常使用gcc作为编译器,所以模式通常选择与gcc兼容的模式。 ### 配置方法 1. **打开C/C++配置**:在VSCode中,按下`Ctrl+Shift+P`,输入`C/C++: Edit Configurations (JSON)`,然后选择该命令打开`c_cpp_properties.json`文件。 2. **设置intelliSenseMode**:在`configurations`数组中,找到你的配置(例如"Linux"),然后设置`intelliSenseMode`属性。对于Linux驱动开发,通常使用: - 如果目标架构是x86_64:`linux-gcc-x64` - 如果目标架构是ARM:`linux-gcc-arm` 或 `linux-gcc-arm64`(根据具体架构) 例如,针对ARM64架构的驱动开发: ```json { "name": "Linux-ARM", "intelliSenseMode": "linux-gcc-arm64", // 其他配置... } ``` 3. **设置正确的编译器路径**:`compilerPath`需要指向你的交叉编译器(如果使用交叉编译)或者本机编译器(如果是本地编译)。例如: - 交叉编译ARM64:`/path/to/gcc-linaro-aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc` - 本地x86_64编译:`/usr/bin/gcc` 4. **包含路径**:必须包含内核头文件路径。例如: ```json "includePath": [ "${workspaceFolder}/**", "/path/to/your/linux-kernel-headers/include", "/path/to/your/linux-kernel-headers/arch/arm64/include" ], ``` ### 示例配置 下面是一个针对ARM64架构的Linux驱动开发的配置示例(参考引用[2]的格式): ```json { "configurations": [ { "name": "Linux-ARM64-Driver", "includePath": [ "${workspaceFolder}/**", "/home/user/linux-kernel/include", "/home/user/linux-kernel/arch/arm64/include", "/home/user/linux-kernel/arch/arm64/include/generated" ], "defines": [ "__KERNEL__", "MODULE" ], "compilerPath": "/opt/toolchains/gcc-linaro-aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc", "cStandard": "c11", "cppStandard": "gnu++17", "intelliSenseMode": "linux-gcc-arm64", "browse": { "path": [ "/home/user/linux-kernel/include", "/home/user/linux-kernel/arch/arm64/include", "${workspaceRoot}" ], "limitSymbolsToIncludedHeaders": true, "databaseFilename": "" } } ], "version": 4 } ``` ### 注意事项 1. **内核头文件**:确保你配置的内核头文件路径与你要开发的内核版本一致。通常你需要先编译内核以生成一些头文件(如`include/generated/uapi/linux/version.h`)。 2. **宏定义**:驱动开发需要定义`__KERNEL__`和`MODULE`等宏,以便正确解析内核代码。 3. **更新配置**:当你切换内核版本或工作区时,记得更新配置。 4. **重新加载**:修改配置文件后,可能需要重新加载VSCode窗口(Ctrl+Shift+P,输入`Reload Window`)使配置生效。 ### 验证配置 编写一个简单的驱动代码,检查IntelliSense是否正常工作(没有红色波浪线)。例如: ```c #include <linux/module.h> #include <linux/kernel.h> static int __init my_module_init(void) { printk(KERN_INFO "Hello, world!\n"); return 0; } static void __exit my_module_exit(void) { printk(KERN_INFO "Goodbye, world!\n"); } module_init(my_module_init); module_exit(my_module_exit); MODULE_LICENSE("GPL"); ``` 如果头文件被正确找到,那么`printk`、`module_init`等函数和宏应该被正确识别。 ### 相关问题 §§ 相关问题 §§ 1. 如何在VSCode中为不同的内核版本切换头文件路径? 2. 在Linux驱动开发中,如何配置VSCode的调试功能? 3. 如何解决Linux内核头文件中的宏定义导致的IntelliSense错误? 以上配置可以帮助你在VSCode中高效地进行Linux驱动开发[^2]。 </think>### VSCode中Linux驱动开发`intelliSenseMode`配置指南 在Linux驱动开发中,`intelliSenseMode`是`.vscode/c_cpp_properties.json`文件的关键配置项,它决定了C/C++扩展如何解析内核代码[^2]。以下是详细配置方法: #### 核心配置项 ```json { "configurations": [ { "name": "Linux Kernel", "intelliSenseMode": "linux-gcc-x64", // 架构选择见下表 "compilerPath": "/usr/bin/gcc", // 推荐使用目标平台交叉编译器 "includePath": [ "${workspaceFolder}/**", "/lib/modules/$(uname -r)/build/include", // 当前内核头文件 "/path/to/cross-kernel/include" // 交叉编译内核头文件 ], "defines": [ "__KERNEL__", // 必须定义 "MODULE", // 模块开发定义 "DEBUG" // 调试模式 ], "cStandard": "c11", // Linux内核使用C11标准 "cppStandard": "gnu++14" } ], "version": 4 } ``` #### `intelliSenseMode`选择矩阵 | 目标平台 | 推荐值 | 说明 | |---------------|-------------------------|------| | **x86_64** | `linux-gcc-x64` | 标准PC开发[^2] | | **ARM32** | `linux-gcc-arm` | 树莓派等32位ARM设备 | | **ARM64** | `linux-gcc-arm64` | 新款嵌入式设备 | | **PowerPC** | `linux-gcc-ppc64le` | 特定工控设备 | | **自定义** | `gcc-x64` (默认) | 当不确定时使用 | #### 关键注意事项 1. **内核头文件路径** 必须包含当前运行内核的构建头文件: ```json "/lib/modules/$(uname -r)/build/include" ``` 交叉编译时需替换为交叉编译内核的`include`路径 2. **必须定义的宏**[^4][^3] ```json "defines": [ "__KERNEL__", // 标识内核空间代码 "MODULE", // 模块开发标识 "__linux__" // Linux平台标识 ] ``` 3. **编译器路径** 推荐使用与目标平台匹配的交叉编译器: ```json "compilerPath": "/opt/gcc-arm-10.3-2021.07/bin/arm-none-linux-gnueabi-gcc" ``` #### 验证配置效果 1. **诊断驱动头文件** 创建测试文件`test_header.c`: ```c #include <linux/module.h> #include <linux/init.h> ``` 若无红色波浪线报错,则配置成功 2. **检查符号解析** 在驱动函数中输入: ```c struct file_operations fops; fops. ``` 应弹出`read`、`write`等成员提示 #### 常见问题解决 **问题:找不到`<linux/*>`头文件** ```json // 解决方案:添加内核架构头文件 "includePath": [ ..., "/lib/modules/$(uname -r)/build/arch/x86/include" // x86示例 ] ``` **问题:驱动API无智能提示** ```json // 解决方案:启用GNU扩展 "cStandard": "gnu11", "intelliSenseMode": "linux-gcc-x64" ``` **问题:PCI驱动符号未识别**[^3] ```json // 添加PCI相关定义 "defines": [ ..., "CONFIG_PCI", "CONFIG_PCI_MSI" ] ``` #### 推荐扩展 1. **C/C++** (ms-vscode.cpptools) - 基础智能感知 2. **C/C++ Advanced Lint** (joshpeng.lint) - 内核编码规范检查 3. **Makefile Tools** (ms-vscode.makefile-tools) - 驱动Makefile支持
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值