1. 安装交叉编译链
    首先检查自己的Linux系统是否已经安装了对应的交叉编译链,有两种方式。
    一种可以采用输入arm然后双击TAB检查输出的方式,如下图所示则已经安装了arm-linux-gnueabihf-交叉编译链。

第二种时输入arm-linux-gnueabihf-gcc -v (命令不完全相同,可以输入arm再TAB补齐)

arm 架构搭建一个 kubernetes 集群_运维

关于交叉编译链的下载安装过程已经有很多博客了,可以自己去查询相关内容进行安装。

  1. 下载linux内核源代码
    因为我需要交叉编译生成内核模块,所以比起一般的交叉编译还需要配置关于Linux头文件部分,即下载目标机器同版本Linux内核代码。
    下载目标机器对应Linux内核版本的源代码,解压后放到要编译的代码的目录下,下载链接:https://cdn.kernel.org/pub/linux/kernel/ 。
    下载后对源代码进行编译,编译需要使用交叉编译(之间最开始直接make,后面编译自己的代码时会报错比如“include/uapi/linux/types.h:4:23: fatal error: asm/types.h: 没有那个文件或目录”,后面重新交叉编译linux内核代码后就没出现问题了)。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8

arm 架构搭建一个 kubernetes 集群_交叉编译_02

  1. 编写对应的Makefile文件
    修改所写代码的Makefile文件,我要将文件lkm.c编译成内核模块。文件中需要指明交叉编译链、目标机器架构,以及对应的Linux内核源码位置(也就是KDIR这部分)。
CROSS_COMPILE:= arm-linux-gnueabihf-
ARCH:= arm
CC:= $(CROSS_COMPILE)gcc
LD:= $(CROSS_COMPILE)ld

obj-m:=lkm.o

P_KVER ?= $(shell uname -r)
#KDIR:=/lib/modules/$(shell uname -r)/build
KDIR:=/$(shell pwd)/linux-3.10.108  //目标机器同版本Linux内核路径
PWD:=$(shell pwd)

default:
	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules ARCH=$(ARCH)

clean:
	$(MAKE) -C $(KDIR) M=$(PWD) clean
	$(RM) Module.markers modules.order
	$(RM) $(PWD)/src/modules/kmod/client/kmod/Module.markers
	$(RM) $(PWD)/src/modules/kmod/client/kmod/modules.order
  1. 编译代码,得到输出
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

arm 架构搭建一个 kubernetes 集群_linux_03

查看生成的.ko文件属性,可以看到生成的是arm架构的目标文件。

arm 架构搭建一个 kubernetes 集群_运维_04

以上就是关于Linux-ARM交叉编译内核模块的相关环境配置内容,整个步骤是我慢慢摸索成功的。如有错误,请多多指正!

参考文章:
https://zhuanlan.zhihu.com/p/94221380 交叉编译linux内核实例(最详细)总结
Linux交叉编译生成驱动模块.ko (这部分有关于Makefile的内容)
linux 交叉编译 生成模块 makefile