Linux内核模块(驱动)编译详解

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

本文主要说说如何编译自己开发的内核模块。由于驱动通常也被编译成内核模块,因此文章的内容也适用于驱动的编译。

由于在下能力相当有限,有不当之处,还望大家批评指正^_^


一、准备工作



准备工作如何做,这里就不详说了。

a) 首先,你要有一台PC(这不废话么^_^),装好了Linux。

b) 安装好GCC(这个指的是host gcc,用于编译生成运行于pc机程序的)、make、ncurses等工具。

c) 如果你是为当前PC机开发内核模块,那么准备工作就结束了。

如果你是为嵌入式系统Linux系统开发内核模块,则继续如下两步

d) 安装好交叉编译工具链。例如,你的目标单板CPU可能是arm或mips等cpu,则安装相应的交叉编译工具链。安装后,需要将工具链路径添加到PATH环境变量中。例如,你安装的是arm工具链,那么你在shell中执行类似如下的命令,假如有类似的输出,就说明安装好了。

[root@localhost linux-2.6.33.i686]# arm-linux-gcc  --version
arm-linux-gcc (Buildroot 2010.11) 4.3.5
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


e) 如果是为嵌入式系统编译模块,则要下载所需的内核源码,配置好,并编译一次。否则,无法编译模块。如果您不熟悉如何配置编译内核,可以参考如下文章:

http://blog.csdn.net/crazycoder8848/article/details/44131735


二、编译

编译模块,总得来说,有如下两种方法。

Linux 驱动开发之内核模块开发 (二)—— 内核模块编译 Makefile 入门 一、模块编译        我们在前面内核编译驱动移植那块,讲到驱动编译分为静态编译和动态编译;静态编译即为将驱动直接编译进内核,动态编译即为将驱动编译模块。 而动态编译又分为两种: a -- 内部编译        在内核源码目录内编译 b -- 外部编译        在内核源码的目录外编译 二、具体编译过程分析            注:本次编译是外部编译,使用 阅读详情

相关推荐

Linux下NVIDIA驱动安装失败:内核模块编译错误排查与解决指南

Linux系统中,内核模块是连接硬件驱动与操作系统内核的核心桥梁,其编译与加载过程涉及内核头文件、编译器工具链、系统安全机制等多个技术环节。理解内核模块的工作原理,对于解决驱动安装问题至关重要。当驱动安装器报告“未能创建内核”错误时,通常意味着内核模块编译失败,这背后可能隐藏着内核头文件不匹配、编译器版本不一致、开源驱动冲突或Secure Boot安全机制阻拦等根因。从技术价值看,掌握这些排查方法不仅能解决NVIDIA显卡驱动安装问题,也适用于其他需要编译内核模块的硬件驱动或系统优化场景。本文以NVIDI

weixin_33994429的博客 428

Linux模块文件编译到内核与独立编译成.ko文件的方法

很多粉丝在群里提问,如何把一个模块文件编译到内核中或者独立变异成ko文件。本文给大家详解讲解。

嵌入式技术开发 6297

Linux系统NVIDIA驱动安装失败:内核模块编译问题深度解析与解决方案

Linux系统中安装硬件驱动,尤其是专有驱动如NVIDIA显卡驱动,是系统管理与高性能计算环境搭建中的常见任务。其核心原理在于驱动需要编译一个与当前运行内核版本严格匹配的内核模块,以实现硬件与操作系统内核间的直接通信。这一过程的技术价值在于释放GPU的全部性能,为深度学习训练、科学计算、图形渲染等计算密集型应用提供底层加速支持。然而,驱动安装常因内核头文件缺失、版本不匹配、编译器工具链不一致或安全启动(Secure Boot)拦截等问题,在编译内核模块阶段失败,具体表现为报错“未能创建内核模块”。本文聚焦

weixin_34262482的博客 442

内核裁剪与驱动编译

会看到很多obj-$(CONFIG_TOUCHSCREEN_GT9XX)+= goodix_gt9xx.o这种代码,是加入驱动代码到内核编译。CONFIG_XXX变量可以取3个不同的值:y、m、n;所以将$(CONFIG_XXX)替换之后也就是定义了三个变量 obj-y、obj-m、obj-n。obj-y 变量中所有的 xxxx.o 所对应的 xxxx.c 文件都会被编译进内核镜像;当在内核源码目录执行“make modules”编译内核模块的时候,obj-m 变量中所有的 xxxx.o 文件对应的 x

wangjie36的博客 833

【Kernel】驱动编译的两种方式:编译模块编译进内核(使用杂项设备驱动模板)

杂项设备的驱动驱动开发中最简单最方便的,核心就是处理write信号和read信号做出对应的反应。如果需要将驱动编译模块前提是有编译好的kernel,并且开发板是烧录的该版本的kernel,编译模块我们只需要新建一个Makefile文件: 然后我们只需要make就会生成.ko文件,然后将ko文件拷贝到开发板中,加载驱动使用insmod、卸载内核使用rmmod。 驱动编译进内核 如果要将驱动编译到内核中去则需要新建两个文件一个Makefile一个Kconfig Makefile Kconfig 相关的Kc

凉开水白菜的博客 3948

Linux内核—模块编译方法

即新功能源码与内核其它代码一起编译进uImage文件内新功能源码与Linux内核源码在同一目录结构下给新功能代码配置Kconfig给新功能代码改写Makefilemake menuconfig 界面里将新功能对应的那项选择成启动开发板观察串口终端中的打印信息。

hhltaishuai的博客 1688

linux编译模块make -C path_to_kernel_src M=`pwd` modules的理解

这篇文章侧重点在M=`pwd`的个人理解,不足之处希望大神斧正,谢谢。     一直以为M=`pwd`是make的参数,可是这个参数也写的够简单。最近重看时,发现常有这样的makefile内容 # Use 'make V=1' to see the full commands ifdef V ifeq ("$(origin V)", "command line") KBUILD_VERBOSE

lixiangminghate的专栏 6423

Linux内核驱动——杂项设备驱动内核模块编译

本文介绍了Linux内核驱动开发中的内存空间分布和杂项设备驱动实现。重点分析了32位系统中1G内核空间与3G用户空间的划分,以及杂项设备作为字符设备子类的优势(固定主设备号、动态次设备号)。通过IMX6ULL开发板的LED驱动实例,详细展示了从硬件地址定义、寄存器映射、文件操作接口实现到模块编译加载的全过程。最后通过应用层测试程序验证了驱动功能,实现了LED的闪烁控制。该案例完整呈现了Linux内核驱动开发的关键技术点,包括内存管理、设备注册、硬件操作和用户态交互等核心内容。

lufrednow_的博客 694

再来一点,把Linux驱动程序编译内核模块

学习如何把驱动程序编译linux 内核模块

huilin9966的博客 600

Linux驱动开发(1):内核模块、设备树、设备树插件的编译加载

内核模块全称 Loadable Kernel Module(LKM), 是一种在内核运行时,加载一组目标代码来实现某个特定功能的机制。模块是具有独立功能的程序,它可以被单独编译,但不能独立运行, 在运行时它被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不一样的。模块由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序和其他内核上层功能。模块本身不被编译入内核映像,这控制了内核的大小。模块一旦被加载,它就和内核中的其它部分完全一样。

lishing6的博客 1666

Linux驱动层】linux内核模块编译makefile

各级子目录中的makefile文件的作用就是先切换到顶层makefile,然后通过obj-m在可加载模块编译列表中添加当前模块,kbuild-makefile就会将其编译成可加载模块

zsyyugong的博客 2694

cmake(10):使用cmake编译linux驱动内核模块

1. 说明 这篇笔记用于说明如何使用cmake构建Linux驱动,这样可以方便地将driver和app作为一个整体统一构建。 2. 示例 首先来看一个代码示例,为了简化起见,我直接在驱动目录下进行构建而没有作为子目录添加到软件工程内。 cmake_minimum_required (VERSION 3.0.0) project(driver_demo) # 由于我的系统更新过内核,所以这里需要设置内核源代码路径 set(KDIR /home/linux/linux-5.12) # 定义编译函数/方法,

翔底的博客 7830

linux驱动编译内核模块笔记

weixin_46855342的博客 134

Linux 驱动开发之内核模块开发——内核模块编译 Makefile 入门

Linux模块编译 通用makfile编译步骤

发如雪 3629

4.17 嵌入式学习之Linux驱动驱动编译内核模块

基础知识:

TheAnswerisy的博客 187

Linux驱动开发--内核模块编译

make modules会在新功能源码的同级目录下生成相应的同名.ko文件(生成的ko文件只适用于开发板linux)即新功能源码与内核其它源码不一起编译,而是独立编译成内核的插件(被称为内核模块)文件.ko。make menuconfig 界面里将新功能对应的那项选择成<M>即新功能源码与内核其它代码一起编译进uImage文件内。b、新功能源码与Linux内核源码不在同一目录结构下时。a、新功能源码与Linux内核源码在同一目录结构下时。注意此命令执行前,开发板的内核源码已被编译

xinqi_1的博客 606

Linux编译内核模块生成.KO驱动示例

以上只是个示例,如果是实际的驱动,比如点亮一个灯这种,那么我们需要将它做成一个字符设备,要做的内容包括跟具体硬件相关的引脚配置,时钟配置,引脚电平操作等。现在的Linux内核十分庞大,驱动繁多,但是仍有一些是内核所不包含的,或者我们前期进行了内核裁剪,但后面又需要添加一些驱动,但是又不想重新烧录内核,这时候就可以使用内核模块功能,对内核驱动进行动态的调整。这个时候其实还有问题,会提示找不到文件,因为我们的hello文件夹位置是自定义的,而头文件是使用的相对路径,所以找不到。,但该博客不够完善,特补充说明。

csdn727的博客 2029

linux驱动开发 编译内核模块生成ko驱动文件

1.加载内核简介Linux内核的整体架构本就非常庞大,其包含的组件也非常多。而我们怎样把需要的部分都包含在内核中呢?一种方法是把所有需要的功能都编译Linux内核中。这会导致两个问题,一是生成的内核会很大,二是如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核。Linux提供了这样的机制,这种机制被称为模块(Module)。可使得编译出的内核本身并不需要包含所有功能,而在这些功能需要被使用的时候,其对应的代码被动态地加载到内核中。 模块本身不被编译入内核映像,从而控制了内核的大小。·模块一旦被加

weixin_49303682的博客 4774

linux 内核模块(驱动) 编译详解

一、准备工作 准备工作如何做,这里就不详说了。 a) 首先,你要有一台PC,装好了Linux。 b) 安装好GCC(这个指的是host gcc,用于编译生成运行于pc机程序的)make、ncurses等工具。 c) 如果你是为当前PC机开发内核模块,那么准备工作就结束了。 如果你是为嵌入式系统Linux系统开发内核模块,则继续如下两步。 d) 安装好交叉编译工具链。例如,你的目标单板...

whatday的专栏 576
上一篇: Linux内核编译详解
下一篇: 话说Linux内核模块
无忧老猪
博客等级 码龄17年 200粉丝 112原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值