Linux驱动之配置内核

Posted Sunnix

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux驱动之配置内核相关的知识,希望对你有一定的参考价值。

Linux在嵌入式系统中大受欢迎的一个重要因素就是开源,开源的特性决定了Linux内核可以根据个人的需求进行裁剪,裁剪内核就是根据你的硬件资源,将一些不需要的驱动裁剪掉,再把一些原本没有的驱动添加到内核,那么配置好的内核就适用于你特定的硬件平台。配置内核时,make zImage   make menuconfig,还有  .config    Kconfig  Makefile文件,以讯为iTop-4412(三星exynos4412处理器)平台,捋一捋这些命令,文件的关系。

编译内核时,首先要在源码目录下执行make zImage,如果是刚解压完的源码,直接执行make zImage命令是不会成功的,因为源码目录下缺少了.config文件,这个文件是干嘛的,打开看一下就会发现,基本上是一些宏定义的赋值


那么这些宏在什么时候用呢,我们知道,执行make zImage后,会逐层的在各目录下执行make,执行make时,就会需要Makefile文件,以/driver/char目录下的Makefile文件为例


Makefile文件中,$是取值的意思,也就是取各个宏的值,那么这些宏的值在哪,就在.config文件中。这时候,如果这些宏的未定义,那么相应的驱动就不会被编译进内核,如果这些宏的定义为y,以上图最后一行代码为例,如果CONFIG_PRINTER这个宏在.config文件中有CONFIG_PRINTER=y,那么最后一行代码就等价于

obj -y += lp.o

那么对应的驱动就会被编译进内核,这也就是我们裁剪内核的手段,就是把相应的宏赋值为y或者未定义,来决定哪些驱动要编译进内核,哪些不编译。

那么这个文件是怎么来的,手动写?这个有点不太现实,因为驱动太多了,关键是手动写很容易出错。然后Linux就想了一个办法,make menuconfig图形化的配置界面。有了这个配置界面后,就可以用键盘来对内核进行配置,在源码根目录下执行make menuconfig就会出现配置界面。


这样我们就可以用空格来决定那些驱动要配置进内核,配置好了之后,保持退出,就会自动生成   .config文件。假设我们在上图中将Enable LEDS config这个菜单选中,那么就会在.config文件中出现这样一行代码


那么make menuconfig是怎么工作的呢,这些配置的菜单是怎么出现的,假如我自己要添加一个驱动,怎么才能让配置菜单出现在make menuconfig的选项中呢。这一连串的问题都是因为Kconfig这个文件,make menuconfig名令就是逐层的读取Kconfig文件,然后生成菜单,看一下/driver/char目录下的Kconfig文件


以上每五行为一组,第一行表示配置哪个宏,也就是说刚刚在上面描述的CONFIG_LEDS_CTL这个宏,最初就是在这里定义的。第二行告诉表示这个变量在配置界面中是bool值还是tristate,bool值在配置的时候只能配置为y或者未定义,tristate还可以选择为m,表示编译为模块。第三行表示该选项的默认值。第四行和第五行表示用户选择help时的帮助内容。

如果用一张图表示上面的关系,是这样的


那么假设现在有一个测试驱动名字为hello,假设驱动已经书写好了,保存在/driver/char/hello.c文件中,该如何把这个驱动编译进内核,根据上图中关系,首先要编辑/driver/char目录下的Kconfig文件,在这个文件中照葫芦画瓢,添加这样一句代码


保存退出后,在源码根目录下,执行make menuconfig进入到Device Driver-->Character devices就会看到刚刚添加的内容


默认状态下是选中的,因为我们在Kconfig文件中配置的default y  。这样我们保存退出后就会在.config文件中看到这个宏的值已经被赋值为y


那么这个宏被赋值为y有什么作用的,我们还需要修改一下/driver/char目录下的Makefile文件,在文件中也是照葫芦画瓢,添加这样一行代码


这样在编译的时候,我们的hello.c文件就最终编译进内核。


以上是关于Linux驱动之配置内核的主要内容,如果未能解决你的问题,请参考以下文章

驱动学学之驱动学习的准备工作

Linux内核dvfs之cpufreq配置

001_linux驱动之_驱动的加载和卸载

深入浅出Linux内核模块篇 15.1Linux的设备驱动管理之内核对象(Kernel object)机制

深入浅出Linux内核模块篇 15.1Linux的设备驱动管理之内核对象(Kernel object)机制

Linux——Linux驱动之使用Menuconfig进行Linux内核的裁剪总结(Menuconfig操作Kconfig和.config文件的关系)