菜单导航

Linux模块文件如何编译到内核和独立编译成模块?

作者: 精装之家 来源: 精装之家 发布时间: 2021年07月28日 06:59:08

Linux模块文件如何编译到内核和独立编译成模块?

 

以下文章作者土豆居士  

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

1. 内核目录

Linux内核源代码非常庞大,随着版本的发展不断增加。它使用目录树结构,并且使用Makefile组织配置、编译。

初次接触Linux内核,好仔细阅读顶层目录的readme文件,它是Linux内核的概述和编译命令说明。readme的说明侧重于X86等通用的平台,对于某些特殊的体系结构,可能有些特殊的说明。

顶层目录的Makefile是整个内核配置编译的核心文件,负责组织目录树中子目录的编译管理,还可以设置体系结构和版本号等。

内核源码的顶层有许多子目录,分别组织存放各种内核子系统或者文件。具体的目录说明如下表所示。

目录 内容
arch/   体系结构相关的代码,如arch/i386、arch/arm、arch/ppc  
crypto   常用加密和散列算法(如AES、SHA等),以及一些压缩和CRC校验算法  
drivers/   各种设备驱动程序,如drivers/char、drivers/block……  
documentation/   内核文档  
fs/   文件系统,如fs/ext3、fs/jffs2……  
include/   内核头文件:include/asm是体系结构相关的头文件,它是include/asm-arm、include/asm-i386等目录的链接;include/linux是Linux内核基本的头文件  
init/   Linux初始化,如main.c  
ipc/   进程间通信的代码  
kernel/   Linux内核核心代码(这部分比较小)  
lib/   各种库子程序,如zlib、crc32  
mm/   内存管理代码  
net/   网络支持代码,主要是网络协议  
sound   声音驱动的支持  
scripts/   内部或者外部使用的脚本  
usr/   用户的代码  
2. 编译工具

make mrproper: 清除内核生成的配置文件与目标文件等,一般在第一次编译时使用

导入默认配置信息(在内核根目录中)

amake xxx_deconfig b) cp arch/arm/configs/xx_deconfig  .config 生成默认配置文件

配置命令

make xxxxconfig  修改配置文件 make xconfig (图形界面 qt库) make menuconfig (常用 libncurses库) sudo apt-get install libncurses5-dev make config (精简)

编译内核

make uImage ---生成内核镜像  /arch/arm/boot/uImage

编译设备树

make dtbs ---生成设备树文件  /arch/arm/boot/dtb/xxxxxx.dtb

编译生成模块文件

make modules ---把配置值选成M的代码编译生成模块文件。(.ko)  放在对应的源码目录下。 3. 内核编译

现在很多基于Linux的产品开发,通常厂家都会提供集成开发环境SDK。builroot使我们搭建环境变得更加方便,但是作为初学者我们还是要掌握如何独立编译内核源码。

0) 前提条件

必须先安装交叉编译工具链,关于交叉编译工具链的安装可以参考 《linux环境搭建-ubuntu16.04安装》

在这里我们使用的是arm-none-linux-gnueabi-gcc。

1)下载内核源码

下载地址:https://mirrors.edge.kernel.org/pub/linux/kernel/

我们下载Linux-3.14内核(可以是更高的版本)至/home/peng目录。

Linux模块文件如何编译到内核和独立编译成模块?

或者直接点击下面链接 https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/linux-3.14.10.tar.xz

解开压缩包,并进入内核源码目录,具体过程如下:

$ tar  xvf  linux-3.14.tar.xz $ cd  linux-3.14 2)修改内核目录树根下的Makefile,指明交叉编译器:    $ vim Makefile

找到ARCH和CROSS_COMPILE, 修改:

ARCH  ?= $(SUBARCH) CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)

ARCH  ?= arm CROSS_COMPILE ?= arm-none-linux-gnueabi-

Linux模块文件如何编译到内核和独立编译成模块?

4)配置内核产生.config文件:

导入默认配置

make  exynos_defconfig