Linux驱动之配置内核

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

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

Linux驱动之配置内核_第1张图片

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

Linux驱动之配置内核_第2张图片

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

obj -y += lp.o

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

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

Linux驱动之配置内核_第3张图片

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


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

Linux驱动之配置内核_第4张图片

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

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

Linux驱动之配置内核_第5张图片

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

Linux驱动之配置内核_第6张图片

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


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


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


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


你可能感兴趣的:(Linux驱动之配置内核)