惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 聂微东
宝玉的分享
宝玉的分享
Apple Machine Learning Research
Apple Machine Learning Research
罗磊的独立博客
Last Week in AI
Last Week in AI
WordPress大学
WordPress大学
博客园 - 【当耐特】
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
博客园 - 司徒正美
博客园 - Franky
爱范儿
爱范儿
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tailwind CSS Blog
Hugging Face - Blog
Hugging Face - Blog
Jina AI
Jina AI
量子位
博客园 - 叶小钗
博客园_首页
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
The Cloudflare Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

博客园 - bitwoods

Linux驱动开发:内核模块堆叠(1) Linux驱动开发:内核模块与普通应用的区别 c++ prepareStatement使用like查询语句的方式 glog编译报错解决 阿里云Ubuntu服务器优化 linux c++程序使用MD5 串口AT与数据的混杂接收处理 蓝牙Mesh简介(一)设备标识:UUID和Mesh地址 MT7621 openWrt插件操作GPIO(mmap) adblock plus 您的地区不可用 OpenWRT 修改固件默认显示中文 OpenWRT:插件自启动 OpenWRT编译时修改时区与主机名 SC200L Android10启动和关机修改 ILI9881D驱动 ubuntu20.04 微信和迅雷安装包 开启power management功能有坑,ESP32串口频繁出现UART_BREAK中断 MAC地址与字符串的相互转化 ESP32音频开发板ESP32-Korvo V1.1踩坑
Linux驱动开发:从一个最简单的模块开始
bitwoods · 2026-02-03 · via 博客园 - bitwoods

万事总有第一步,对于程序世界,第一步多数都是从Hello World开始,这里也就随大流了:
代码 hello.c

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
    printk(KERN_ALERT "Hello, world\n");
    return 0;
}
static void hello_exit(void)
{

    printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);

Makefile

obj-m += hello.o

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

all:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) clean

编译:

make

# 大致的输出如下,实际输出和当前使用的环境有关
make -C /lib/modules/6.8.0-100-generic/build M=/home/ps/code/test modules
make[1]: Entering directory '/usr/src/linux-headers-6.8.0-100-generic'
warning: the compiler differs from the one used to build the kernel
  The kernel was built by: x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04.2) 12.3.0
  You are using:           gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04.2) 12.3.0
  CC [M]  /home/ps/code/test/hello.o
  MODPOST /home/ps/code/test/Module.symvers
  CC [M]  /home/ps/code/test/hello.mod.o
  LD [M]  /home/ps/code/test/hello.ko
  BTF [M] /home/ps/code/test/hello.ko
Skipping BTF generation for /home/ps/code/test/hello.ko due to unavailability of vmlinux
make[1]: Leaving directory '/usr/src/linux-headers-6.8.0-100-generic'

编译成功后当前文件夹下有hello.ko存在

加载到内核

sudo insmode hello.ko

从内核卸载

sudo rmmod hello

查看系统日志

sudo dmesg |tail

# 大致如下
...
[90123.933097] hello: loading out-of-tree module taints kernel.
[90123.933103] hello: module verification failed: signature and/or required key missing - tainting kernel
[90123.933658] Hello, world
[90178.872518] Goodbye, cruel world

对于日志中上方的两条的警告信息可以不用理会或者自行AI,下方两条就是我们加载和卸载模块时的log,与程序代码预期一致