kernel module的单独的编译与insmod

本文介绍在Ubuntu系统下,如何使用已编译的kernel源码或系统默认的kernel源码来独立编译Linux内核模块。文章详细阐述了编译环境的设置、Makefile的编写,并提供了测试源文件和验证过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Kernel: v4.4.159
Device: rk3328
Platform Version: Android 9.0

前言:

我们要调试驱动模块,但整个编译kernel太麻烦,这个时候就需要单独编译,下面就介绍一下详细的编译过程。

编译环境:

首先需要一个编译过的kernel源码,当然使用ubuntu系统/usr/src/linux-headers-x.xx.x-xx-generic下的kernel源码也可以。

区别

  1. 使用编译过的kernel源码来编译,那么编译后生成的.ko文件,和之前编译kernel时的架构一样。
  2. 使用ubuntu系统下kernel源码编译,生成的.ko文件,是x86-64架构,只能在x86体系架构上使用。

测试源文件:

test.c

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

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("lost");

static int __init test_init(void)
{
	printk(KERN_DEBUG "test init.\n");
	return 0;
}

static void __exit test_exit(void)
{
	printk(KERN_DEBUG "test init.\n");
}

module_init(test_init);
module_exit(test_exit);

Makefile文件:

Makefile

#Deisgn by wolfnx

Q       := @
COBJS  += test.o

ifeq ($(KERNELRELEASE), )

#使用自定义路径下的kernel编译
#KERNELDIR ?=/home/lost/lost/source/kernel
#使用系统路径的kernel源码编译,根据自己系统路径修改
KERNELDIR ?=/usr/src/linux-headers-4.15.0-62-generic

PWD :=$(shell pwd)

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

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

clean:
	$(Q)rm -f  *.ko   *.o   *.mod.c   modules.order   Module.symvers

.PHONY:modules modules_install clean

else
	obj-m :=$(COBJS)
endif

验证过程:

  1. 使用系统路径编译及验证:

     make  //编译
     file test.ko //查看编译后的文件可执行架构(只能在同种架构挂载)
    

    1

     sudo insmod test.ko  //挂载
     sudo rmmod test.ko  //卸载
    

    1

  2. 使用自定义kernel编译及验证(在Android开发板中验证)

     make  //编译
     file test.ko //查看编译后的文件可执行架构(只能在同种架构挂载)
    

    1

     insmod test.ko  //挂载
     rmmod test.ko  //卸载
    

    1

转载请注明出处:http://www.wolfnx.com/2018/11/11/CompilingKernelModule

作者 : wolfnx
邮箱 : wolfnx@outlook.com
邮箱2 : lostnx@gmail.com

在Linux系统中,内核(kernel)是操作系统的核心组件,它负责管理系统的硬件资源和提供各种系统服务。内核模块(kernel module)是一种可动态加载和卸载的程序,可以在运行中向内核添加新的功能或修改现有功能。 交叉编译(cross compilation)是指在一台计算机上编译生成另一种体系结构(如ARM)下的可执行文件。由于内核模块需要内核紧密配合,因此需要使用目标平台相同的工具链进行交叉编译。 以下是在Linux系统中交叉编译内核模块的基本步骤: 1. 安装交叉编译工具链 根据目标平台的体系结构,安装相应的交叉编译工具链。例如,在Ubuntu系统中,可以使用以下命令安装arm-linux-gnueabi交叉编译工具链: ``` sudo apt-get install gcc-arm-linux-gnueabi ``` 2. 配置交叉编译环境 在编译内核模块之前,需要设置交叉编译环境变量。例如,要编译ARM架构的内核模块,可以使用以下命令设置环境变量: ``` export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabi- ``` 其中,ARCH指定目标平台的体系结构,CROSS_COMPILE指定交叉编译工具链的前缀。 3. 编写内核模块代码 根据需要,编写内核模块的代码。内核模块代码通常包括init函数和exit函数,分别在模块加载和卸载时执行。 4. 编译内核模块 使用交叉编译工具链编译内核模块。例如,下面的命令编译名为hello的内核模块: ``` make -C /path/to/kernel/source M=$PWD modules ``` 其中,-C选项指定内核源代码的路径,M选项指定内核模块所在的目录。 5. 加载内核模块 将编译生成的内核模块(.ko文件)复制到目标平台上,使用insmod命令加载模块: ``` insmod hello.ko ``` 6. 卸载内核模块 使用rmmod命令卸载内核模块: ``` rmmod hello ``` 以上就是在Linux系统中交叉编译内核模块的基本步骤。在实际应用中,还需要考虑内核版本、编译选项等因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值