相关文章链接:
【嵌入式驱动一】嵌入式驱动开发的前期准备(上)
【嵌入式驱动二】嵌入式驱动开发的前期准备(下)
【嵌入式驱动三】内核配置和编译
文章目录如下所示,如果有感兴趣的章节,请移步到我的个人博客,本篇文章链接为https://www.keepgoingwang.com/2019/06/24/嵌入式驱动开发-2/,您的支持是我坚持的最大动力,谢谢!
内核配置和编译
一、内核配置
之前我们搭建好了交叉编译链,准备好内核源代码,我们就可以编译了。
我用的是3.0.35版本的内核。外链图片转存失败
使用如下命令解压缩内核文件
tar xvf linux-3.0.35.tar.bz2
解压完成后能看到内核文件夹下的各个文件夹,各个文件夹都包含特定的文件:
-
arch目录
arch目录包括了所有和结构体相关的核心代码。它的下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录。PC机一般都基于此目录。 -
include目录
include目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下。 -
init目录
init目录包含核心的初始代码(不是系统的引导代码),有main.c和Version.c两个文件。这是研究核心如何工作的好起点。 -
mm目录
mm目录包含了所有的内存管理代码。与具有硬件体系结构相关的内存管理代码位于arch/*/mm目录下。 -
drivers目录
drivers目录中是系统中所有的设备驱动程序。它又进一步划分成几类设备驱动,每一种有对应的子目录,如声卡的驱动对应于drivers/sound。 -
ipc目录
ipc目录包含了核心进程间的通信代码。 -
modules目录
modules目录存放了已建好的、可动态加载的模块。 -
fs目录
fs目录存放Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext3文件系统对应的就是ext3子目录。
kernel内核管理的核心代码放在这里。同时与处理器结构相关代码都放在arch/*/kernel目录下。 -
net目录
net目录里是核心的网络部分代码,其每个子目录对应于网络的一个方面。 -
lib目录
lib目录包含了核心的库代码,不过与处理器结构相关的库代码放在arch/*lib/目录下。 -
scripts目录
scripts目录包含用于配置核心的脚本文件。 -
documentation目录
documentation目录下是一些文档,是对每个目录作用的具体说明。
在内核代码的根目录下有一个.config的文件,这个文件就是内核的配置文件,在配置内核的时候可以直接修改这个文件还可以使用make menuconfig修改,接下来介绍这两种方法:
- 直接修改.config文件
如果熟悉各个驱动模块,我们可以直接找到相应的驱动,配置成‘y’、‘m’或者直接删除。这里的‘y’表示将该驱动之间放进内核,属于静态加载;这里‘m’表示动态加载驱动,需要我们手动加载驱动,我们下面会讲;将该驱动删除意思我们不需要这个驱动,将其删除。以按键驱动为例,它在.config文件中的配置为外链图片转存失败(img-qI0sxyRU-1562575561404)
我们看到按键驱动配置为‘y’,也就是说直接将按键驱动编译进内核。那么,我们将‘y’修改为‘m’,我们将把按键驱动以模块的形式编译,这样需要我们手动加载,这样做的好处是内核不臃肿,内核中只包含必须的驱动,不是必须的我们视情况手动加载。 - 使用可视化界面
在Linux内核文件目录下执行make menuconfig命令,我们会看到如下界面:
外链图片转存失败(img-yd189vJc-1562575561405)
这个界面就是内核的配置界面。
我们同样找到按键驱动外链图片转存失败(img-4Dn1G8PT-1562575561406)
但是驱动的名和直接修改.config文件中的名不一样(在以后讲解)。但是我们使用“?”查看帮助信息外链图片转存失败(img-D348pNE8-1562575561407)
确实是CONFIG_KEYBOARD_GPIO,所以是我们要找的按键驱动。
在可视化界面下,我们找到要设置的驱动,选中后点击“回车”键,驱动前的选项会在“”、“M”和空三个中变化。其中“”表示编译进内核;“M”表示以模块的方式编译;空表示删除不编译该驱动。
二、内核的编译
在配置好内核后,执行如下命令编译内核(也有可能不是uImage,可参考资料)。
make uImage
待内核编译完成后(第一次编译时间可能稍长),再执行如下命令,编译以模块形式编译的驱动。
make modules
编译结束后,内核文件在内核源代码中的arch/arm/boot/目录下
外链图片转存失败(img-qYXxs9ju-1562575561408)
以模块方式编译的驱动,编译完成的.ko文件在相应的源代码的目录下。