Linux Kernel Module编程,多个源文件编译成一个模块的解决方案

将多个设备合并为一个内核模块 这篇文章主要解决如何将之前介绍的三个字符设备驱动程序合并为一个内核模块,即将null字符设备驱动程序、zero字符设备驱动程序、4k大小的临时存储空间的字符设备驱动程序合并为一个内核模块,能够加载到内核模块中,具体实现过程如下所示: 将之前提到的三个驱动程序放在同一个目录下,即mydev_null.c、mydev_zero.c、mydev_temp.c和mydev_temp.h文件放在某个文件夹 阅读详情

陆陆续续也写了几个Linux内核模块了,但每次都是把代码写在一个源文件中,上次尝试了写在两个.c文件中,结果没有编译通过。

无奈之下,将其中一个.c文件重命名成.h文件,再include当另一个当中。但是,在.h文件中写函数的实现总感觉怪怪的。

今天查看了以下Kbuild的文档,有如下描述:

    If a kernel module is built from several source files, you specify
    that you want to build a module in the same way as above.

    Kbuild needs to know which the parts that you want to build your
    module from, so you have to tell it by setting an
    $(<module_name>-objs) variable.

    Example:
        #drivers/isdn/i4l/Makefile
        obj-$(CONFIG_ISDN) += isdn.o
        isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o

    In this example, the module name will be isdn.o. Kbuild will
    compile the objects listed in $(isdn-objs) and then run
    "$(LD) -r" on the list of these files to generate isdn.o.

整理自己的源文件成两个.c文件(simpLB.c和sahu_lb_tools.c)、一个.h文件(sahu_lb.h)和Makefile文件。两个.c文件都包含了sahu_lb.h

按照Kbuild的文档所述,把Makefile改成如下内容:

obj-m +=simpLB.o
simpLB-objs:=sahu_lb_tools.o
all:
  make -C /lib/modules/`uname -r`/build M=`pwd`
clean:
  make -C /lib/modules/`uname -r`/build M=`pwd` clean
install:
  /sbin/insmod simpLB.ko
remove:
  /sbin/rmmod simpLB

编译没有问题,但是安装后模块的功能没有实现,就连我在init_module()中打印的提示信息都没有。lsmod却有simpLB。

只好再上网查了查,发现如下文章:

http://www.linuxquestions.org/questions/programming-9/linking-multiple-files-kernel-module-programming-701735/

按照文章的的建议,我把Makefile修改成如下内容:

obj-m +=sahuLB.o
sahuLB-objs:=simpLB.o sahu_lb_tools.o
all:
  make -C /lib/modules/`uname -r`/build M=`pwd`
clean:
  make -C /lib/modules/`uname -r`/build M=`pwd` clean
install:
  /sbin/insmod sahuLB.ko
remove:
  /sbin/rmmod sahuLB

问题解决!

关于linux内核模块编程时,多个源代码文件Makefile书写的问题 在学习内核模块编程的时候遇到了一些由于Makefile书写不正确导致的问题。一个.c源文件的Makefile按照网上的大部分资料介绍那样是没有问题的,多个源文件的内核模块编程时,就出现问题了,自己纠结了半天,最后查资料、请教大神才搞定的。把过程和解决方法贴出来,供大家参考,一起学习。 网上有很多文章讲解内核模块编程的例子,例如下面这个简单的例子: #hello.c #ifndef __KE 阅读详情

相关推荐

基于Android平台的kernel module编程

如何加载kernel module我已在上一篇文章中详细描述,可以参考下。 这篇文章主要是针对我在android平台上编写kernel module时遇到的一些问题的记录及解决方案。 kernel module兼容性问题:      首先不得不吐嘈下在android平台上做kernel module是个完全没有前景的事,由于kernel module是版本依赖和机器依赖的,一般能作为

Carelife的小站 769

【Linux驱动】内核模块编译 —— make modules 的使用(单模块编译、多模块编译)

【Linux驱动】内核模块编译 —— make modules 的使用(单模块编译、多模块编译)

challenglistic的博客 9212

Linux kernel 分析之十三:kbuild系统-编译到内核和编译成模块的区别

代码编译到内核和编译成模块在代码中有什么区别呢? 从模块的代码中看是一样的。入口函数都是module_init(fun),但是代码中的条件编译会使宏module_init()在编译到内核和编译成模块的情况下替换成不同的代码。 include/linux/init.h中可知#ifndef MODULE... #define module_init(x)  __initcall(x);...

vanileo的专栏 1219

内核模块高级1-多文件编译、加载、参数传递

对于比较复杂的驱动程序,常常会把它的功能进行拆分,由不同的文件实现,这样也能进行并行开发,缩短开发周期。多文件编译的简单例子如下:ext.cMakefile其中KERNELDIR是内核源码目录所在的路径。新增了ext.c及ext.h,在里面定义了xxx_init机xxx_exit函数。在Makefile里面的第2行“mymod-objs=mod.o ext.o”表示mymod模块是由mod.o和ext.o两个目标文件共同生成的,最后生成的文件为mymod.ko。

qq_40896451的博客 1504

Linux: module实例

Kernel 模块编译实例,不能用gcc 编译。如果用gcc 编译会出现各种错误。 [root@mzhan017]# cat Makefile obj-m += mtu5.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 mtu5.c #include &

mzhan017的博客 1180

突破NER性能瓶颈:BERT与LLM协同的混合架构实践

性能卓越:在多个测试集上,F1分数比单一模型提升5-15%成本可控:相比纯LLM方案,成本降低60%以上易于落地:架构清晰,便于调试和优化这种"专才+通才"的组合思路可以扩展到其他NLP任务中,如关系抽取、事件提取、文本分类等。更精细的流水线优化多模型投票机制在线学习与自适应调整不追求单一模型的万能,而是通过精心设计的组合,让每个组件发挥其独特优势,最终实现系统性能的最优化。欢迎在评论区分享你在NER任务中的实践经验,或者对这个混合架构的改进建议!

Ven%的博客 1022

双linux内核,两个相互依赖的Linux内核模块的结构?

在一个我参与的项目中,我们具有以下硬件设置:Linux PC ------> "Router" +----> "Device A"|+----> "Device B"Linux PC是标准的X86 PC.“路由器”是我们开发的硬件,已连接到系统中的其他硬件.在此示例中,“设备A”. “路由器”使用USB连接到Linux PC.“设备A”和“设备B”是系统中的硬件.它们通过某些通信...

weixin_42311115的博客 465

修复zookeeper未授权访问漏洞

【代码】修复zookeeper未授权访问漏洞。

qq_28392947的博客 4068

Linux kernel:多个.c和.h文件编译成一个.ko模块

Linux系统中编写驱动程序,使用多个.c和.h源文件编译得到一个.ko模块,简单举例并编译运行。

baidu_38797690的博客 4092

新手必看!BUUCTF-PWN题实战:从零搭建Kali环境到成功RIP栈溢出

本文为CTF二进制安全新手提供了一份详实的BUUCTF-PWN入门指南。内容涵盖从零搭建Kali Linux环境、安装配置pwntools等核心工具,到深入浅出地讲解栈溢出原理与汇编基础,并手把手带领读者完成一道名为“rip”的经典栈溢出题目实战,成功利用漏洞获取系统权限。

t8u9v0w1x的博客 504

Autosar Davinci Configurator新建工程以及导入DBC和CDD

Autosar Davinci Configurator新建工程前言一、Autosar Davinci Configurator新建工程二、Autosar Davinci Configurator导入DBC和CDD1.引入库2.读入数据总结 前言 如何用 DavinciCFG 新建工程,以及导入DBC和CDD文件。 一、Autosar Davinci Configurator新建工程 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、Autosar Davinc

别再跑偏了的博客 1万+

Linux中多个.c文件编译为一个模块.ko

例如现在有三个文件: exp.c exps.c exp.h 这是目前做实验的代码,其中exps中是工具函数,其内容被exp.c调用,exp.h是exps.c文件中函数的声明以及一些结构体的定义。 下面介绍将exp.c与exps.c编译为一个模块ex.ko,以及在这个过程中遇到的一系列问题。 由于exps.c中是一些工具函数,所以在exps.c中不需要module_init、module...

SweeNeil 4908

ROS1集群通信的可靠升级方案:为什么在无线环境下我选择了swarm_ros_bridge而非原生DDS

本文探讨了ROS1集群通信在无线环境下的可靠升级方案,重点分析了swarm_ros_bridge相较于原生DDS的优势。通过实际案例和性能对比,展示了ZeroMQ在无线通信中的稳定性和高效性,特别适合无人机编队和移动机器人集群等场景。

weixin_42567279的博客 386

Linux模块编程机制之hello kernel

作者:bullbat                看了那么多理论知识,可能还是一头雾水,是啊,纯理论分析本来就不好理解。为了更好的理解Linux内核各种内部机制以及其运用,在接下来的学习中将采用理论+实验+源码注释的方式进行。包括算法、原理的实验,内核的局部扩展与修改等。Linux内核编程有很多方法,最方便的方式是使用内核提供的模块编程机制,另一种方式是以补丁的方式,这种方式只需要编译一次内

bullbat的专栏 9893

Doris数据过期策略:自动清理历史数据

在数据的世界里,就像我们的房间会堆满各种东西一样,数据库也会积累大量的数据。随着时间的推移,很多历史数据可能不再经常被使用,但它们却占据着宝贵的存储空间。Doris是一款强大的数据库,为了让它能更高效地运行,合理地管理数据,我们就需要一种方法来自动清理那些不再需要的历史数据。本文的目的就是详细介绍Doris的数据过期策略,让大家知道如何利用这个策略来实现自动清理历史数据。范围涵盖了从基本概念到实际操作的各个方面。本文会先介绍一些和Doris数据过期策略相关的术语,让大家对一些专业词汇有个基本的了解。

软件工程实践的博客 556

【QT开发教程】使用Qt进行蓝牙低功耗(BLE)编程

蓝牙低功耗(BLE,Bluetooth Low Energy)技术广泛应用于现代设备中,例如智能手表、健身追踪器和物联网设备。Qt提供了一套完整的Bluetooth模块,使开发者可以轻松地在应用程序中实现BLE通信功能。本文将介绍如何在Qt中进行BLE编程,包括基本概念、使用方法以及一些实际的示例。

科技改变人类,技术成就未来 2869

linux module 加载kernel log

一、Linux Module背景 1、什么是Linux kernel module 操作系统的内核是单一体系结构(monolithic kernel)的。整个内核是一个单独的非常大的程序。与单一体系结构相对的是微内核体系结构(micro kernel),比如Windows NT采用的就是微内核体系结构。对于微内核体系结构特点,操作系统的核心部分是一个很小的内核,实现一些最基本的服务,如创建和删除进程、内存管理、中断管理等等。而文件系统、网络协议等其它部分都在微内核外的用户空间里运行。 这两种体系的内核各有

sdl0358的博客 514

195、大模型蒸馏与压缩:知识蒸馏与VLA模型轻量化

折腾完这一整套流程,最大的感悟是:知识蒸馏不是简单的模型压缩,而是知识迁移的工程艺术。每一步都有坑,每个参数都可能影响最终性能。给后来者的建议是:先别急着上蒸馏,把teacher模型的推理延迟和显存占用测清楚,确定瓶颈在哪里——是计算量太大还是内存带宽不够,这决定了你该用蒸馏还是量化还是剪枝。蒸馏训练时一定要监控每一层的特征对齐loss,别只看总loss。如果某一层的对齐loss特别高,说明student在这一层学歪了,需要调整该层的损失权重或者增加该层的投影头容量。

sundong_81的博客 112

linux内核模块编译,多个源文件的makefile编写解决init_module不调用的问题

当你存在两个源文件test.c test2.c test.h;其中test.c源依赖于test2.c 要如何编写makefile,来实现内核模块test.ko的编译,并且不会有不调用init_module入口函数的问题。 Kbuild的文档,有如下描述: If a kernel module is built from several source files, you specify...

zgp2917的专栏 1355

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

linux kernel驱动之module_init

在接触过的linux kernel驱动中(camera sensor驱动, TP驱动),模型都是一样的 #include //...... //....... static int __init XXX_init(void) { //... } static void __exit XXX_exit(void) { //... } module_init(XXX_i

miemie88的专栏 796

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

linux模块编程

linux模块编程的流程:  一,编写源文件,如mymodule.c  点击(此处)折叠或打开#include linux/module.h>#include linux/kernel.h>#include linux/init.h>static int __init lkp_init(void){        printk("hello\n");        return 0;}stati

想混互联网的笨小孩 575

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

编写一个简单的linux kernel rootkit

编写一个简单的linux kernel rootkit

windy_ll的博客 1237

kernel module的单独的编译与insmod

单独编译kernel的module,方便调试。下面介绍详细测试过程。

wolfnx 1431

Linux内核模块编程

 摘要Linux内核模块编程的资料有些纷繁复杂,有的过于简单,有的过于庞杂,我试图用笔记的形式想读者展示怎样来进程Linux模块编程,力图做到简明扼要,这篇文章也是作为本人备忘的资料,所以有些地方过于简略是难免的。本来这篇文章的目的就是让用户知其然,至于所以然还是请参考相应的资料,其实最好的资料莫过于Linux Kernel Source。 适用范围: Linux Kernel

技术资料库 2545

<linux/kernel.h>头文件

是 Linux 内核编程中的一个重要头文件,包含了许多常见的内核功能和宏的声明和定义。这些功能和宏涵盖了内核调试、日志输出、断言、定时器、延迟操作、互斥锁和自旋锁、同步和事件通知、内存拷贝、设备管理、物理内存和 I/O 空间的映射等。了解 中这些功能和宏的使用方法对于编写高效、稳定的 Linux 内核代码至关重要。开发者应仔细阅读相关文档和参考资料,并根据硬件和业务需求进行适配,合理处理错误和管理资源,确保代码的正确性和安全性。

qq_52660422的博客 1881
上一篇: 利用GoogleApp托管自己的PHP代码(Eclipse开发环境)
下一篇: linux module Makefile
sahusoft
博客等级 码龄19年 612粉丝 371原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值