linux源码编译路径-一步步教你如何向Linux Kernel添加驱动代码

01

Kconfig文件的作用

内核源码树目录下有两个文件Kconfig(2.4版本为Config.in)和Makefile。 分发到各个目录的Kconfig构成了一个分布式内核配置数据库,每个Kconfig描述了与其所属目录的源文件相关的内核配置菜单。 当内核配置为make menuconfig(或xconfig等)时,从Kconfig中读取菜单,用户选择它并保存到.config的内核配置文件中。 当内核编译时linux源码编译路径,主Makefile调用这个.config来了解用户的选择。

*以上内容说明Kconfig对应内核配置菜单。 如果你想在内核的源代码中添加一个新的驱动程序,你可以更改Kconfig,以便可以选择这个驱动程序。 如果要编译此驱动程序,则需要更改Makefile

所以添加新驱动的时候需要改两个文件(注意不是只有两个)

*K配置

*生成文件

要知道如何改变这两个文件,就需要知道这两个文件的句子结构

02

内核配置

每个菜单都标有一个关键字,最常见的是 config

语法:

配置

symbol是一个新标记的菜单项,options是这个新菜单项下的属性和选项。

选项部分包括:

1)类型定义:

每个配置菜单项必须有类型定义,bool布尔类型,tristate三态:内置、模块、删除字符串、hex十六进制、整数

例如配置 HELLO_MODULE

bool“你好测试模块”

bool 类型只能选择或不选择。 三态类型菜单项有更多选项可以编译成内核模块。 如果选择编译成内核模块,则会在.config中生成CONFIG_HELLO_MODULE=m的配置。 如果选择构建,会直接编译到.config中,并在.config中生成CONFIG_HELLO_MODULE=y的配置。

2)依赖定义取决于或需要

表示该菜单的外观取决于另一个定义

配置HELLO_MODULE

bool“你好测试模块”

取决于 ARCH_PXA

此示例显示 HELLO_MODULE 菜单项仅对 XScale 处理器有效。

3)有用的定义

只需使用关键字 help 或 ---help--- 来减少帮助

03

内核生成文件

linux2.6.x/Documentation/kbuild目录中有关于内核makefile的知识的详细介绍。

内核Makefile分为5个部分:

Makefile 最顶层的Makefile

.config 内核的当前配置文件,编译时成为顶层 Makefile 的一部分。

arch/$(ARCH)/Makefile 架构相关的Makefile

s/ Makefile.* 一些 Makefile 的一般规则

kbuild Makefile 各级目录大约有500个文件。 编译时,根据下层Makefile传过来的宏定义等编译规则,将源代码编译成模块或者编译成内核。

顶层 Makefile 读取 .config 文件的内容linux源码编译路径,通常负责构建内核和模块。 Arch Makefile 提供了与体系结构相关的补充信息。 s 目录中的 Makefile 文件包含根据 kbuild Makefile 构建内核所需的所有定义和规则。 .config的内容是在进行menuconfig时通过Kconfig文件配置的结果。

举个反例:

假设你想把一个自己写的flash驱动加载到内核中,如果通过menuconfig配置内核时可以选择驱动程序该怎么办? 可以分为三步:

首先:将你编写的flashtest.c文件添加到/driver/mtd/maps/目录中。

第二:修改/driver/mtd/maps目录下的kconfig文件:

配置MTD_flashtest

三态“ap71闪光灯”

这样,当make menuconfig时,就会出现ap71 flash选项。

第三:修改该目录下的makefile

添加以下内容:obj-$(CONFIG_MTD_flashtest) += flashtest.o

这样,当您运行 make menucofnig 时,如果您选择了 ap71 flash 选项,您将找到该选项。 此选择将保存在 .config 文件中。 当你编译内核时,它会读取.config文件。 当发现ap71 flash选项为yes时,系统在调用/driver/mtd/maps/下的makefile时会将flashtest.o添加到内核中。 即可达到编译的目的。

04

Linux下如何将外部驱动代码包含到内核中并一起编译

1 概述

某个功能或设备驱动程序可以直接内置到内核中,也可以作为内核模块在需要时加载。 这里假设编写了一个按钮设备驱动程序,设备驱动程序代码和内核代码应该是集成的,并且在编译内核时可以将驱动程序编译到内核中或者作为内核模块使用。

本文并没有详细讲解内核编译和模块编译的背景知识,只是描述了流程。 如果您对背景知识感兴趣,请阅读本文档前面列出的参考文档。

注意:不同的Linux版本有非常不同的内核。

2)具体步骤

2.1)搭建linux编译环境

我使用的环境是window+VMware虚拟机+Fedora1(安装在虚拟机中)。 我个人认为这种方法效率更高。 安装Linux时,一定要安装内核开发包和GCC开发包。 如果空间足够,建议使用完整安装方式安装Linux。

获取交叉编译安装包,如cross-3.3.2.tar.bz2

将交叉编译的安装包解压到/usr/local下:tar –jxvf cross-3.3.2.tar.bz2

解压完成后生成arm-kernel目录

获取arm的2.6内核代码,如linux-hzh.tar.bz2

解压/root下的内核代码:tar –jxvf linux-hzh.tar.bz2

解压后生成linux-2.6.13-hzh目录

将交叉编译器的路径添加到环境变量中,我正在编辑/root/.bashrc,在最后添加一行

导出 PATH=$PATH:/usr/local/arm-kernel/3.3.2/bin

完成后,注销用户(logout命令),重新登录,环境变量生效

2.2)修改配置文件

2.2.1)复制代码

根据驱动类型,将驱动代码复制到内核源码树对应的驱动目录下

例如:

将鼠标驱动keyscan64.c keyscan64.h代码复制到/root/linux-hzh/drivers/input/keyboard

2.2.2)修改Kconfig配置文件

编辑/root/linux-hzh/drivers/input/keyboard目录下的Kconfig文件,添加新的按键配置选项,例如:

添加

配置我的键盘

三态“我的键盘支持”

默认y

帮助

“MYKEYBOARD”是一个简单的可扫描键盘,Y 表示内置,M 表示模块。

配置说明:

配置我的键盘

上面的config是配置关键字,MYKEYBOARD代表新配置选项的标识符

三态“我的键盘支持”

中间三态表示可以配置为Y、M、N中学情况

违约

默认配置选项有哪些?

帮助

“MYKEYBOARD”是一个简单的可扫描键盘,Y 表示内置,M 表示模块。

配置帮助

2.2.3)修改Makefile编译文件

编辑/root/linux-2.6.13-hzh/drivers/input/keyboard目录下的Makefile文件,添加新的关键编译选项,例如

obj-$(CONFIG_MYKEYBOARD) += keyscan64.o

注意:Kconfig中的配置标识符必须与编译选项中的蓝色标识符一致,并且编译后的目标keyscan64.o的名称必须与源代码中keyscan64.c的名称一致,这是系统强制的。

2.3)编译内核

2.3.1) 清理

与正常编译的内核相同

使干净

清除原来的编译过程文件

2.3.2) 制作菜单配置

配置内核选项的文本菜单配置方法

导入源代码预配置文件

配置新添加的驱动程序

新的配置选项如上图所示,可配置为y(内置)、m(模块)、n(不编译),默认为y,配置为M(模块),然后退出保存配置

2.3.3)制作zImage

编译内核并生成内核镜像文件

2.3.4) 制作模块

编译内核模块

2.4) 确认结果

在arch/arm/boot目录下可以看到新生成的zImage内核镜像文件

在drivers/input/keyboard目录下可以看到关键的内核模块keyscan64.ko

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 linux源码编译路径-一步步教你如何向Linux Kernel添加驱动代码 https://www.wkzy.net/game/185758.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务