温馨提示×

linux c++怎么编写驱动

小樊
42
2026-07-05 19:20:55
栏目: 编程语言

Linux 下用 C/C++ 编写驱动,通常指的是 内核模块(Kernel Module),而不是应用层的 C++ 程序。
重要结论先说:

Linux 驱动一般用 C 写,不推荐用 C++ 写
内核中不支持标准 C++(无 STL、无异常、无 RTTI)

下面我分几种情况说明,并给你可运行的示例


一、为什么 Linux 驱动通常不用 C++?

Linux 内核:

  • 只使用 GNU C(不是标准 C99/C11)
  • 不支持
    • new / delete
    • 构造函数 / 析构函数
    • 异常处理(try/catch
    • STL(vectorstring 等)
  • C++ 可能导致:
    • 二进制不兼容
    • 复杂调试问题
    • 内核社区不接受

官方推荐:纯 C


二、如何写一个最简单的 Linux 驱动(C 示例)

1️⃣ 环境准备

sudo apt install build-essential linux-headers-$(uname -r)

2️⃣ 最简单的驱动代码(hello.c)

#include <linux/module.h>
#include <linux/kernel.h>

static int __init hello_init(void)
{
    printk(KERN_INFO "Hello, Linux driver!\n");
    return 0;
}

static void __exit hello_exit(void)
{
    printk(KERN_INFO "Goodbye, Linux driver!\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("YourName");
MODULE_DESCRIPTION("A simple Linux driver");

3️⃣ Makefile

obj-m += hello.o

all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

4️⃣ 编译 & 加载

make
sudo insmod hello.ko
dmesg | tail
sudo rmmod hello
dmesg | tail

✅ 你会看到内核日志输出


三、如果你“一定要用 C++”怎么办?

✅ 可行方案:C 封装 + C++ 实现(有限使用)

方法思路

  • 驱动入口仍然是 C
  • 非内核 API 部分(算法、逻辑)用 C++

示例结构

driver/
├── hello.c
├── logic.cpp
├── logic.h

logic.h(C / C++ 兼容)

#ifdef __cplusplus
extern "C" {
#endif

void logic_run(void);

#ifdef __cplusplus
}
#endif

logic.cpp

#include "logic.h"
#include <linux/kernel.h>

void logic_run(void)
{
    printk(KERN_INFO "C++ logic running\n");
}

⚠️ 限制

  • 不能用 STL
  • 不能抛异常
  • 不能 new/delete
  • 只能用基本语法

四、字符设备驱动(真正“驱动硬件”)

进阶结构:

module_init()
 └─ 注册字符设备
     ├─ open
     ├─ read
     ├─ write
     └─ release

关键 API:

  • register_chrdev()
  • file_operations
  • copy_to_user()
  • copy_from_user()

如果你需要,我可以给你一个 完整字符设备驱动示例(LED / 按键 / 虚拟设备)


五、常见问题

❓ C++ 能写 PCI / USB 驱动吗?

✅ 可以,但仍然是 C 接口 + C++ 内部实现

❓ 为什么内核不用 C++?

  • 历史原因
  • 稳定性
  • ABI 不统一
  • 内核代码风格统一

六、总结

需求 建议
学习 Linux 驱动 用 C
写生产驱动 用 C
复用已有 C++ 算法 C 包一层
想用 STL ❌ 不可能

如果你愿意,可以告诉我:

  • ✅ 是 嵌入式 / x86 / ARM
  • ✅ 是 字符设备 / 平台驱动 / PCI / USB
  • ✅ 想做 虚拟驱动还是真实硬件

我可以直接给你 对应场景的完整示例代码

0