1、内核配置与裁剪1. Linux 内核配置 内核配置的方法很多,make config、make xconfig、make menuconfig、make oldconfig等等,它们的功能都是一样的。这里用的是 make menuconfig。 过去基于 2.x 的内核为用户提供了四种基本的内核设置编辑器: . config 服务于内核设置的一个冗长的命令行界面; . oldconfig 一个文本模式的界面,主要包含一个已有设置文件,对用户所发现的内核资源中的设置变量进行排序; . menuconfig 一个基于光标控制库的终端导向编辑器,可提供文本模式的图形用户界面; . xconfig 一
2、个图形内核设置编辑器,需要安装 XWindow 系统。 前三种编辑器在设置 2.6 内核时仍可使用,在运行“make xconfig”后,原有的界面被两个新的图形设置编辑器所代替。这需要具体的图形库和 XWindow 系统的支持。另外,用户还可以通过“make defconfig”命令,利用所有内核设置变量的缺省值自动建立一个内核设置文件。 下面具体介绍 Linux 内核配置选项: . 代码成熟度选项 Code maturity level options - * Prompt for development and/or incomplete code/drivers * Select on
3、ly drivers expected to compile cleanly 在内核中包含了一些不成熟的代码和功能,如果我们想使用这些功能,想打开相关的配置选项,就必需打开这一选项。 . 通用设置选项 General setup - () Local version - append to kernel release * Automatically append version information to the version string * Support for paging of anonymous memory (swap) * System V IPC * POSIX Mes
4、sage Queues * BSD Process Accounting * BSD Process Accounting version 3 file format * Sysctl support Auditing support * Support for hot-pluggable devices * Kernel Userspace Events * Kernel .config support * Enable access to .config through /proc/config.gz () Initramfs source file(s) * Configure stan
5、dard kernel features (for small systems) - - Configure standard kernel features (for small systems) Load all symbols for debugging/kksymoops Do an extra kallsyms pass Enable support for prinlk BUG()support Enable full-sinzed data structures for core * Enable futex support * Enable eventpoll support
6、* Optimize for size * Use full shmem filesystem (0) Function alignment (0) Label alignment (0) Loop alignment (0) Jump alignment Local version - append to kernel release:这里填入的是 64 字符以内的字符串,在这里填上的字符串可以用 uname -a 命令看到。 Support for paging of anonymous memory(swap ):这是使用交换分区或者交换文件来做为虚拟内存的,当然要选上。 System
7、V IPC:表示系统 5 的 Inter Process Communication,它用于处理器在程序之间同步和交换信息,如果不选这项,很多程序运行不起来的。 POSIX Message Queues:这是 POSIX 的消息队列,它同样是一种 IPC。建议最好将它选上。BSD Process Accounting:这是允许用户进程访问内核将账户信息写入文件中的。建议最好将它选上。 Sysctl support:这个选项能不重新编译内核修改内核的某些参数和变量,如果你也选择了支持/proc ,将能从 /proc/sys 存取可以影响内核的参数或变量。建议最好将它选上。 Auditing su
8、pport:审记支持,用于和内核的某些子模块同时工作,例如 SELinux。只有选择此项及它的子项,才能调用有关审记的系统调用。 Support for hot-pluggable devices:是否支持热插拔的选项,肯定要选上。不然USB、PCMCIA等这些设备都用不了。 Kernel Userspace Events:内核中分为系统区和用户区,这里是系统区和用户区进行通讯的一种方式,选上。 Kernel .config support:将.config 配置信息保存在内核中,选上它及它的子项使得其它用户能从/proc 中得到内核的配置。 Configure standard kernel
9、 features(for small systems):这是为了编译某些特殊的内核使用的,通常你可以不选择这一选项,你也不用对它下面的子项操心了。 Load all symbols for debugging/kksymoops:是否装载所有的调试符号表信息,如果你不需要对内核调试,不需要选择此项。 Enable futex support:不选这个内核不一定能正确的运行使用 glibc 的程序,当然要选上。 Enable eventpoll support:不选这个内核将不支持事件轮循的系统调用,最好选上。 Optimize for size:这个选项使 gcc 使用-Os 的参数而不是-
10、O2 的参数来优化编译,以获得更小尺寸的内核,建议选上。 Use full shmem filesystem:除非你在很少的内存且不使用交换内存时,才不要选择这项。 后面的这四项都是在编译时内存中的对齐方式,0 表示编译器的默认方式。使用内存对齐能提高程序的运行速度,但是会增加程序对内存的使用量。 (0) Function alignment (0) Label alignment (0) Loop alignment (0) Jump alignment . 可加载模块 Loadable module support - * Enable loadable module support *
11、Module unloading Forced module unloading * Module versioning support (EXPERIMENTAL) Source checksum for all modules * Automatic kernel module loading Enable loadable module support:支持模块加载。 Module unloading:不选这个功能,加载的模块就不能卸载。Forced module unloading:这个选项能强行卸载模块,即使内核认为这样并不安全,也就是说你可以把正在使用中的模块卸载掉。如果你不是内核
12、开发人员,不要选择这个选项。 Module versioning support(EXPERIMENTAL):这个功能可以让你使用其它版本的内核模块,不过建议你不要选择这个选项。 Source checksum for all modules:这个功能是为了防止更改了内核模块的代码但忘记更改版本号而造成版本冲突。如果你不是自己写内核模块,那就不需要这一选项了。 Automatic kernel module loading:这个选项能让内核自动的加载部份模块,建议你最好选上。举个例子说明一下,如模块 eth1394 依赖于模块 ieee1394。如果选择了这个选项,可以直接加载模块 eth13
13、94;如果没有选择这个选项,必需先加载模块 ieee1394,再加载模块eth1394,否则将出错。 . 总线支持配置 Bus support - PCCARD (PCMCIA/CardBus) support - Enable PCCARD debugging 16-bit PCMCIA support (NEW) Load CIS updates from userspace (EXPERIMENTAL)(NEW) PCMCIA control ioctl (obsolete) (NEW) - PC-card bridges PCCard(PCMCIA/CardBus)support:你的
14、计算机是否支持 PCMCIA 卡 Enable PCCARD debugging:通常不需要选择调试 PCMCIA 设备,除非你是设备驱动的开发人员。 16-bit PCMCIA support:16 位的 PCMCIA 总线支持。 . 支持的可执行文件格式 Userspace binary formats - * Kernel support for ELF binaries * Kernel support for a.out and ECOFF binaries * Kernel support for MISC binaries * RISC OS personality Kernel
15、 support for ELF binaries:ELF 是开放平台下最常用的二进制文件,它支持不同的硬件平台。 Kernel support for a.out and ECOFF binaries:这是早期 UNIX 系统的可执行文件格式,目前已经被 ELF 格式取代。 Kernel support for MISC binaries:此选项允许插入二进制的封装层到内核中,当使用Java、.NET、Python 、Lisp 等语言编写的程序时非常有用。 . 文件系统 File systems Second extended fs support * Ext2 extended attri
16、butes * Ext2 POSIX Access Control Lists * Ext2 Security Labels Ext3 journalling file system support * Ext3 extended attributes * Ext3 POSIX Access Control Lists * Ext3 Security Labels JBD (ext3) debugging support Reiserfs support Enable reiserfs debug mode Stats in /proc/fs/reiserfs * ReiserFS exten
17、ded attributes * ReiserFS Security Labels JFS filesystem support * JFS POSIX Access Control Lists JFS debugging JFS statistics XFS filesystem support * Realtime support (EXPERIMENTAL) * Quota support * Security Label support * POSIX ACL support Minix fs support ROM file system support * Quota suppor
18、t Old quota format support Quota format v2 support * Dnotify support Kernel automounter support Kernel automounter version 4 support (also supports v3) CD-ROM/DVD Filesystems - DOS/FAT/NT Filesystems - Pseudo filesystems - Miscellaneous filesystems - Network File Systems - Partition Types - Native L
19、anguage Support - Second extended fs support:标准的 Linux 文件系统,建议将这种文件系统编译进内核。 Ext2 extended attributes:Ext2 文件系统的结点名称、属性的扩展支持。 Ext2 POSIX Access Control Lists:POSIX 系统的访问权限列表支持。也就是Owner/Group/Others 的 Read/Write/Execute 权限。 Ext2 Security Labels:扩展的安全标签,例如 SElinux 之类的安全系统会使用到这样的扩展安全属性。 Ext3 journalling
20、 file system support:如果你熟悉 Redhat Linux,你一定会习惯 Ext3 文件系统。Ext3 extended attributes:Ext3 文件系统的结点名称、属性的扩展支持。 Ext3 POSIX Access Control Lists:POSIX 系统的访问权限列表支持。 Ext3 Security Labels:扩展的安全标签支持。 JBD (ext3) debugging support:Ext3 的调试。除非你是文件系统的开发者,否则不要选上这一项。 Reiser fs support:如果你熟悉 Suse Linux,你一定会习惯 Reiser
21、fs 文件系统。 Enable reiserfs debug mode: Reiserfs 的调试。除非你是文件系统的开发者,否则不要选上这一项。 Stats in /proc/fs/reiserfs:在/proc/fs/reiserfs 文件中显示 Reiserfs 文件系统的状态。一般来说不需要选择这一项。 ReiserFS extended attributes:Reiserfs,文件系统的结点名称、属性的扩展支持。 ReiserFS POSIX Access Control Lists:POSIX 系统的访问权限列表支持。 ReiserFS Security Labels:扩展的安全标
22、签支持。 JFS filesystem support:JFS 是 IBM 公司设计用于 AIX 系统上的文件系统。后来这一文件系统也能应用于 Linux 系统。 JFS POSIX Access Control Lists:POSIX 系统的访问权限列表支持。 JFS debugging:JFS 的调试。除非你是文件系统的开发者,否则不要选上这一项。 JFS statistics:在/proc/fs/jfs 文件中显示 Reiserfs 文件系统的状态。一般来说不需要选择这一项。 XFS filesystem support:XFS 是 SGI 公司为其图形工作站设计的一种文件系统,后来这一
23、文件系统也能应用于 Linux 系统。 Realtime support (EXPERIMENTAL ):实时卷的支持,能大幅提高大文件的读写速度。不过并不太安全,建议暂时不要选择这一选项。 Quota support:XFS 文件系统的配额支持。 Security Label support:扩展的安全标签支持。 POSIX ACL support:POSIX 系统的访问权限列表支持。 Minix fs support:Minix 可能是最早的 Linux 系统所使用的文件系统。后来被 Ext2 文件系统所取代。 ROM file system support:内存文件系统的支持。除非你是嵌
24、入式系统的开发者,明确知道你要干什么,否则不要选这一项。 Quota support:配额支持。也就是说限制某个用户或者某组用户的磁盘占用空间。 Old quota format support:旧版本的配额支持。 Quota format v2 support:新版本(第二版)的配额支持。 Dnotify support:基于目录的文件变化的通知机制。 Kernel automounter support:内核自动加载远程文件系统的支持。 Kernel automounter version 4 support (also supports v3):新的内核自动加载远程文件系统的支持,也支持
25、第三版。 2. Linux 内核裁剪 嵌入式 LINUX 内核裁剪主要有以下三种方法。 (1) 使用 LINUX 自身的配置工具,编译定制内核。LINUX 内核能够很好的支持模块化,内核有许多可以独立增加删除的功能模块可以设置为内核配置选项。嵌入式 LINUX 内核支持很多的硬件,如果在编译的时候把这些选上,编译出来的内核会很大,编译时应根据系统平台特点和应用需求配置内核,添加需要的功能、删除不必要的功能,这样可以显著减小内核的大小。但这种裁剪方法的缺点是内核裁剪的粒度较大,精度较小。 (2) 修改内核源代码进行系统裁剪。通过分析系统平台和应用需求,结合对内核代码的理解,在内核源代码的适当位置
26、加入一些条件编译语句,使用 CML(菜单定制语言)定制内核选项。基于内核源码的方法裁剪粒度更小,裁剪出来的内核体积更小,更适合嵌入式系统的需求。 (3) 基于系统调用关系进行内核裁剪。内核是操作系统运行的核心,内核函数在系统调用、异常产生和中断发生时被调用。 Kconfig 与 Makefile 文件 2.6 版本内核源码树的目录下都有两个文档 Kconfig(2.4 版本是 Config.in)和Makefile。分布到各目录的 Kconfig 构成了一个分布式的内核配置数据库,每个 Kconfig 分别描述了所属目录源文档相关的内核配置菜单。在内核配置 make menuconfig(或
27、xconfig等)时,从 Kconfig 中读出菜单,用户选择后保存到.config 的内核配置文档中。在内核编译时,主 Makefile 调用这个.config,就知道了用户的选择。上面的内容说明了,Kconfig 就是对应着内核的配置菜单。假如要想添加新的驱动到内核的源码中,能够修改 Kconfig,这样就能够选择这个驱动,假如想使这个驱动被编译,要修改 Makefile。 因此添加新的驱动时需要修改的文档有两种: . Kconfig . Makefile 要想知道怎么修改这两种文档,就要知道两种文档的语法结构,下面作简介: . Kconfig 每个菜单都有一个关键字标识,最常见的就是 c
28、onfig 语法: config symboloptionssymbol 是个新的标记的菜单项,options 是在这个新的菜单项下的属性和选项 其中 options 部分有 : 1、类型定义: 每个 config 菜单项都要有类型定义,bool 布尔类型、 tristate 三态:内建、模块、移除 string字符串、 hex 十六进制、 integer 整型。 例如 config HELLO_MODULE bool “hello test module“ bool 类型的只能选中或不选中, tristate 类型的菜单项多了编译成内核模块的选项,假如选择编译成内核模块,则会在.config
29、 中生成一个 CONFIG_HELLO_MODULE=m 的配置,假如选择内建,就是直接编译成内核映像,就会在.config 中生成一个CONFIG_HELLO_MODULE=y 的配置。 2、依赖型定义 depends on 或 requires 指此菜单的出现是否依赖于另一个定义。 config HELLO_MODULE bool “hello test module“ depends on ARCH_PXA 这个例子表明 HELLO_MODULE 这个菜单项只对 XScale 处理器有效。 3、帮助性定义 只是增加帮助用关键字 help 或-help- 。 . 内核的 Makefile
30、在 linux2.6.x/Documentation/kbuild 目录下有周详的介绍有关 kernel makefile 的知识。内核的 Makefile 分为 5 个组成部分: Makefile 最顶层的 Makefile; .config 内核的当前配置文档,编译时成为顶层 Makefile 的一部分; arch/$(ARCH)/Makefile 和体系结构相关的 Makefile; s/ Makefile.* 一些 Makefile 的通用规则; kbuild Makefile 各级目录下的大概约 500 个文档,编译时根据上层 Makefile 传下来的宏定义和其他编译规则,将源代码
31、编译成模块或编入内核。 顶层的 Makefile 文档读取.config 文档的内容,并总体上负责 build 内核和模块。Arch Makefile则提供补充体系结构相关的信息。 s 目录下的 Makefile 文档包含了任何用来根据 kbuild Makefile 构建内核所需的定义和规则(其中.config 的内容是在 make menuconfig 的时候,通过 Kconfig 文档配置的结果) 。 举个例子: 假设想把自己写的一个 flash 的驱动程序加载到工程中,而且能够通过 menuconfig 配置内核时选择该驱动该怎么办呢?能够分三步: 第一:将您写的 flashtest.
32、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 menuconfig 时,您将发现 ap71 flash 选项,假如您选择了此项。该选择就会保存在.config 文档中。当您编译内核时,将会读取.config 文档,当发现 ap71 flash 选项为 yes 时,系统在调用/driver/mtd/maps/ 下的 makefile 时,将会把 flashtest.o 加入到内核中。即可达到您的目的。