linux内核中Kconfig文档的作用以及Kconfig的语法

合集下载

Linux系统的Makefile和Kconfig及模块简介

Linux系统的Makefile和Kconfig及模块简介

Linux系统的Makefile、Kconfig和模块1Makefile1.1Makefile组织层次Linux的Make体系由如下几部分组成:Ø顶层Makefile顶层Makefile通过读取配置文件,递归编译内核代码树的相关目录,从而产生两个重要的目标文件:vmlinux和模块。

Ø内核相关Makefile位于arch/$(ARCH) 目录下,为顶层Makefile提供与具体硬件体系结构相关的信息。

Ø公共编译规则定义文件。

包括Makefile.build 、Makefile.clean、Makefile.lib、Makefile.host等文件组成。

这些文件位于scripts目录中,定义了编译需要的公共的规则和定义。

Ø内核配置文件 .config通过调用make menuconfig或者make xconfig命令,用户可以选择需要的配置来生成期望的目标文件。

Ø其他Makefile主要为整个Makefile体系提供各自模块的目标文件定义,上层Makefile根据它所定义的目标来完成各自模块的编译。

1.2Makefile的使用在编译内核之前,用户必须首先完成必要的配置。

Linux内核提供了数不胜数的功能,支持众多的硬件体系结构,这就需要用户对将要生成的内核进行裁减。

内核提供了多种不同的工具来简化内核的配置。

make config,字符界面下命令行工具,这个工具会依次遍历内核所有的配置项,要求用户进行逐项的选择配置。

这个工具会耗费用户太多时间,除非万不得以(你的编译主机不支持其他配置工具)一般不建议使用。

make menuconfig,基于ncurse库编制的图形界面工具,一般台式机使用该工具。

make xconfig,基于X11的图形配置工具,一般用于工作站环境。

当用户完成配置后,配置工具会自动生成.config文件,它被保存在内核代码树的根目录下。

kconfig语法详解

kconfig语法详解

kconfig语法详解
在Linux内核配置中,kconfig是一个非常重要的工具。

它提供了一种灵活的方式来定义和配置内核参数。

kconfig语法是内核配置的核心,了解其语法规则和特性对于正确配置内核至关重要。

kconfig语法基于一个简单的配置文件格式,该文件描述了内核选项及其属性。

配置文件通常位于内核源码的顶层目录下,名为.config。

当内核源码被编译时,kconfig工具会读取这个文件,并根据其中的设置来构建内核映像。

kconfig语法的基本结构由配置节点、属性和值组成。

每个配置节点表示一个可配置的选项,而属性描述了该选项的特性和行为。

属性通常包括类型(如bool、int、string等)、默认值、描述和其他元数据。

下面是一个简单的kconfig语法示例:
在上面的示例中,config关键字用于声明一个配置节点。

节点的名称是MY_OPTION,类型为bool(布尔类型),默认值为y(表示启用)。

节点还有一个描述,说明这是一个示例选项。

kconfig语法的关键部分还包括条件语句、菜单结构、选择列表等。

这些高级特性使得配置过程更加灵活和复杂。

例如,可以使用条件语句来根据不同的配置环境或条件启用或禁用特定选项。

菜单结构允许用户在配置界面中组织选项,使界面更易于导航和理解。

选择列表则提供了一个用户可以选择的固定选项集合,通常用于设置某些特定的参数值。

总之,了解kconfig语法是进行Linux内核配置的基础。

通过掌握其基本结构和规则,用户可以更加灵活地定制和优化内核参数,以满足特定的需求和场景。

Linux内核中的Kconfig用法与说明

Linux内核中的Kconfig用法与说明

Linux内核中的Kconfig文件本节不对内核的Kconfig文件进行深入展开,更多Kconfig语法和说明请阅读<Documentation/kbuild/kconfig-language.txt>和<Documentation/kbuild/kconfig.txt>。

内核源码树每个目录下都还包含一个Kconfig文件,用于描述所在目录源代码相关的内核配置菜单,各个目录的Kconfig文件构成了一个分布式的内核配置数据库。

通过make menuconfig(make xconfig或者make gconfig)命令配置内核的时候,从Kconfig文件读取菜单,配置完毕保存到文件名为.config的内核配置文件中,供Makefile文件在编译内核时使用。

1.1.1 Kconfig基本语法如程序清单0.1所示代码摘自<drivers/char/Kconfig>文件,是一个比较典型的Kconfig文件片段,包含了Kconfig的基本语法。

程序清单0.1drivers/char/Kconfig片段menu "Character devices"source "drivers/tty/Kconfig"config DEVKMEMbool "/dev/kmem virtual device support"default yhelpSay Y here if you want to support the /dev/kmem device. The/dev/kmem device is rarely used, but can be used for certainkind of kernel debugging operations.When in doubt, say "N".……endmenu1.子菜单通过menu和endmenu来定义一个子菜单,程序清单0.1所示代码定义了一个“Character devices”子菜单,子菜单在界面中用“--->”表示,如图0.1所示。

Kconfig基本语法

Kconfig基本语法

Kconfig基本语法Linux 内核在2.6版本以后将配置⽂件由原来的config.in改为Kconfig。

当执⾏make menuconfig时会出现内核的配置界⾯,所有配置⼯具都是通过读取arch/$(ARCH)Kconfig⽂件来⽣成配置界⾯,这个⽂件就是所有配置的总⼊⼝,它会包含其他⽬录的Kconfig。

Kconfig的作⽤是⽤来配置内核,它就是各种配置界⾯的源⽂件,内核的配置⼯具读取各个Kconfig⽂件,⽣成配置界⾯供开发⼈员配置内核,最后⽣成配置⽂件.config。

Kconfig的语法可以参考Documentation/kbuild/kconfig-language.txt,在这⾥给出kconfig-language.txt的中⽂翻译。

介绍----在配置数据库的配置选项是以树的形式组织的:+- Code maturity level options| +- Prompt for development and/or incomplete code/drivers+- General setup| +- Networking support| +- System V IPC| +- BSD Process Accounting| +- Sysctl support+- Loadable module support| +- Enable loadable module support| +- Set version information on all module symbols| +- Kernel module loader+- ...每个选项都有其⾃⼰的依赖关系。

这些依赖关系决定了选项是否是可见的。

⽗选项可见,⼦选项才能可见。

菜单选项--------⼤多数的选项都定义了⼀个配置选项,其它选项则有助于对它们进⾏组织。

⼀个配置选项定义可以是下⾯的形式:config MODVERSIONSbool "Set version information on all module symbols"depends MODULEShelpUsually, modules have to be recompiled whenever you switch to a newkernel. ...每⾏都是以config关键字开始,并可以接多个参数。

LINUX设备驱动开发详解

LINUX设备驱动开发详解

LINUX设备驱动开发详解概述LINUX设备驱动开发是一项非常重要的任务,它使得硬件设备能够与操作系统进行有效地交互。

本文将详细介绍LINUX设备驱动开发的基本概念、流程和常用工具,帮助读者了解设备驱动开发的要点和技巧。

设备驱动的基本概念设备驱动是连接硬件设备和操作系统的桥梁,它负责处理硬件设备的输入和输出,并提供相应的接口供操作系统调用。

设备驱动一般由设备驱动程序和设备配置信息组成。

设备驱动程序是编写解决设备驱动的代码,它负责完成设备初始化、IO操作、中断处理、设备状态管理等任务。

设备驱动程序一般由C语言编写,使用Linux内核提供的API函数进行开发。

设备配置信息是定义硬件设备的相关参数和寄存器配置的文件,它告诉操作系统如何与硬件设备进行交互。

设备配置信息一般以设备树或者直接编码在设备驱动程序中。

设备驱动的开发流程设备驱动的开发流程包括设备初始化、设备注册、设备操作函数编写和设备驱动注册等几个主要步骤。

下面将详细介绍这些步骤。

设备初始化设备初始化是设备驱动开发的第一步,它包括硬件初始化和内存分配两个主要任务。

硬件初始化是对硬件设备进行基本的初始化工作,包括寄存器配置、中断初始化等。

通过操作设备的寄存器,将设备设置为所需的状态。

内存分配是为设备驱动程序分配内存空间以便于执行。

在设备初始化阶段,通常需要为设备驱动程序分配一块连续的物理内存空间。

设备注册设备注册是将设备驱动程序与设备对象进行关联的过程,它使得操作系统能够正确地管理设备。

设备注册包括设备号分配、设备文件创建等操作。

设备号是设备在系统中的唯一标识符,通过设备号可以找到设备对象对应的设备驱动程序。

设备号分配通常由操作系统负责,设备驱动程序通过注册函数来获取设备号。

设备文件是用户通过应用程序访问设备的接口,它是操作系统中的一个特殊文件。

设备文件的创建需要通过设备号和驱动程序的注册函数来完成。

设备操作函数编写设备操作函数是设备驱动程序的核心部分,它包括设备打开、设备关闭、读和写等操作。

Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解

Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解

printk(KERN_WARNING fmt, ##arg) printk(KERN_DEBUG fmt, ##arg)
/* Module Init & Exit function */ static int __init myModule_init(void) {
/* Module init code */ PRINTK("myModule_init\n"); return 0;
图形
工具
前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍 了模块的一种编译方式——在一个独立的文件夹通过makefile配合内核源码路径完成
那么如何将驱动直接编译进内核呢? 在我们实际内核的移植配置过程中经常听说的内核裁剪又是怎么麽回事呢? 我们在进行linux内核配置的时候经常会执行make menuconfig这个命令,然后屏幕上会出现以下 界面:
首页 业界 移动 云计算 研发 论坛 博客 下载 更多
process的专栏
您还未登录!| 登录 | 注册 | 帮助
个人资料
dianhuiren
访问:71424次 积分:1219分 排名:第8764名 原创:37篇 转载:127篇 译文:0篇 评论:3条
目录视图
摘要视图
订阅
《这些年,我们读过的技术经典图书》主题有奖征文 经理
这些配置工具都是使用脚本语言,如 Tcl/TK、Perl 编写的(也包含一些用 C 编写的代码)。本文
/dianhuiren/article/details/6917132
1/5
2012年04月 (6) 2012年03月 (15) 2012年02月 (16)
并不是对配置系统本身进行分析,而是介绍如何使用配置系统。所以,除非是配置系统的维护者,一般 的内核开发者无须了解它们的原理,只需要知道如何编写 Makefile 和配置文件就可以。

第17章:嵌入式Linux移植与引导

第17章:嵌入式Linux移植与引导
}; struct ATAG_INITRD2 #definetag_cmdline { 0x54420005 char cmdline[1]; /* this is the minimum size */ struct tag_initrd { }; u32 start; u32 size; }; /* physical start address */ /* size of compressed ramdisk image in bytes */
嵌入式Linux的引导

stage2内存映射 – 如下数据结构用来描述RAM 地址空间中的一段连续的 地址范围:
type struct memory_area_struct { u32 start; //内存区域的起始地址 u32 size; //内存区域的大小(字节数) int used; //内存区域的状态 } memory_area_t; used=0|1 • 1=这段地址范围已被实现,也即真正地被映射到RAM 单元上 • 0=这段地址范围并未被系统所实现,处于未使用状态。
• R0=0; • R1=机器类型ID; • R2=传递给内核的启动参数起始地址;
– 2. CPU 模式:
• 必须禁止中断(IRQs和FIQs); • CPU必须处于SVC 模式;
– 3. Cache 和MMU 的设置:
• MMU 必须关闭; • 指令Cache 可以打开也可以关闭; • 数据Cache 必须关闭;
东南大学集成电路学院
嵌入式操作系统
第十七章 嵌入式Linux移植与引导
戚隆宁 longn_qi@
国家ASIC系统工程技术研究中心
主要内容


嵌入式Linux的引导 嵌入式Linux的移植

config用法

config用法

config用法config是一个常用的配置文件格式,它是一种文本文件,通常以.config为扩展名。

config文件用于存储应用程序的配置信息,包括设置、选项、参数等。

在计算机应用中,config文件通常用于设置应用程序的运行参数、文件路径、端口号、数据库连接信息等。

通过使用config文件,用户可以方便地修改应用程序的配置,从而满足不同的使用场景和需求。

一、config文件的结构config文件通常包含多个配置项,每个配置项由键值对组成。

键是配置项的名称,值是对应的值。

config文件可以包含多个层次结构,每个层次结构由多个配置项组成。

config文件的格式比较简单,通常使用英文或中文进行编写。

config文件的语法规则如下:* 配置项以键值对的形式表示,用等号“=”连接键和值;* 配置项之间用逗号或分号隔开;* 配置项可以包含空格和特殊字符;* 配置项的值可以是文本、数字、布尔值等。

二、config文件的编辑工具常用的编辑工具有文本编辑器、编辑器、Visual Studio Code 等。

其中,文本编辑器是最简单的方法,适合初学者使用。

编辑器可以提供更多的编辑功能,如语法高亮、自动补全等。

Visual Studio Code是一款跨平台的编辑器,适用于编写多种编程语言,对于config 文件的编辑也具有较好的支持。

三、config文件的常用设置config文件中的常用设置包括设置应用程序的端口号、数据库连接信息、日志文件路径等。

以下是一些示例:* 设置应用程序的端口号:```phpPORT=8080```* 设置数据库连接信息:```makefileDB_HOST=localhostDB_USER=rootDB_PASSWORD=123456DB_NAME=mydatabase```* 设置日志文件路径:```makefileLOG_PATH=C:/log/myapp.log```四、config文件的加载和使用config文件通常在应用程序启动时加载和使用。

Kconfig指令详解

Kconfig指令详解

mentcomment相当于插入语句,不起实际作用,只是起显示一句话如:comment "****Boot options******"bool 后面+字符串(tristate与bool一样,只是多了一个M选项,意思是编译成动态模块,不是直接加载到内核的,而是单独编译成模块,需要时再加载,适合于外设驱动程序)如:config S3C_BOOT_WATCHDOGbool "S3C Initialisation watchdog"depends on S3C2410_W ATCHDOGhelpSay y to enable the watchdog during the kernel decompression其中关键字config ,bool ,depends on当S3C2410_W ATCHDOG被定义时,显示[ ] S3C Initialisation watchdog 选项用空格来选择Y or N . bool 是用来定义Y或者N 的,当选择Y 时,则配置CONFIG_S3C_BOOT_W ATCHDOG在Makefile 中obj-$( CONFIG_S3C_BOOT_W ATCHDOG) += watchdog.o 则该语句有效,编译watchdog.c 文件3. int 的用法config S3C2410_PM_CHECK_CHUNKSIZEint "S3C UART to use for low-level messages"default 0 //若要写成默认值100 则括号里面就是100helpChoice of which UART port to use for the low-level messages,箭头的使用如下:蓝色部分//****************以下设置菜单前有选项[ ]**************************menuconfig NETbool "Networking support"select NLATTR---help---Unless you really know what you are doing, you should say Y here.。

Linux源码Kconfig文件语法分析

Linux源码Kconfig文件语法分析

Linux源码Kconfig⽂件语法分析Kconfig是我们进⾏内核配置的关键⽂件,⽤于⽣成menuconfig的界⾯并⽣成最终确定编译选项的.config⽂件。

关于Kconfig⽂件的编写规则,在Documentation/kbuild/kconfig-language.txt有详尽的叙述。

这⾥主要⽤实例进⾏语法分析。

config确定了条⽬前⾯是否有选项,menuconfig界⾯中的条⽬中⼀共有3种主动选项,分别是[ ],< >和( ),分别表⽰"被编译进内核or舍弃","编译进内核or编译成模块or舍弃", "按照提⽰输⼊⼀个数字",分别对应Kconfig⽂件中的bool,tristate和int。

{ }和- -属于被动选项,是配置系统根据依赖关系⾃动⽣成的选项,不能被⼿动修改。

menu/endmenu即图形界⾯中有--->的条⽬,回车后可以展开。

条⽬前⾯没有选项!menuconfig是menu和config的结合体,既在前⾯有选项,回车后也可以展开。

choice/endchoice展开之后会有多选⼀的界⾯,每种选项都有独⽴的config管理commentif/endif如果if之后的值被选定了,⾥⾯的内容才能展开source表⽰调⽤指定路径的Kconfig,相当于C中的include,上例已经给出说明depends on实现配置的相当关键的关键字,表⽰当前选项依赖于另外⼀个选项,如果另外⼀个不选,这个都不会出现。

select另⼀个相当关键的关键字,表⽰当前选项需要另外选项的⽀持,如果选了当前选项,那么其后的选项会被强制选择,{ }或- -就是这个实现的。

下例中,只要这些Kconfig中进⾏了"select HAVE_ARM_ARCH_TIMER",都会导致"HAVE_ARM_ARCH_TIMER"被强制选择,表现在menuconfig上就是"Architected timer support"被强制选定.config⽂件分析经过适当的配置之后保存就会在顶层⽬录下⽣成.config⽂件=y表⽰该配置将会被编译进内核,=m表⽰该配置需要单独编译成模块。

linux中sysconfig的作用

linux中sysconfig的作用

linux中sysconfig的作用
sysconfig是Linux系统中的一个配置文件,主要用于设置系统的各种参数。

这些参数包括网络配置、服务启动、内核参数等,可以通过修改sysconfig配置文件来实现。

sysconfig文件通常存放在
/etc/sysconfig目录下。

在网络配置方面,sysconfig文件可以设置主机名、IP地址、网关、DNS等信息。

通过修改这些配置参数可以使Linux系统连接到不同的网络环境中,实现网络通信。

另外,sysconfig文件还可以用于启动和关闭不同的服务。

例如,可以通过修改sysconfig文件来启动或关闭FTP、SSH、Apache等服务。

这些服务的启动和关闭状态会被记录在sysconfig配置文件中,方便管理员进行管理。

在内核参数方面,sysconfig文件可以设置内核的各种参数,如进程数、文件句柄数、内存大小等。

通过调整这些参数可以优化系统性能,并提高系统的稳定性。

总之,sysconfig是Linux系统中一个十分重要的配置文件,可以设置系统的各种参数,方便管理员进行系统管理和配置。

- 1 -。

linux ifcfg配置文件的基本指令

linux ifcfg配置文件的基本指令

linux ifcfg配置文件的基本指

在Linux中,ifcfg配置文件用于配置网络接口。

以下是一些常用的ifcfg配置指令:
1. ifconfig:用于查看和配置网络设备。

可以用来获取网络接口配置信息,也可以修改这些配置。

2. up:启动指定网络设备/网卡。

3. down:关闭指定网络设备/网卡。

该参数可以有效地阻止通过指定接口的IP信息流,如果想永久地关闭一个接口,还需要从核心路由表中将该接口的路由信息全部删除。

4. arp:设置指定网卡是否支持ARP协议。

此外,我们还可以使用以下命令行工具对ifcfg文件进行管理:
1. vi或nano:可以用来编辑ifcfg文件。

2. grep:可以用来搜索ifcfg文件中的关键字。

3. rm:可以用来删除ifcfg文件。

kconfig string 默认值范围

kconfig string 默认值范围

kconfig string 默认值范围全文共四篇示例,供读者参考第一篇示例:在进行kconfig配置时,经常会遇到需要设置默认值的情况,其中包括kconfig string类型的默认值范围。

Kconfig string类型是指在Linux内核编译配置中用于输入字符串的一种配置选项。

字符串类型的默认值范围关乎配置选项的合法性和可靠性,因此在设置默认值时需要慎重考虑,以确保系统的稳定性和可靠性。

对于kconfig string类型的配置选项,默认值的范围取决于具体的配置要求。

在设置默认值时,需要注意以下几点:1. 字符串长度范围:在设置kconfig string类型的默认值时,需要考虑字符串的长度范围。

一般来说,字符串长度不宜过长,以免导致内存溢出。

在设置默认值时,可以通过限制字符串长度的方式来确保系统的稳定性。

2. 字符串合法性:另外一个需要考虑的因素是字符串的合法性。

在设置默认值时,需要确保输入的字符串是合法的,不应包含特殊字符或不可见字符,以免影响系统的正常运行。

可以通过正则表达式来限制输入字符串的格式,确保输入的字符串符合要求。

3. 默认值的设置:在设置默认值时,需要考虑用户的需求和习惯。

一般来说,可以设置一些常见的字符串作为默认值,以方便用户的配置和使用。

也可以提供一些默认值的选择,让用户根据自己的需求进行配置。

第二篇示例:Kconfig是Linux内核配置系统中用于定义配置选项的语言,允许开发者在编译内核时进行各种配置,以满足不同的需求。

在Kconfig 中,有一种配置选项叫做string,默认值范围是指该选项允许的取值范围。

本文将探讨Kconfig string默认值范围的相关内容。

在Kconfig中,string配置选项代表一个字符串类型的配置项,可以用于输入字符序列。

字符串配置项的默认值范围指的是在配置该选项时,允许用户输入的字符串的取值范围。

一般来说,字符串配置选项的默认值范围是任意字符序列,用户可以输入任意长度的字符串作为配置值。

linux内核中Kconfig文档的作用以及Kconfig的语法

linux内核中Kconfig文档的作用以及Kconfig的语法

linux内核中Kconfig文档的作用以及Kconfig的语法2.6内核的源码树目录下一般都会有两个文文:Kconfig 和Makefile。

分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。

在内核配置make menuconfig(或xconfig等)时,从Kconfig中读出配置菜单,用户配置完后保存到.config(在顶层目录下生成)中。

在内核编译时,主Makefile调用这个.config,就知道了用户对内核的配置情况。

上面的内容说明:Kconfig就是对应着内核的配置菜单。

假如要想添加新的驱动到内核的源码中,可以通过修改Kconfig来增加对我们驱动的配置菜单,这样就有途径选择我们的驱动,假如想使这个驱动被编译,还要修改该驱动所在目录下的Makefile。

因此,一般添加新的驱动时需要修改的文件有两种(注意不只是两个)*Kconfig*Makefile要想知道怎么修改这两种文件,就要知道两种文档的语法结构。

First: Kconfig每个菜单项都有一个关键字标识,最常见的就是config。

语法:configsymboloptions&lt;!--[if !supportLineBreakNewLine]--&gt;&lt ;!--[endif]--&gt;symbol就是新的菜单项,options是在这个新的菜单项下的属性和选项其中options部分有:1、类型定义:每个config菜单项都要有类型定义,bool:布尔类型,tristate三态:内建、模块、移除,string:字符串,hex:十六进制,integer:整型例如config HELLO_MODULEbool "hello test module"bool类型的只能选中或不选中,tristate类型的菜单项多了编译成内核模块的选项,假如选择编译成内核模块,则会在.config中生成一个CONFIG_HELLO_MODULE=m的配置,假如选择内建,就是直接编译成内核影响,就会在.config中生成一个CONFIG_HELLO_MODULE=y的配置.2、依赖型定义depends on或requires指此菜单的出现是否依赖于另一个定义config HELLO_MODULEbool "hello test module"depends on ARCH_PXA 这个例子表明HELLO_MODULE这个菜单项只对XScale处理器有效,即只有在选择了ARCH_PXA,该菜单才可见(可配置)。

kconfig string 默认值范围-概述说明以及解释

kconfig string 默认值范围-概述说明以及解释

kconfig string 默认值范围-概述说明以及解释1.引言1.1 概述概述部分:Kconfig是Linux内核配置系统中使用的配置语言,用于定义内核的配置选项和配置依赖关系。

在Kconfig中,有一个string类型的配置选项,用于存储字符串类型的配置信息。

在配置Kconfig string类型时,可以设置默认值来方便用户选择或使用。

本文将围绕Kconfig string类型的默认值进行讨论,主要关注默认值的设置范围。

通过深入探讨Kconfig string类型的默认值范围,可以帮助读者更好地理解如何在实际应用中进行配置选项的设置,从而提高内核配置的灵活性和便利性。

1.2 文章结构本文主要分为三个部分,分别是引言、正文和结论。

在引言部分,将对Kconfig string类型及其默认值进行简要介绍,以及文章的结构和目的进行阐述。

在正文部分,将详细讨论Kconfig string类型的特点和使用方法,重点关注Kconfig中string默认值的设置及其范围。

在结论部分,将对本文进行总结,探讨Kconfig string默认值范围的应用意义,并展望相关领域可能出现的发展趋势。

1.3 目的目的部分旨在指出本文的研究目的和意义。

通过对Kconfig中string 类型的默认值范围进行分析和讨论,旨在帮助读者更好地理解和使用Kconfig配置系统。

同时,本文还旨在探讨如何合理设置和利用Kconfig 中string类型的默认值,以提高软件开发效率和功能性。

通过本文的研究,读者可以更深入地了解Kconfig配置系统的使用和特性,为软件开发提供一定的参考和指导。

2.正文2.1 Kconfig string类型简介在嵌入式系统开发中,Kconfig是Linux内核的配置系统,用于管理内核配置项的选择和设置。

在Kconfig中,有多种类型的配置项,其中包括string类型。

String类型的配置项用于表示字符串值,可以用于配置文件路径、设备名称、配置参数等。

2.6内核编译配置选项简介--介绍make menuconfig中的每个选项含义

2.6内核编译配置选项简介--介绍make menuconfig中的每个选项含义

BUG报告,切磋与探讨由于作者水平有限,因此不能保证作品内容准确无误,请在阅读中自行鉴别。

如果你发现了作品中的错误,请您来信指出,哪怕是错别字也好,任何提高作品质量的建议我都将虚心接纳。

如果你愿意就作品中的相关内容与我进行进一步切磋与探讨,也欢迎你与我联系。

联系方式:MSN: csfrank122@Code maturity level options代码成熟度选项Prompt for development and/or incomplete code/drivers显示尚在开发中或尚未完成的代码与驱动.除非你是测试人员或者开发者,否则请勿选择General setup常规设置Local version - append to kernel release在内核版本后面加上自定义的版本字符串(小于64字符),可以用"uname -a"命令看到Automatically append version information to the version string自动在版本字符串后面添加版本信息,编译时需要有perl以及git仓库支持Support for paging of anonymous memory (swap)使用交换分区或者交换文件来做为虚拟内存System V IPCSystem V进程间通信(IPC)支持,许多程序需要这个功能.必选,除非你知道自己在做什么IPC NamespacesIPC命名空间支持,不确定可以不选POSIX Message QueuesPOSIX消息队列,这是POSIX IPC中的一部分BSD Process Accounting将进程的统计信息写入文件的用户级系统调用,主要包括进程的创建时间/创建者/内存占用等信息BSD Process Accounting version 3 file format使用新的第三版文件格式,可以包含每个进程的PID和其父进程的PID,但是不兼容老版本的文件格式Export task/process statistics through netlink通过netlink接口向用户空间导出任务/进程的统计信息,与BSD Process Accounting的不同之处在于这些统计信息在整个任务/进程生存期都是可用的Enable per-task delay accounting在统计信息中包含进程等候系统资源(cpu,IO同步,内存交换等)所花费的时间UTS NamespacesUTS名字空间支持,不确定可以不选Auditing support审计支持,某些内核模块(例如SELinux)需要它,只有同时选择其子项才能对系统调用进行审计Enable system-call auditing support支持对系统调用的审计Kernel .config support把内核的配置信息编译进内核中,以后可以通过scripts/extract-ikconfig脚本来提取这些信息Enable access to .config through /proc/config.gz允许通过/proc/config.gz访问内核的配置信息Cpuset support只有含有大量CPU(大于16个)的SMP系统或NUMA(非一致内存访问)系统才需要它Kernel->user space relay support (formerly relayfs)在某些文件系统上(比如debugfs)提供从内核空间向用户空间传递大量数据的接口Initramfs source file(s)initrd已经被initramfs取代,如果你不明白这是什么意思,请保持空白Optimize for size (Look out for broken compilers!)编译时优化内核尺寸(使用"-Os"而不是"-O2"参数编译),有时会产生错误的二进制代码Enable extended accounting over taskstats收集额外的进程统计信息并通过taskstats接口发送到用户空间Configure standard kernel features (for small systems)配置标准的内核特性(为小型系统)Enable 16-bit UID system calls允许对UID系统调用进行过时的16-bit包装Sysctl syscall support不需要重启就能修改内核的某些参数和变量,如果你也选择了支持/proc,将能从/proc/sys存取可以影响内核行为的参数或变量Load all symbols for debugging/kksymoops装载所有的调试符号表信息,仅供调试时选择Include all symbols in kallsyms在kallsyms中包含内核知道的所有符号,内核将会增大300KDo an extra kallsyms pass除非你在kallsyms中发现了bug并需要报告这个bug才打开该选项Support for hot-pluggable devices支持热插拔设备,如usb与pc卡等,Udev也需要它Enable support for printk允许内核向终端打印字符信息,在需要诊断内核为什么不能运行时选择BUG() support显示故障和失败条件(BUG和WARN),禁用它将可能导致隐含的错误被忽略Enable ELF core dumps内存转储支持,可以帮助调试ELF格式的程序Enable full-sized data structures for core在内核中使用全尺寸的数据结构.禁用它将使得某些内核的数据结构减小以节约内存,但是将会降低性能Enable futex support快速用户空间互斥体可以使线程串行化以避免竞态条件,也提高了响应速度.禁用它将导致内核不能正确的运行基于glibc的程序Enable eventpoll support支持事件轮循的系统调用Use full shmem filesystem完全使用shmem来代替ramfs.shmem是基于共享内存的文件系统(可能用到swap),在启用TMPFS后可以挂载为tmpfs供用户空间使用,它比简单的ramfs先进许多Use full SLAB allocator使用SLAB完全取代SLOB进行内存分配,SLAB是一种优秀的内存分配管理器,推荐使用Enable VM event counters for /proc/vmstat允许在/proc/vmstat中包含虚拟内存事件记数器Loadable module support可加载模块支持Enable loadable module support打开可加载模块支持,如果打开它则必须通过"make modules_install"把内核模块安装在/lib/modules/中Module unloading允许卸载已经加载的模块Forced module unloading允许强制卸载正在使用中的模块(比较危险)Module versioning support允许使用其他内核版本的模块(可能会出问题)Source checksum for all modules为所有的模块校验源码,如果你不是自己编写内核模块就不需要它Automatic kernel module loading让内核通过运行modprobe来自动加载所需要的模块,比如可以自动解决模块的依赖关系Block layer块设备层Enable the block layer块设备支持,使用硬盘/USB/SCSI设备者必选Support for Large Block Devices仅在使用大于2TB的块设备时需要Support for tracing block io actions块队列IO跟踪支持,它允许用户查看在一个块设备队列上发生的所有事件,可以通过blktrace程序获得磁盘当前的详细统计数据Support for Large Single Files仅在可能使用大于2TB的文件时需要IO SchedulersIO调度器Anticipatory I/O scheduler假设一个块设备只有一个物理查找磁头(例如一个单独的SATA硬盘),将多个随机的小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量.适用于大多数环境,特别是写入较多的环境(比如文件服务器)Deadline I/O scheduler使用轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库)CFQ I/O scheduler使用QoS策略为所有任务分配等量的带宽,避免进程被饿死并实现了较低的延迟,可以认为是上述两种调度器的折中.适用于有大量进程的多用户系统Default I/O scheduler默认IO调度器Processor type and features中央处理器(CPU)类型及特性Symmetric multi-processing support对称多处理器支持,如果你有多个CPU或者使用的是多核CPU就选上.此时"Enhanced Real Time Clock Support"选项必须开启,"Advanced Power Management"选项必须关闭Subarchitecture Type处理器的子架构,大多数人都应当选择"PC-compatible"Processor family处理器系列,请按照你实际使用的CPU选择Generic x86 support通用x86支持,如果你的CPU能够在上述"Processor family"中找到就别选HPET Timer SupportHPET是替代8254芯片的新一代定时器,i686及以上级别的主板都支持,可以安全的选上Maximum number of CPUs支持的最大CPU数,每增加一个内核将增加8K体积SMT (Hyperthreading) scheduler support支持Intel的超线程(HT)技术Multi-core scheduler support针对多核CPU进行调度策略优化Preemption Model内核抢占模式No Forced Preemption (Server)适合服务器环境的禁止内核抢占Voluntary Kernel Preemption (Desktop)适合普通桌面环境的自愿内核抢占Preemptible Kernel (Low-Latency Desktop)适合运行实时程序的主动内核抢占Preempt The Big Kernel Lock可以抢占大内核锁,应用于实时要求高的场合,不适合服务器环境Machine Check Exception让CPU检测到系统故障时通知内核,以便内核采取相应的措施(如过热关机等)Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4每5秒检测一次这些cpu的非致命错误并纠正它们,同时记入日志check for P4 thermal throttling interrupt当P4的cpu过热时显示一条警告消息Enable VM86 support虚拟X86支持,在DOSEMU下运行16-bit程序或XFree86通过BIOS初始化某些显卡的时候才需要Toshiba Laptop supportToshiba笔记本模块支持Dell laptop supportDell笔记本模块支持Enable X86 board specific fixups for reboot修正某些旧x86主板的重起bug,这种主板基本绝种了/dev/cpu/microcode - Intel IA32 CPU microcode support使用不随Linux内核发行的IA32微代码,你必需有IA32微代码二进制文件,仅对Intel的CPU有效/dev/cpu/*/msr - Model-specific register support在多cpu系统中让特权CPU访问x86的MSR寄存器/dev/cpu/*/cpuid - CPU information support能从/dev/cpu/x/cpuid获得CPU的唯一标识符(CPUID)Firmware Drivers固件驱动程序BIOS Enhanced Disk Drive calls determine boot disk有些BIOS支持从某块特定的硬盘启动(如果BIOS不支持则可能无法启动),目前大多数BIOS还不支持BIOS update support for DELL systems via sysfs仅适用于DELL机器Dell Systems Management Base Driver仅适用于DELL机器High Memory Support最高内存支持,总内存小于等于1G的选"off",大于4G的选"64G"Memory split如果你不是绝对清楚自己在做什么,不要改动这个选项Memory model一般选"Flat Memory",其他选项涉及内存热插拔64 bit Memory and IO resources使用64位的内存和IO资源Allocate 3rd-level pagetables from highmem在内存很多(大于4G)的机器上将用户空间的页表放到高位内存区,以节约宝贵的低端内存Math emulation数学协处理器仿真,486DX以上的cpu就不要选它了MTRR (Memory Type Range Register) support打开它可以提升PCI/AGP总线上的显卡2倍以上的速度,并且可以修正某些BIOS错误Boot from EFI supportEFI是一种可代替传统BIOS的技术(目前的Grub/LILO尚不能识别它),但是现在远未普及Enable kernel irq balancing让内核将irq中断平均分配给多个CPU以进行负载均衡,但是要配合irqbanlance守护进程才行Use register arguments使用"-mregparm=3"参数编译内核,将前3个参数以寄存器方式进行参数调用,可以生成更紧凑和高效的代码Enable seccomp to safely compute untrusted bytecode只有嵌入式系统可以不选Timer frequency内核时钟频率,桌面推荐"1000 HZ",服务器推荐"100 HZ"或"250 HZ"kexec system call提供kexec系统调用,可以不必重启而切换到另一个内核kernel crash dumps被kexec启动后产生内核崩溃转储Physical address where the kernel is loaded内核加载的物理地址,除非你知道自己在做什么,否则不要修改.在提供kexec系统调用的情况下可能要修改它Support for hot-pluggable CPUs对热插拔CPU提供支持Compat VDSO support如果Glibc版本大于等于2.3.3就不选,否则就选上Power management options电源管理选项Power Management support电源管理有APM和ACPI两种标准且不能同时使用.即使关闭该选项,X86上运行的Linux也会在空闲时发出HLT指令将CPU进入睡眠状态Legacy Power Management API传统的电源管理API,比如软关机和系统休眠等接口Power Management Debug Support仅供调试使用Driver model /sys/devices/.../power/state files内核帮助文档反对使用该选项,即将被废除ACPI (Advanced Configuration and Power Interface) Support必须运行acpid守护程序ACPI才能起作用.ACPI是为了取代APM而设计的,因此应该尽量使用ACPI而不是APM AC Adapter如果你的系统可以在AC和电池之间转换就可以选Battery通过/proc/acpi/battery向用户提供电池状态信息,用电池的笔记本可以选Button守护程序捕获Power,Sleep,Lid按钮事件,并根据/proc/acpi/event做相应的动作,软件控制的poweroff需要它Video仅对集成在主板上的显卡提供ACPI2.0支持,且不是所有集成显卡都支持Generic Hotkey统一的热键驱动,建议不选Fan允许通过用户层的程序来对系统风扇进行控制(开,关,查询状态),支持它的硬件并不多Dock支持由ACPI控制的集线器(docking stations)Processor让ACPI处理空闲状态,并使用ACPI C2和C3处理器状态在空闲时节省电能,同时它还被cpufreq的"Performance-state drivers"选项所依赖Thermal Zone系统温度过高时可以利用ACPI thermal zone及时调整工作状态以避免你的CPU被烧毁ASUS/Medion Laptop ExtrasASUS笔记本专用,以提供额外按钮的支持,用户可以通过/proc/acpi/asus来打开或者关闭LCD的背光/调整亮度/定制LED的闪烁指示等功能IBM ThinkPad Laptop ExtrasIBM ThinkPad专用Toshiba Laptop ExtrasToshiba笔记本专用Disable ACPI for systems before Jan 1st this year输入四位数的年份,在该年的1月1日前不使用ACPI的功能("0"表示一直使用)Debug Statements详细的ACPI调试信息,不搞开发就别选Power Management Timer Support这个Timer在所有ACPI兼容的平台上都可用,且不会受PM功能的影响,建议总是启用它.如果你在kernel log中看到了'many lost ticks'那就必须启用它ACPI0004,PNP0A05 and PNP0A06 Container Driver支持内存和CPU的热插拔Smart Battery System支持依赖于I2C的"智能电池".这种电池非常老旧且罕见,还与当前的ACPI标准兼容性差APM (Advanced Power Management) BIOS SupportAPM在SMP机器上必须关闭,一般来说当前的笔记本都支持ACPI,所以应尽量关闭该该选项Ignore USER SUSPEND只有NEC Versa M系列的笔记本才需要选择这一项Enable PM at boot time系统启动时即启用APM,选上这个选项能让系统自动的进行电源管理,但常常导致启动时死机Make CPU Idle calls when idle系统空闲时调用空闲指令(halt),只有老式的CPU才需要选它,且对于SMP系统必须关闭Enable console blanking using APM在屏幕空白时关闭LCD背光,事实上对所有的笔记本都无效RTC stores time in GMT将硬件时钟应该设为格林威治时间,否则视为本地时间.建议你使用GMT,这样你无须为时区的改变而担心Allow interrupts during APM BIOS calls允许APM的BIOS调用时中断,IBM Thinkpad的一些新机器需要这项.如果休眠时挂机(包括睡下去就醒不来),可以试试它Use real mode APM BIOS call to power off此驱动为某些有Bug的BIOS准备,如果你的系统不能正常关机或关机时崩溃,可以试试它CPU Frequency scaling允许动态改变CPU主频,达到省电和降温的目的,必须同时启用下面的一种governor才行Enable CPUfreq debugging允许对CPUfreq进行调试CPU frequency translation statistics通过sysfs文件系统输出CPU频率变换的统计信息CPU frequency translation statistics details输出详细的CPU频率变换统计信息Default CPUFreq governor默认的CPU频率调节器'performance' governor'性能'优先,静态的将频率设置为cpu支持的最高频率'powersave' governor'节能'优先,静态的将频率设置为cpu支持的最低频率'userspace' governor for userspace frequency scaling既允许手动调整cpu频率,也允许用户空间的程序动态的调整cpu频率(需要额外的调频软件,比如cpufreqd)'ondemand' cpufreq policy governor'立即响应',周期性的考察CPU负载并自动的动态调整cpu频率(不需要额外的调频软件),适合台式机'conservative' cpufreq governor'保守',和'ondemand'相似,但是频率的升降是渐变式的(幅度不会很大),更适合用于笔记本/PDA/AMD64环境ACPI Processor P-States driver将ACPI2.0的处理器性能状态报告给CPUFreq processor drivers以决定如何调整频率,该选项依赖于ACPI->Processor{省略的部分请按照自己实际使用的CPU选择}/proc/acpi/processor/../performance interface内核帮助文档反对使用该选项,即将被废除Relaxed speedstep capability checks放松对系统的speedstep兼容性检查,仅在某些老旧的Intel系统上需要打开Bus options (PCI, PCMCIA, EISA, MCA, ISA)总线选项PCI supportPCI支持,如果使用了PCI或PCI Express设备就必选PCI access modePCI访问模式,强列建议选"Any"(系统将优先使用"MMConfig",然后使用"BIOS",最后使用"Direct"检测PCI设备) PCI Express supportPCI Express支持(目前主要用于显卡和千兆网卡)PCI Express Hotplug driver如果你的主板和设备都支持PCI Express热插拔就可以选上Use polling mechanism for hot-plug events对热插拔事件采用轮询机制,仅用于测试目的Root Port Advanced Error Reporting support由PCI Express AER驱动程序处理发送到Root Port的错误信息Message Signaled Interrupts (MSI and MSI-X)PCI Express支持两类中断:INTx使用传统的IRQ中断,可以与现行的PCI总线的驱动程序和操作系统兼容;MSI则是通过inbound Memory Write触发和发送中断,更适合多CPU系统.可以使用"pci=nomsi"内核引导参数关闭MSI PCI Debugging将PCI调试信息输出到系统日志里Interrupts on hypertransport devices允许本地的hypertransport设备使用中断ISA support现在基本上没有ISA的设备了,如果你有就选吧MCA support微通道总线,老旧的IBM的台式机和笔记本上可能会有这种总线NatSemi SCx200 support在使用AMD Geode处理器的机器上才可能有PCCARD (PCMCIA/CardBus) supportPCMCIA卡(主要用于笔记本)支持Enable PCCARD debugging仅供调试16-bit PCMCIA support一些老的PCMCIA卡使用16位的CardBus32-bit CardBus support当前的PCMCIA卡基本上都是32位的CardBusCardBus yenta-compatible bridge support使用PCMCIA卡的基本上都需要选择这一项,子项请按照自己实际使用的PCMCIA卡选择{省略的部分请按照自己实际使用的PCMCIA卡选择}PCI Hotplug SupportPCI热插拔支持,如果你有这样的设备就到子项中去选吧Executable file formats可执行文件格式Kernel support for ELF binariesELF是开放平台下最常用的二进制文件格式,支持动态连接,支持不同的硬件平台.除非你知道自己在做什么,否则必选Kernel support for a.out and ECOFF binaries早期UNIX系统的可执行文件格式,目前已经被ELF格式取代Kernel support for MISC binaries允许插入二进制的封装层到内核中,使用Java,.NET,Python,Lisp等语言编写的程序时需要它Networking网络Networking options网络选项Network packet debugging在调试不合格的包时加上额外的附加信息,但在遇到Dos攻击时你可能会被日志淹没Packet socket这种Socket可以让应用程序(比如tcpdump,iptables)直接与网络设备通讯,而不通过内核中的其它中介协议Packet socket: mmapped IO让Packet socket驱动程序使用IO映射机制以使连接速度更快Unix domain sockets一种仅运行于本机上的效率高于TCP/IP的Socket,简称Unix socket.许多程序都使用它在操作系统内部进行进程间通信(IPC),比如X Window和syslogTransformation user configuration interface为IPsec(可在ip层加密)之类的工具提供XFRM用户配置接口支持Transformation sub policy supportXFRM子策略支持,仅供开发者使用PF_KEY sockets用于可信任的密钥管理程序和操作系统内核内部的密钥管理进行通信,IPsec依赖于它TCP/IP networkingTCP/IP协议当然要选IP: multicasting群组广播,似乎与网格计算有关,仅在使用MBONE的时候才需要IP: advanced router高级路由,如果想做一个路由器就选吧IP: policy routing策略路由IP: equal cost multipath用于路由的基于目的地址的负载均衡IP: verbose route monitoring显示冗余的路由监控信息IP: kernel level autoconfiguration在内核启动时自动配置ip地址/路由表等,需要从网络启动的无盘工作站才需要这个东西IP: tunnelingIP隧道,将一个IP报文封装在另一个IP报文内的技术IP: GRE tunnels over IP基于IP的GRE(通用路由封装)隧道IP: multicast routing多重传播路由IP: ARP daemon support这东西尚处于试验阶段就已经被废弃了IP: TCP syncookie support抵抗SYN flood攻击的好东西,要启用它必须同时启用/proc文件系统和"Sysctl support",然后在系统启动并挂载了/proc之后执行"echo 1 >/proc/sys/net/ipv4/tcp_syncookies"命令IP: AH transformationIPsec验证头(AH)实现了数据发送方的验证处理,可确保数据既对于未经验证的站点不可用也不能在路由过程中更改IP: ESP transformationIPsec封闭安全负载(ESP)实现了发送方的验证处理和数据加密处理,用以确保数据不会被拦截/查看或复制IP: IPComp transformationIPComp(IP静荷载压缩协议),用于支持IPsecIP: IPsec transport modeIPsec传输模式,常用于对等通信,用以提供内网安全.数据包经过了加密但IP头没有加密,因此任何标准设备或软件都可查看和使用IP头IP: IPsec tunnel modeIPsec隧道模式,用于提供外网安全(包括虚拟专用网络).整个数据包(数据头和负载)都已经过加密处理且分配有新的ESP头/IP头和验证尾,从而能够隐藏受保护站点的拓扑结构IP: IPsec BEET modeIPsec BEET模式INET: socket monitoring interfacesocket监视接口,一些Linux本地工具(如:包含ss的iproute2)需要使用它TCP: advanced congestion control高级拥塞控制,如果没有特殊需求(比如无线网络)就别选了,内核会自动将默认的拥塞控制设为"Cubic"并将"Reno"作为候补IP: Virtual Server ConfigurationIP虚拟服务器允许你基于多台物理机器构建一台高性能的虚拟服务器,不玩集群就别选了The IPv6 protocol你要是需要IPv6就选吧NetLabel subsystem supportNetLabel子系统为诸如CIPSO与RIPSO之类能够在分组信息上添加标签的协议提供支持,如果你看不懂就别选了Security Marking对网络包进行安全标记,类似于nfmark,但主要是为安全目的而设计,如果你不明白的话就别选Network packet filtering (replaces ipchains)Netfilter可以对数据包进行过滤和修改,可以作为防火墙("packet filter"或"proxy-based")或网关(NAT)或代理(proxy)或网桥使用.选中此选项后必须将"Fast switching"关闭,否则将前功尽弃Network packet filtering debugging仅供开发者调试Netfilter使用Bridged IP/ARP packets filtering如果你希望使用一个针对桥接的防火墙就打开它Core Netfilter Configuration核心Netfilter配置(当包流过Chain时如果match某个规则那么将由该规则的target来处理,否则将由同一个Chain 中的下一个规则进行匹配,若不match所有规则那么最终将由该Chain的policy进行处理)Netfilter netlink interface允许Netfilter在与用户空间通信时使用新的netlink接口.netlink Socket是Linux用户态与内核态交流的主要方法之一,且越来越被重视.Netfilter NFQUEUE over NFNETLINK interface通过NFNETLINK接口对包进行排队Netfilter LOG over NFNETLINK interface通过NFNETLINK接口对包记录.该选项废弃了ipt_ULOG和ebg_ulog机制,并打算在将来废弃基于syslog的ipt_LOG和ip6t_LOG模块Layer 3 Independent Connection tracking独立于第三层的链接跟踪,通过广义化的ip_conntrack支持其它非IP协议的第三层协议Netfilter Xtables support如果你打算使用ip_tables,ip6_tables,arp_tables之一就必须选上"CLASSIFY" target support允许为包设置优先级,一些排队规则(atm,cbq,dsmark,pfifo_fast,htb,prio)需要使用它"CONNMARK" target support类似于"MARK",但影响的是连接标记的值"DSCP" target support允许对ip包头部的DSCP(Differentiated Services Codepoint)字段进行修改,该字段常用于Qos"MARK" target support允许对包进行标记(通常配合ip命令使用),这样就可以改变路由策略或者被其它子系统用来改变其行为"NFQUEUE" target Support用于替代老旧的QUEUE(iptables内建的target之一),因为NFQUEUE能支持最多65535个队列,而QUEUE只能支持一个"NOTRACK" target support允许规则指定哪些包不进入链接跟踪/NAT子系统"SECMARK" target support允许对包进行安全标记,用于安全子系统"CONNSECMARK" target support针对链接进行安全标记,同时还会将连接上的标记还原到包上(如果链接中的包尚未进行安全标记),通常与SECMARK target联合使用"comment" match support允许你在iptables规则集中加入注释"connbytes" per-connection counter match support允许针对单个连接内部每个方向(进/出)匹配已经传送的字节数/包数"connmark" connection mark match support允许针对每个会话匹配先前由"CONNMARK"设置的标记值"conntrack" connection tracking match support连接跟踪匹配,是"state"的超集,它允许额外的链接跟踪信息,在需要设置一些复杂的规则(比如网关)时很有用"DCCP" protocol match supportDCCP是打算取代UDP的新传输协议,它在UDP的基础上增加了流控和拥塞控制机制,面向实时业务"DSCP" match support允许对IP包头的DSCP字段进行匹配"ESP" match support允许对IPSec包中的ESP头进行匹配,使用IPsec的话就选上吧"helper" match support加载特定协议的连接跟踪辅助模块,由该模块过滤所跟踪的连接类型的包,比如ip_conntrack_ftp模块"length" match support允许对包的长度进行匹配"limit" match support允许根据包的进出速率进行规则匹配,常和"LOG target"配合使用以抵抗某些Dos攻击"mac" address match support允许根据以太网的MAC进行匹配,常用于无线网络环境"mark" match support允许对先前由"MARK"标记的特定标记值进行匹配IPsec "policy" match support使用IPsec就选上吧Multiple port match support允许对TCP或UDP包同时匹配多个端口(通常情况下只能匹配一个端口)"physdev" match support允许对到达的或将要离开的物理桥端口进行匹配"pkttype" packet type match support允许对封包目的地址类别(广播/群播/直播)进行匹配"quota" match support允许对总字节数的限额值进行匹配"realm" match support允许对iptables中的路由子系统中的realm值进行匹配"sctp" protocol match support流控制传输协议(SCTP),十年以后也许能够普及的东西"state" match support这是对包进行分类的有力工具,它允许利用连接跟踪信息对连接中处于特定状态的包进行匹配"statistic" match support允许根据一个给定的百分率对包进行周期性的或随机性的匹配"string" match support允许根据包所承载的数据中包含的特定字符串进行匹配"tcpmss" match support允许根据TCP SYN包头中的MSS(最大分段长度)选项的值进行匹配IP: Netfilter Configuration针对IPv4的Netfilter配置Connection tracking (required for masq/NAT)链接跟踪.可用于报文伪装或地址转换,也可用于增强包过滤能力Connection tracking flow accounting允许针对每个连接记录已经传送的字节/包数,常用于connbytes matchConnection mark tracking support允许对连接进行标记,与针对单独的包进行标记的不同之处在于它是针对连接流的.CONNMARK target和connmark match需要它的支持Connection tracking security mark support允许对连接进行安全标记,通常这些标记包(SECMARK)复制到其所属连接(CONNSECMARK),再从连接复制到其关联的包(SECMARK)Connection tracking events连接跟踪事件支持.如果启用这个选项,连接跟踪代码将提供一个notifier链,它可以被其它内核代码用来获知连接跟踪状态的改变Connection tracking netlink interface支持基于netlink的用户空间接口SCTP protocol connection tracking supportSCTP是IP网面向多媒体通信的新一代的流控制传输协议FTP protocol supportFTP协议IRC protocol supportIRC协议是一种用来实时聊天协议,用过mIRC的人应当不陌生NetBIOS name service protocol supportNetBIOS名字服务协议TFTP protocol supportTFTP是基于UDP的比FTP简单的文件传输协议Amanda backup protocol supportAmanda备份协议PPTP protocol support点对点隧道协议(PPTP)是一种支持多协议虚拟专用网络的网络技术,ADSL用户对它应该很熟悉H.323 protocol supportITU-T提出的用于IP电话的协议SIP protocol supportIETE提出的用于IP电话的协议IP Userspace queueing via NETLINK已废弃IP tables support (required for filtering/masq/NAT)要用iptables就肯定要选上IP range match support允许对ip地址的范围进行匹配TOS match support允许对ip包头的TOS(Type Of Service)字段进行匹配recent match support可以创建一个或多个刚刚使用过的ip地址列表,然后根据这些列表进行匹配ECN match support允许对TCP/IP包头的ECN(Explicit Congestion Notification)字段进行匹配.ECN是一种显式拥塞通知技术,它不但要求路由器支持而且要求端到端主机的支持,其基本思想是当路由器发生早期拥塞时不是丢弃包而是尽量对包进行标记,接收方接到带有ECN提示的包时,通知发送方网络即将发生拥塞,也就是它通过对包的标记提示TCP源即将发生拥塞,从而引发拥塞避免算法AH match support允许对IPSec包头的AH字段进行匹配TTL match support允许对ip包头的TTL(生存期)字段进行匹配Owner match support允许对本地生成的包按照其宿主(user,group,process,session)进行匹配address type match support。

linuxkconfig详解及语法

linuxkconfig详解及语法

linuxkconfig详解及语法Linux 入门基础 Linux系统安装GNOME图形界面基...默认值显示给用户,并可以让用户进行修改。

默认值的依赖关系可以用 "if" 添加。

(可选项)依赖关系:"depends on"/"requires" <expr> 为一菜单选项定义依赖关系。

如果定义了多个依赖关系,它们之间用 '&&' 间隔。

依赖关系也可以应用到该菜单中所有的其它选项(同样接受if表达式),所以下面的两个例子是等价的:bool "foo" if BAR default y if BARdepends on BAR bool "foo" default y- 反向依赖关系:"select" <symbol> ["if" <expr>]尽管普通的依赖关系可以降低一选项的上限,反向依赖能将这一限制降的更低。

当前菜单选项的值是symbol的最小值。

如果symbol被选择了多次,上限就是其中的最大值。

反向依赖只能用在boolean或tristate选项上。

- 数据范围:"range" <symbol><symbol> ["if" <expr>]为int和hex类型的选项设置可以接受输入值范围。

用户只能输入大于等于第一个symbol,小于等于第二个 symbol的值。

- 帮助信息: "help" or "---help---" 定义一帮助信息。

帮助信息的结束就由缩进的水平决定的,这也就意味着信息是在第一个比帮助信息开始行的缩进小的行结束。

"---help---" 和"help" 在实现的作用上没有区别,"---help---" 有助于将文件中的配置逻辑与给开发人员的提示分开。

Kconfig配置文件编码规则

Kconfig配置文件编码规则

Kconfig配置⽂件编码规则 最早接触到Kconfig是在u-boot的移植过程中。

所今天来好好学习⼀下如何编写⼀个符合Kconffigde 配置⽂件。

Kbuild或者是Kconfig的中⽂翻译意思是内核配置/构建系统。

他最早出⾃哪⾥我不太清楚,但是Linux内核上的应⽤渐渐的增加了他的曝光度也让我见识到了。

他的基本思路就是编辑⼀些配置字段,其中处理了各个配置之间的依赖和互斥等逻辑从⽽为⼀个复杂庞⼤的软件系统源码移植裁剪提供了优秀的配置⼯具,主要分为⽆界⾯版本和有界⾯的。

使⽤⽅式⽆界⾯的现在常常被⽤来使⽤提供好的配置⽂件⽣成符合源码依赖关系的配置⽂件,⽽图形配置界⾯才是常常使⽤来进⾏配置裁剪源码系统的⼯具。

图形化界⾯是靠读取指定的Kconfig⽂件进⾏显⽰渲染和配置并最后⽣成对应的配置⽂件,所以这⾥来学习记录⼀下Kconfig⽂件的编码规则。

configKconfig⽤config 定义⼀个配置项编码形式如下:config XXXtypeselect xxxdepends on xxx || xxxdefaultrangeprompthelpXXX为这个配置名称,在整个配置系统中唯⼀,如果在多个地⽅定义这个配置项,实际上配置⼯具会⾃动统⼀不同地⽅的同名配置的值为同⼀个,所以最好避免这类使⽤⽅式。

可以说config定义的配置项时整个kbuild的⼀个最⼩配置单元。

这⾥配置项⽬地下的具体内容描述如下:typebool只有y和n,其后可以跟输⼊提⽰,如果没有则图形配置界⾯上将不会显⽰出当前配置项。

int整形数,输⼊提⽰同上bool;hex⼗六进制数,输⼊提⽰同上bool;和int的区别就是输⼊数字时⽣成的内容会⾃动添加0x在前⾯string字符串,输⼊提⽰同上bool;tristateLinux源码构建特有的配置类型,输⼊提⽰同上bool;他的可取值⽐bool多了⼀个m,但是有时候不⼀定⽀持m值所以这个类型就和bool相同了。

kconfig语法详解

kconfig语法详解

kconfig语法详解Kconfig是一种用于配置Linux内核构建的配置语言。

通过使用Kconfig,开发者可以定制Linux内核的构建选项,编译所需的功能和驱动程序,并定制适合自己需求的内核映像。

本文将详细介绍Kconfig的语法和用法。

1. 声明配置选项在Kconfig中,配置选项由一系列变量和属性组成。

首先,我们使用"config"关键字声明一个配置选项的名称:config EXAMPLE_OPTION然后,我们可以使用属性来描述这个配置选项。

例如,我们可以为这个选项指定一个字符串类型的默认值:default "example value"2. 依赖关系Kconfig允许配置选项之间建立依赖关系。

通过使用"depends on"语句,我们可以指定其他选项作为当前选项的依赖项。

例如,我们可以指定一个选项仅在另一个选项被选中时才可用:depends on ANOTHER_OPTION或者我们可以指定一个选项在另一个选项未被选中时才可用:depends on !ANOTHER_OPTION3. 条件语句Kconfig还支持使用条件语句来根据特定条件来选择不同的配置选项。

使用"if"语句,我们可以根据一个或多个条件来决定一个选项是否可用:if CONDITIONconfig OPTION_A...例如,我们可以指定一个选项仅在某个架构上可用:if ARCH_X86config X86_OPTION...4. 菜单Kconfig中的配置选项通常以菜单的形式组织起来,以便更好地对选项进行分类和查看。

使用"menu"关键字,我们可以创建一个菜单:menu "Example Menu"config OPTION_1...config OPTION_2...endmenu菜单可以嵌套,允许我们创建多级菜单结构。

Makefile&&Kconfig

Makefile&&Kconfig

有了gcc 编译器下面我们就可以来编译我们的内核了,内核的下载地址是从这里来下载我们所想要的内核,我们现在用的是linux-2.6.18 内核。

Linux2.6内核新特性Linux内核吸收了一些新技术,在性能、可量测性、支持和可用性方面不断提高。

这些改进多数是添加支持更多的体系结构、处理器、总线、接口和设备;也有一些标准化内部接口,简化扩展添加新设备和子系统的支持。

与Linux2.4版本相比,Linux 2.6 版本具有许多新特性,内核也有很大修改。

其中一些修改只跟内核或者驱动开者有关,另外一些修改则会影响到系统启动系统管理和应用程序开发。

Linux 2.6 内核重要的新特性如下:(1) 新的调度器: O(1)(2) 内核抢占(3) 新的线程模型(4) 文件系统:access controls , ext2/ext3(5) 声音:ALSA(6) 总线:IDE,SCSI(7) 电源管理(8) 网络(9) 用户界面层(10) 统一的设备模型在 Linux 上我们可以用以下命令来下载内核。

[root@binnary ~]#wget –c/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2 [root@binnary ~]#wget –c/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2.sign 新版本的内核分分两种:一种是完整源码版本(我们直接解压就可以使用)另一种是patch文件[root@binnary ~]#cd linux-2.6.18[root@binnary linux-2.6.18]#bzcat ../patch-2.6.14.bz2 | patch –p1patch命令可以根据补丁文件内容修订文件内容修改指定目录下的文件。

patch –p<n> < diff_filecat diff_file | patch –p<n>bzcat diff_file.bz2 | patch –p<n>zcat diff_file.gz | patch –p<n>其中,<n> 代表按照patch文件的路径忽略的目录级数,每个 ” / ” 代表一级。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

linux内核中Kconfig文档的作用以及Kconfig的语法2.6内核的源码树目录下一般都会有两个文文:Kconfig 和Makefile。

分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。

在内核配置make menuconfig(或xconfig等)时,从Kconfig中读出配置菜单,用户配置完后保存到.config(在顶层目录下生成)中。

在内核编译时,主Makefile调用这个.config,就知道了用户对内核的配置情况。

上面的内容说明:Kconfig就是对应着内核的配置菜单。

假如要想添加新的驱动到内核的源码中,可以通过修改Kconfig来增加对我们驱动的配置菜单,这样就有途径选择我们的驱动,假如想使这个驱动被编译,还要修改该驱动所在目录下的Makefile。

因此,一般添加新的驱动时需要修改的文件有两种(注意不只是两个)*Kconfig*Makefile要想知道怎么修改这两种文件,就要知道两种文档的语法结构。

First: Kconfig每个菜单项都有一个关键字标识,最常见的就是config。

语法:configsymboloptions&lt;!--[if !supportLineBreakNewLine]--&gt;&lt ;!--[endif]--&gt;symbol就是新的菜单项,options是在这个新的菜单项下的属性和选项其中options部分有:1、类型定义:每个config菜单项都要有类型定义,bool:布尔类型,tristate三态:内建、模块、移除,string:字符串,hex:十六进制,integer:整型例如config HELLO_MODULEbool "hello test module"bool类型的只能选中或不选中,tristate类型的菜单项多了编译成内核模块的选项,假如选择编译成内核模块,则会在.config中生成一个CONFIG_HELLO_MODULE=m的配置,假如选择内建,就是直接编译成内核影响,就会在.config中生成一个CONFIG_HELLO_MODULE=y的配置.2、依赖型定义depends on或requires指此菜单的出现是否依赖于另一个定义config HELLO_MODULEbool "hello test module"depends on ARCH_PXA 这个例子表明HELLO_MODULE这个菜单项只对XScale处理器有效,即只有在选择了ARCH_PXA,该菜单才可见(可配置)。

3、帮助性定义只是增加帮助用关键字help或---help---&lt;!--[if !supportLineBreakNewLine]--&gt;&lt;!--[en dif]--&gt;更多详细的Kconfigconfig语法可参考:Second: 内核的Makefile内核的Makefile分为5个组成部分:Makefile 最顶层的Makefile.config 内核的当前配置文档,编译时成为顶层Makefile的一部分arch/$(ARCH)/Makefile 和体系结构相关的Makefiles/ Makefile.* 一些Makefile的通用规则kbuild Makefile 各级目录下的大概约500个文档,编译时根据上层Makefile传下来的宏定义和其他编译规则,将源代码编译成模块或编入内核。

顶层的Makefile文档读取 .config文档的内容,并总体上负责build内核和模块。

Arch Makefile则提供补充体系结构相关的信息。

s目录下的Makefile文档包含了任何用来根据kbuild Makefile 构建内核所需的定义和规则。

(其中.config的内容是在make menuconfig的时候,通过Kconfig文档配置的结果)在linux2.6.x/Documentation/kbuild目录下有详细的介绍有关kernel makefile的知识。

最后举个例子:假设想把自己写的一个flash的驱动程式加载到工程中,而且能够通过menuconfig配置内核时选择该驱动该怎么办呢?能够分三步:第一:将您写的flashtest.c 文档添加到/driver/mtd/maps/ 目录下。

第二:修改/driver/mtd/maps目录下的kconfig文档:config MTD_flashtesttristate &#8220;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 加入到内核中。

即可达到您的目的。

2.6内核的源码树目录下一般都会有两个文文:Kconfig和Makefile。

分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。

在内核配置make menuconfig(或xconfig等)时,从Kconfig中读出配置菜单,用户配置完后保存到.config(在顶层目录下生成)中。

在内核编译时,主Makefile调用这个.config,就知道了用户对内核的配置情况。

上面的内容说明:Kconfig就是对应着内核的配置菜单。

假如要想添加新的驱动到内核的源码中,可以通过修改Kconfig来增加对我们驱动的配置菜单,这样就有途径选择我们的驱动,假如想使这个驱动被编译,还要修改该驱动所在目录下的Makefile。

因此,一般添加新的驱动时需要修改的文件有两种(注意不只是两个)*Kconfig*Makefile要想知道怎么修改这两种文件,就要知道两种文档的语法结构。

First: Kconfig每个菜单项都有一个关键字标识,最常见的就是config。

语法:configsymboloptions&lt;!--[if !supportLineBreakNewLine]--&gt;&lt ;!--[endif]--&gt;symbol就是新的菜单项,options是在这个新的菜单项下的属性和选项其中options部分有:1、类型定义:每个config菜单项都要有类型定义,bool:布尔类型,tristate 三态:内建、模块、移除,string:字符串,hex:十六进制,integer:整型例如config HELLO_MODULEbool "hello test module"bool类型的只能选中或不选中,tristate类型的菜单项多了编译成内核模块的选项,假如选择编译成内核模块,则会在.config中生成一个CONFIG_HELLO_MODULE=m的配置,假如选择内建,就是直接编译成内核影响,就会在.config中生成一个CONFIG_HELLO_MODULE=y的配置.2、依赖型定义depends on或requires指此菜单的出现是否依赖于另一个定义config HELLO_MODULEbool "hello test module"depends on ARCH_PXA 这个例子表明HELLO_MODULE这个菜单项只对XScale处理器有效,即只有在选择了ARCH_PXA,该菜单才可见(可配置)。

3、帮助性定义只是增加帮助用关键字help或---help---&lt;!--[if !supportLineBreakNewLine]--&gt;&lt;!--[en dif]--&gt;更多详细的Kconfigconfig语法可参考:Second: 内核的Makefile内核的Makefile分为5个组成部分:Makefile 最顶层的Makefile.config 内核的当前配置文档,编译时成为顶层Makefile的一部分arch/$(ARCH)/Makefile 和体系结构相关的Makefiles/ Makefile.* 一些Makefile的通用规则kbuild Makefile 各级目录下的大概约500个文档,编译时根据上层Makefile传下来的宏定义和其他编译规则,将源代码编译成模块或编入内核。

顶层的Makefile文档读取 .config文档的内容,并总体上负责build内核和模块。

Arch Makefile则提供补充体系结构相关的信息。

s目录下的Makefile文档包含了任何用来根据kbuild Makefile 构建内核所需的定义和规则。

(其中.config的内容是在make menuconfig的时候,通过Kconfig文档配置的结果)在linux2.6.x/Documentation/kbuild目录下有详细的介绍有关kernel makefile的知识。

最后举个例子:假设想把自己写的一个flash的驱动程式加载到工程中,而且能够通过menuconfig配置内核时选择该驱动该怎么办呢?能够分三步:第一:将您写的flashtest.c 文档添加到/driver/mtd/maps/ 目录下。

第二:修改/driver/mtd/maps目录下的kconfig文档:config MTD_flashtesttristate &#8220;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 加入到内核中。

相关文档
最新文档