Linux 内核 编译模块

背景

由于调试内核或者由于分区大小限制,有时候内核组件不一定完全需要编进内核中。
所以,在开发中经常将内核组件编译成为模块,等到在恰当的时机加载。

概览

Linux内核模块的编译方法有两种:

1.放入linux内核源码中编译。
2.独立编译模块。

放入Linux内核源码中编译

首先需要了解Kconfig和Makefile的作用

Kconfig:对应内核模块的配置菜单。
Makefile:对应内核模块的编译选项。

Linux内核编译过程:根据配置裁剪的结果配合Makefile完成内核编译。

以ARM平台为例,具体配置过程:

1.当执行make menuconfig 时,系统首先读取arch/arm/Kconfig生成整个配置界面

2.在读取配置界面的同时,系统会读取顶层目录下的.config文件,生成所有配置选项的默认值

3.当修改玩配置并保存后,系统会更新顶层目录下的.config

4.当执行make时,各层的Makefile会根据.config文件中的编译选项来决定哪些文件会被编译到内核中,或者编译成模块。

添加到内核的步骤这里省去:《简单添加自己的驱动程序到Linux内核树中

在内核配置页中,将组件配置成M模块以后,可以参考使用以下命令。(下划线部分根据实际情况增减)

make ARCH=arm CROSS_COMPILE=arm-hisiv500-linux- modules

之后,便可以在打印信息中找到模块所在路径,拷贝出来即可。

例如

LD [M] drivers/media/usb/gspca/gspca_main.ko
LD [M] fs/exfat/exfat.ko

独立模块编译

1.根据内核模块编写规则,编写好有关的模块。

2.新建Makefile,参考以下内容(根据实际情况进行修改,注意tab对齐)

# 最终的模块名
obj-m += led_drv.o

# 内核源码所在根目录
KERNELDIR:=/home/schips/linux3.18/

# 指定的编译工具链
CROSS_COMPILE:=/usr/local/cross/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-
# 以下内容一般不做修改
PWD:=$(shell pwd)

default:
    $(MAKE) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNELDIR) M=$(PWD) modules

clean:
    rm -rf *.o *.order .*.cmd *.ko *.mod.c *.symvers *.tmp_versions

3.make 即可。

这里是Linux移植exfat驱动的实例:《Linux 内核添加exfat驱动

如果说我的文章对你有用,只不过是我站在巨人的肩膀上再继续努力罢了。
若在页首无特别声明,本篇文章由 Schips 经过整理后发布。
博客地址:https://www.cnblogs.com/schips/
原文地址:https://www.cnblogs.com/schips/p/linux-build-module.html