编译与配置

来源:互联网 发布:数据采集与处理小木虫 编辑:程序博客网 时间:2024/06/04 00:50
Linux内核的编译以及加载
运行make menuconfig等时,配置工具首先分析体系结构对应/arch/xxx/Kconfig 文件(xxx即为传入的arch参数)
文件中除了包含一些与体系结构相关的配置项和配置菜单以外,还通过source语句引入了一系列的Kconfig文件,而这
些Kconfig又有可能通过source引入下一层的Kconfig,配置工具更具Kconfig包含的菜单和条目即可描绘出一个分层结
构。
Kconfig和Makefile
在Linux内核中增加程序需要完成以下3项工作。

将编写的源代码复制到Linux相应目录当中。
在目录的Kconfig文件当中增加关于新源代码对应项目的编译配置选项。
在目录的Makefile文件中增加对新源代码的编译条目

引用实例:
用简单的实例建立初步的认识:
...
在drivers/char/目录下有ttyprink文件,则在当前的Kconfig下存在如下的配置文件,
conf ig TTY_PRINTK
tristate "TTY driver to output user messages via printk"
depends on EXPERT && TTY
default n
---help---
If you say Y here, the support for writing user messages (i.e.
console messages) via printk is available.
The feature is useful to inline user messages with kernel
messages.
In order to use this feature, you should output user messages
to /dev/ttyprintk or redirect console to this TTY.
If unsure, say N.

在目录中的Makefile关于TTY_PRINTK的编译项为:
obj-$(CONFIG_TTY_PRINTK)+=ttyprintk.o

一般而言,驱动开发者会在内核源码的drivers目录内的相应子目录中增加新设备驱动的源代码或者在
/arch/arm/mach-xxx 下增加板级支持的代码。同时增加或修改Kconfig配置脚本和Makefile脚本。


Makefile
内核源代码各级子目录中的kbuild Makefile进行简单介绍。
目标定义
目标定义就是用来定义哪些内容要作为模块编译,哪些药编译并链接进内核
obj-y +=foo.o
表示要由foo.c或者foo.s文件编译得到foo.o并且链接进内核。是无条件编译,而obj-m 表示该文件
要作为模块编译。obj-n形式的目标不会被编译。
更常见的做法是根据make menuconfig后生成config文件的CONFIG_ 变量来决定文件的编译方式,如
obj-$(CONF iG_ISDN) += isdn.o
obj-$(CONF iG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o
除了具有obj-形式的目标以外,还有lib-y library库,hostprogs-y主机程序等目标,但是这两类解基
本都应用在特定的目录和场合之中。

多文件模块的定义
最简单的Makefile仅需一行代码就够了。如果模块由多个文件组成,会稍微复杂一些
#
# Makef ile for the linux ext2-f ilesystem routines.
#
obj-$(CONF iG_EXT2_FS) += ext2.o
ext2-y := balloc.o dir.o f ile.o fsync.o ialloc.o inode.o \
ioctl.o namei.o super.o symlink.o
ext2-$(CONF iG_EXT2_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o
ext2-$(CONF iG_EXT2_FS_POSIX_ACL) += acl.o
ext2-$(CONF iG_EXT2_FS_SECURITY) += xattr_security.o
ext2-$(CONF iG_EXT2_FS_XIP) += xip.o

模块的名字为ext2,由balloc.o、dir.o、file.o等多个目标文件最终

目录层次的迭代
obj-$(CONFIG_EXT2_FS) += ext2/
当CONFIG_EXT2_FS 的值为y或m时,kbuild将会把ext2目录列入向下迭代的目录当中。

配置选项
config MODVERSIONS
bool "Module versioning support"
help
...
每个配置选项都必须指定类型,类型包括bool,tristate,string,hex和inttristate和string是两
种基本的类型。其他类型都基于这两种类型。
等价脚本:
bool "Networking support"
等价于:
bool
prompt "Networking support"
依赖关系的格式为:
depend on (或者 requires ) <expr>

config MODULES
bool "Enable loadable module support"
config MODVERSION
bool “Set Version information on all module symbols”
depends on MODULES
comment "module support disable"
depend on !MODULES


先学习到这里,爱你,YZ
0 0