终于开通了优快云的博客,我希望自己能够每天和各位一起快乐的进步,敲开LINUX的大门
这是我在优快云的第一篇学习日记
LINUX驱动学习笔记(1)
----- LINUX内核中关于驱动的配置和编译
内核源码树的目录下都有两个文档KCONFIG和Makefile,分配到各目录下Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单。在make menuconfig时,从Kconfig中读出菜单,用户选择后(一般是图形化界面选择)保存到.config配置文档中。在内核编译时,主Makefile调用这个.config,就知道了用户的选择
简单来讲,Kconfig为一内核配置“菜单”,用户可以随便挑选菜,当然,也可以自己增加菜的项目---如添加新的驱动到内核。Makefile目的就是能使这写新增加的或改变的项目make后生效
Kconfig
一个比较典型的内核配置菜单为
menu "Network device support"
config NETDEVICES
bool "Enable Net Devices"
depends on NET
default y
help
This is help desciption。
...
endmenu
l menu/endmenu中的内容会是Network device support的子菜单
每个子菜单项均由config来确定
l config类型定义:bool布尔类型、 tristate三态:内建、模块、移除 string字符串、 hex十六进制、 integer整型 。其中bool类型只能是选中或是不选中[ ],tristate类型为编译进内核模块,则.config中生成一个CONFIG_HELLO_MODULE=m的配置,若为内加则.config中生成一个CONFIG_HELLO_MODULE=y的配置
l 依赖型定义depends on或requires 指此菜单的出现和否依赖于另一个定义
config HELLO_MODULE
bool "hello test module"
depends on ARCH_PXA
这个例子表明HELLO_MODULE这个菜单项只对XScale处理器有
Makefile
Makefile 最顶层的Makefile
.config 内核的当前配置文档,编译时成为顶层Makefile的一部分
arch/$(ARCH)/Makefile 和体系结构相关的Makefile
s/ Makefile.* 一些Makefile的通用规则
kbuild Makefile 各级目录下的大概约500个文档,编译时根据上层Makefile传下来的宏定义和其他编译规则,将源代码编译成模块或编入内核。
顶层的Makefile文档读取 .config文档的内容,并总体上负责build内核和模块。Arch Makefile则提供补充体系结构相关的信息。 s目录下的Makefile文档包含了任何用来根据kbuild Makefile 构建内核所需的定义和规则。
(其中.config的内容是在make menuconfig的时候,通过Kconfig文档配置的结果)
别忘了目标定义目标定义
目标定义就是用来定义哪些内容要做为模块编译,哪些要编译链接进内核。如:
obj-y += foo.o
表示要由foo.c或者foo.s文件编译得到 foo.o并链接进内核,而obj-m则表示该文件要作为模块编译。除了y,m以外的obj-x形式的目标都不会被编译。而更常见的做法是根据.config文件的CONFIG_ 变量来决定文件的编译方式(该变量如何起作用见文末另一篇文章的链接),如:
obj-$(CONFIG_EXT2) += ext2.o
除了obj-形式的目标以外,还有lib-y library库,hostprogs-y 主机程序等目标,但是基本都应用在特定的目录和场合下。
在Kconfig中设置好新加的内核模块后,执行make menuconfig 若将其编译进内核,则.config将会相应变化。执行make后, 顶层目录下的makfile负责读取.config内容,并负责将总体上编译
举个例子:
假设想把自己写的一个flash的驱动程式加载到工程中,而且能够通过menuconfig配置内核时选择该驱动该怎么办呢?能够分三步:
第一:将您写的flashtest.c 文档添加到/driver/mtd/maps/ 目录下。
第二:修改/driver/mtd/maps目录下的kconfig文档:
config MTD_flashtest
tristate “ap71 flash"
这样当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 加入到内核中。即可达到您的目的。