Linux驱动--驱动编译

1、驱动类型

**字符设备驱动 :**字符设备驱动是Linux驱动开发中最基础的类型,其特征是按字节流进行顺序读写,数据没有固定的结构,每次读写一个或多个字节。常见的串口、键盘、鼠标、LED、蜂鸣器等都属于字符设备。

**块设备驱动:**块设备驱动用于管理以固定大小的数据块(如512字节或4KB)为单位进行随机读写的存储设备,如硬盘、SSD、U盘等。与字符设备不同,块设备驱动需要处理复杂的I/O调度、缓存和可能的DMA传输

网络设备驱动: 网络设备驱动负责管理网络接口卡(NIC),其核心任务是在硬件和内核网络协议栈之间收发数据包。它需要处理TCP/IP、UDP、ICMP等网络协议

2、驱动编译

2.1 静态编译

静态编译是一种将驱动程序直接集成到内核映像中的编译方式。

静态编译流程

  • 在合适的内核目录下编写驱动代码 demo.c
  • 修改Kconfig新增配置项,如下图所示

config DEMO //配置项名

bool "this is a demo" //bool :可配置为开启和关闭 简介

default y //默认为y开启

help //补充说明

this is a DEMO

  • 修改Makefile添加相应的编译规则,如下图所示
  • make menuconfig中勾选该配置项,对应配置项的CONFIG_XXX 会加入.config文件中

2.2 动态编译

动态编译是将驱动代码以模块的方式编译,动态加入内核或者从内核中去除

动态编译流程

  • 编写驱动程序demo.c
  • 修改Kconfig,新增配置项,与静态编译不同,动态编译配置类型为tristate,default配置y默认开启、n默认关闭、m 默认为模块
  • 通过make menuconfig 选择 M,以模式形式编译
  • 对应配置项的CONFIG_XXX 会加入.config文件中 CONFIG_XXX =m
  • 在Makefie中 obj-$(CONFIG_XXX ),以模块编译
  • make modules 内核会编译所有模块生成一个.ko驱动文件

2.3动态编译在vscode上的编程框架

2.3.1程序框架

static __init int init_my_module(void) //__init与__exit相同,表示执行一次后释放内存

module_init(init_my_module); //模块程序入口

module_exit(exit_my_module); //模块程序出口

MODULE_LICENSE("GPL"); //声明内核遵循GPL(通用公共许可)

MODULE_AUTHOR("pute"); //作者信息

复制代码
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/module.h>

static __init int init_my_module(void)
{
    printk("init module success!\n");

    return 0;
}

static __exit void exit_my_module(void)
{
    printk("exit module success!\n");

    return;
}

module_init(init_my_module);
module_exit(exit_my_module);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("pute");
2.3.2 Makefile框架

make -C : 表示执行时临时切换到指定目录 M=用于指定特定路径的模块

复制代码
#模块名
modulename := module_drv

#内核路径
kerdir := /home/linux/....

#挂载目录
getdir := ....

#当前目录路径
pwd := $(shell pwd)

#加入模块
obj-m += $(modulename).o

all:
	make -C $(kerdir) modules M=$(pwd)
	cp $(modulename).ko ~/nfs/rootfs 

.PHONY:
distclean:
	make -C $(kerdir) modules M=$(pwd) clean
	rm $(getdir)/$(modulename).ko
clean:
	make -C $(kerdir) modules M=$(pwd) clean
相关推荐
分布式存储与RustFS4 分钟前
升级 RustFS 二进制不停机:一条一条换,留一条退路
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
小蜗 strong4 分钟前
和电脑猜拳(随机程序应用)
服务器·前端·python
吴声子夜歌15 分钟前
Nginx应用与运维——Nginx核心配置指令(一)
运维·nginx
android阿杜21 分钟前
Ubuntu 26.04 LTS 系统每次重启后屏幕亮度都会增加一点
linux·运维·ubuntu
YumiProxy23 分钟前
服务器动态IP导致SSH频繁断连?从保活配置到自动重连的完整排查方案
服务器·tcp/ip·ssh
懿路向前32 分钟前
【唤醒实战笔记】2026-09-29 | 智能体提示词迭代史(v1 → v8)
linux·笔记·算法
路溪非溪2 小时前
Linux下Shell脚本基础知识(二)
linux·运维·服务器
fruge2 小时前
飞牛OS部署Flare导航页:Docker Compose、YAML书签配置与cpolar公网访问
运维·docker·容器
嵌入式分享2 小时前
驱动之路#44:硬件 I2C 和软件 I2C 谁更坑?
linux·嵌入式硬件
NailiConveyor2 小时前
输送机皮带材质选型指南:PVC、PU、橡胶、模块化塑料各适用什么场景?
大数据·运维·自动化·制造·业界资讯·材质