千家信息网

android怎么以模块的方式编译内核驱动

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍了android怎么以模块的方式编译内核驱动的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇android怎么以模块的方式编译内核驱动文章都会有所收获,下面
千家信息网最后更新 2026年11月03日android怎么以模块的方式编译内核驱动

这篇文章主要介绍了android怎么以模块的方式编译内核驱动的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇android怎么以模块的方式编译内核驱动文章都会有所收获,下面我们一起来看看吧。

9.5.2.1 内核和编译器路径
本节介绍内核路径、编译器路径
如下图所示,作者的 android 源码在"/home/imx6/iTOP-iMX6_android4.4.2"目录下,内核源码在其中的"kernel_imx"目录下。

进入"kernel_imx"目录,查看"build_android_kernel.sh"中的脚本文件,如下图所示。

如上图所示,我们可以得到一些信息,在后面编译内核模块的时候,需要设置编译目标平台为 arm,"export ARCH=arm";编译器的路径为"$(pwd)/../prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-"。
9.5.2.2 Makefile 文件
作者在"/home/imx6"目录下新建一个"imx_driver_modules"目录,将要编译的驱动和 Makefile 文件放到这个目录下。
Makefile 脚本文件:
obj-m += iTOP-iMX6_driver_hello.o
KDIR =/home/imx6/iTOP-iMX6_android4.4.2/kernel_imx
PWD ?= $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm
CROSS_COMPILE=$(KDIR)/../prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-
clean:

rm -rf modules.order *.o workqueue.o Module.symvers *.mod.c *.ko
脚本中:
第一行bj-m += iTOP-iMX6_driver_hello.o 表示编译的源文件为 iTOP-iMX6_driver_hello.c,如果源文件名有变化,则需要修改成对应的。
第二行:KDIR 参数指向对应的内核源码目录。作者的内核源码是在/home/imx6/iTOP-iMX6_android4.4.2/kernel_imx 目录下,用户要根据自己的具体情况来改。
第三行:PWD ?= $(shell pwd)表示将当前目录的路径赋值给 PWD 变量,也就是/home/imx6/imx_driver_modules
第五行:其中 make -C $(KDIR) M=$(PWD) modules,表示将当前目录下的文件编译为模块,并且制定了内核源码的路径;
其中 ARCH=arm 表示设置目标 CPU 类别为 arm,也就是编译的依赖内核和驱动模块目标 CPU 为 ARM;
其中 CROSS_COMPILE=$(KDIR)/../prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-,表示设置编译器路径,$(KDIR)为/home/imx6/iTOP-iMX6_android4.4.2/kernel_imx,所以这里完整的路径为"/home/imx6/iTOP-iMX6_android4.4.2/kernel_imx/../prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-",正好指向作者内核编译器的路径。
9.5.2.3 简单驱动源码
驱动文件名称为:iTOP-iMX6_driver_hello.c,源码如下:
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("iTOPEET_dz");
static int hello_init(void)
{
printk(KERN_EMERG "Hello World enter!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_EMERG "Hello world exit!\n");
}
module_init(hello_init);
module_exit(hello_exit);
驱动源码只有基本的入口和出口函数。加载和卸载的时候分别打印"Hello Worldenter!"和"Hello world exit!"。
9.5.2.4 模块编译
如下图所示,将源码拷贝到 Ubuntu 系统下。

使用命令"make",如下图所示,可以看到有"iTOP-iMX6_driver_hello.ko"文件生成。

使用命令"make clean",可以删除中间文件,如下图所示。

9.5.2.5 模块编译常见问题
在以模块的方式编译驱动的过程中,新手可能会以下问题。
1.内核源码没有编译或者内核源码路径设置不正确。
如果内核源码没有编译,那么模块将会提示缺少库之类的错误;如果路径设置不正确,会提示找不到内核。
2.源码和 Makefile 文件在 Windows 下编写,然后拷贝到 Ubuntu 上,由于编辑器不同导致转码错误。
这种错误比较容易解决,Make 编译之后,系统会提示 Makefile 或者驱动文件具体某一行出现问题。使用 vim 编辑器打开查看一下,就能找出一些乱码,使用 vim 编辑器修正一下再编译即可。
9.5.2.6 模块加载和卸载
作者这里使用最小 linux 系统来测试模块的加载和卸载,最小系统在使用手册第十三章有介绍。在编译模块前,内核源码必须要编译通过,作者这里是在最小系统是加载模块,那么内核源码也必须编译为 qt 的内核(最小系统使用的是 qt 的内核),否则是无法加载的。
如下图所示,将 ko 文件拷贝到 u 盘上,启动开发板,将 U 盘插到开发板上(靠近网口的usb 接口),使用命令"mkdir /mnt/udisk"新建文件夹,使用命令"mount /dev/sda1/mnt/udisk/"挂载盘符,使用命令"cp -r /mnt/udisk/iTOP-iMX6_driver_hello.ko ./"将驱动模块拷贝到开发板。

然后使用命令"insmod iTOP-iMX6_driver_hello.ko"加载驱动模块,如下图示,打印出"Hello World enter!",表明模块驱动加载成功。

接着使用命令"rmmod iTOP-iMX6_driver_hello"卸载模块,如下图所示,发现提示没有目录"/lib/modules",我们就按照提示新建目录。

如下图所示,使用命令"mkdir /lib/modules"新建目录,再次使用命令"rmmodiTOP-iMX6_driver_hello"卸载驱动模块,发现仍然提示没有"3.0.35-g0e09bb1-dirty"这个路径。

如下图所示,使用命令"mkdir /lib/modules/3.0.35-g0e09bb1-dirty"新建目录,再次用命令"rmmod iTOP-iMX6_driver_hello"卸载驱动模块,发现打印信息"Hello worldexit!",模块卸载成功。

只要重新烧写系统,这些新建目录只需要建立一次即可。

关于"android怎么以模块的方式编译内核驱动"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"android怎么以模块的方式编译内核驱动"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

编译 模块 内核 驱动 源码 目录 文件 路径 命令 系统 作者 提示 方式 编译器 最小 拷贝 目标 知识 编辑器 脚本 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网最新的科技 科技企业和互联网企业 互联网与科技金融数据 深圳科技互联网 善班互联网科技 佰商互联网科技有限公司 联恩商钥互联网科技有限公司 广西拼得多互联网科技有限公司 晓花互联网科技有限公司网址 互联网科技人工智能实验室 互联网科技创新的路径 华中科技大学互联网的牛人 中国互联网有什么科技 工业互联网科技创业 科技互联网专业工作会议发言稿 北京瑞云互联网科技有限公司 六子台科技互联网展会 互联网科技企业文化 山东亿川互联网科技有限责任公司 互联网科技快速发展优美句子 伟宏互联网科技 期待互联网科技 沃里互联网科技 狮子座互联网科技培训 天扬科技互联网广告 太原新华互联网科技学校怎么样 汉立互联网科技有限公司联系电话 互联网媒体平台算高科技产业 爱医互联网络科技 九思连强互联网电子科技有限公司
0