Heng30的博客
搜索 分类 关于 订阅

一篇文章教会你如何将驱动代码分割成不同的文件,方便组织管理?

2025-03-05

写简单的驱动,一般一个源文件就足够了。写复杂的驱动,不仅要按照不同的功能模块组织项目。而且还有可能在一个项目里构建几个驱动。所以源文件也会比较多。下面就带大家看看如何将多个文件编译成一个驱动程序?

目录结构

├── add.c
├── include
│   └── add.h
├── main.c
└── Makefile

实例代码

// main.c

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

#include "add.h"

static int __init mulfiles_init(void) {
    pr_info("mulfiles_init\n");
    pr_info("1 + 2 = %d\n", add(1, 2));
    return 0;
}

static void __exit mulfiles_exit(void) {
    pr_info("mulfiles_exit\n");
}

module_init(mulfiles_init);
module_exit(mulfiles_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("heng30");
MODULE_VERSION("v0.0.1");
MODULE_DESCRIPTION("A simple mulfiles kernel module");
// add.h

#pragma once

int add(int a, int b);
// add.c

#include "add.h"

int add(int a, int b) { return a + b; }

Makefile编译脚本

#!/bin/sh

top-dir = $(shell pwd)
kernel-version = $(shell uname -r)
kernel-dir ?= /lib/modules/$(kernel-version)/build

obj-m += mulfiles.o
mulfiles-objs = main.o add.o

cflags = -I$(top-dir)/include

all:
        make -C $(kernel-dir) ccflags-y=$(cflags) modules M=$(top-dir)

clean:
        rm -f *.o *.ko *.mod *.mod.c *.order *.symvers
        make -C $(kernel-dir) clean m=$(top-dir)

编译脚本中要注意的是:mulfiles-objs = main.o add.o。这里的是驱动名称-objs

测试

  • 安装驱动:insmod mulfiles.ko

  • 移除驱动:rmmod mulfiles.ko

  • 查看输出:dmesg