Linux 2.6 内核的装备系统由以下 3 个部分组成:
> Makefile:散布在 Linux 内核源代码中的 Makefile,界说 Linux 内核的编译规矩
> 装备文件 Kconfig:给用户供给装备挑选的功用
> 装备东西:包含装备指令解说器(对装备脚本中运用的装备指令进行解说)和装备用户界面(供给字符界面和图形界面)。这些装备东西都是运用脚本语言编写的,如 Tcl/TK、perl 等。
在Linux 内核中添加程序需求完结以下 3 项作业:
> 1. 将编写的源代码复制到 Linux 内核源代码的相应目录
> 2. 在目录的Kconfig 文件中添加新源代码对应项目的编译装备选项
> 3. 在目录的 Makefile 文件中添加对新源代码的编译条目
1. 实例引导:S3C2440 处理器的RTC 与 LED 驱动装备。
首要,在Linux/drivers/char 目录中包含了 S3C2410 处理器的 RTC 设备驱动源代码 s3c2410-rtc.c.而在该目录的 Kconfig 文件中包含 S3C2410_RTC 的装备项目:config S3C2410_RTC bool S3C2410 RTC Driver depends on ARCH_S3C2410 help RTC (Realtime Clock)driver for the clock inbuilt into the Samsung S3C2410. This can provide periodic interrupt rates from 1Hz to 64Hz for user programs, and wakeup from Alarm.上述 Kconfig 文件的这段脚本意味着只要在 ARCH_S3C2410 项目被装备的状况下,才会呈现 S3C2410_RTC 装备项目,这个装备项目为布尔型(要么编译入内核,要么不编译,挑选 Y 或 N ),菜单撒很伤心显现的字符串为 S3C2410 RTC Driver,help 后边的内容为协助信息。
除了布尔型的装备项目外,还存在一种三态型(tristate)装备选项,它意味着要么编译入内核,要么编译为内核模块,选项为Y、M“ 或N.在目录的Makefile 中关于 S3C2410_RTC 的编译脚本为:obj-$(CONFIG_S3C2410_RTC) += s3c2410-rtc.o上述脚本意味着假如 S3C2410——RTC 装备选项背挑选为 Y 或 M,即 obj-$(CONFIG_S3C2410_RTC) 等同于 obj-y 或 obj-m 时,则编译 s3c2410-rtc.c,挑选 Y 的状况直接会将生成的方针代码直接衔接到内核,为M 的状况则生成模块 s3c2410-rtc.ko(因为 S3C2410_RTC 为布尔型,实践不会为M);假如 S3C2410_RTC 装备选项将挑选为 N,即 obj-$(CONFIG_S3C2410_RTC) 等同于 obj-n 时,则不编译 s3c2410-rtc.c.一般来说,驱动工程师在内核源代码的 drviers 目录的相应子目录中添加新设备驱动的源代码,并添加或修正 Kconfig 装备脚本和Makefile 脚本,彻底模仿上述进程履行即可。
再如,为S3C2410 的LED 编写了驱动,源代码为 s3c2410-led.c,为使内核能支撑对该模块的编译装备,应进行如下 3 项处理。
> 将编写的 s3c2410-led.c 源代码复制到 linux/drivers/char 目录
> 在目录的 Kconfig 文件中添加 LED 的编译装备选项,如下所示:
config S3C2410_LED bool S3C2410 LED Driver depends on ARCH_S3C2410 help LED driver for the Samsung S3C2410.
> 在目录的 Makefile 文件中添加对 s3c2410-led.c 源代码的编译,如下所示:
obj-$(CONFIG_S3C2410_LED) += s3c2410-led.o 2. Makefile下面对内核源代码各级子目录中的 kbuild Makefile 进行介绍,这部分是内核模块或设备驱动的开发者最常接触到的。
kbuild Makefile 的语法包含如下几个方面。
(1)方针界说方针界说用来界说哪些内容要作为模块编译,哪些要编译并衔接进内核。
例如:obj-y += foo.o表明要由 foo.c 或许 foo.s 文件编译得到 foo.o 并衔接进内核,而 obj-m 则表明该文件要作为模块编译。除了y、m 以外的 obj-x 方法的方针都不会被编译。
而更常见的做法是依据 .config 文件的 CONFIG 变量来决议文件的编译方法,如下表明:obj-$(CONFIG_ISDN) += isdn.o obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o除了 obj- 方法的方针以外,还有 lib-y library库、hostprogs-y 主机程序等方针,可是根本都应用在特定的目录和场合下。
(2)多文件模块的界说假如一个模块由多个文件组成,这时候应选用模块名加 -objs 后缀或许 -y 后缀的方法来界说模块的组成文件。如下面的比如所示:obj-$(CONFIG_EXT2_FS) += ext2.o ext2-y := balloc.o bitmap.o ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o模块的姓名为 ext2,由 balloc.o 和 bitmap.o 两个方针文件终究衔接生成 ext2.o 直至 ext2.ko 文件,是否包含 xattr.o 取决于内核装备文件的装备状况。假如 CONFIG_EXT2_FS 的值是 y 也没有联系,在此进程中生成的 ext2.o 将被衔接进 built-in.o 终究衔接进内核。这儿需求留意的一点是,该 kbuild Makefile 地点的目录中不能再包含和模块名相同的源文件和 ext2.c/ext2.s.或许写如 -objs 的方法:obj-$(CONFIG_ISDN) +=isdn.o isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o(3)目录层次的迭代示例:obj-$(CONFIG_EXT2_FS) += ext2/当 CONFIG_EXT2_FS 的值为 y 或 m时,kbuild 将会把 ext2 目录列入向下迭代的方针中,详细 ext2 目录下的文件是要作为模块编译仍是链入内核由 ext2 目录下的 Makefile 文件的内容决议。
3. Kconfig(1)菜单进口大多数的内核装备选项都对应 Kconfig 中的一个菜单进口,如下所示:config MODVERSIONS bool Set version information on all module symbols depends on MODULES help Usually, modules have to be recompiled whenever you switch to a new kernel……
config 关键字界说新的装备选项,之后的几行界说了该装备选项的特点。装备选项的特点包含类型、数据规模、输入提示、依靠联系(及反向依靠联系)、协助信息和默认值等。
每个装备选项都必须拟定类型,类型包含bool、tristate、string、hex 和 int,其间 tristate 和string 是两种根本的类型,其他类型都根据这两种根本类型。类型界说后能够紧跟输入提示,下面的两段脚本是等价的。