编译选项翻译
编译原理6-4.2-4.3- 自顶向下翻译-递归下降翻译

对于自顶向下分析, 对于自顶向下分析,我们假定动作是在处于相同位 置上的符号被展开 匹配成功)时执行的。 被展开( 置上的符号被展开(匹配成功)时执行的。
E T.val=9 num.val=9 R.i=9 - T.val=5 num.val=5 + R.i=4 T.val=2 R.i= 6 ε
num.val=2
图6.15
计算表达式 9 – 5 + 2
下面我们把转换左递归翻译模式的方法推广到一 以便进行自顶向下分析。 般,以便进行自顶向下分析。 假设我们有下面的翻译模式, 假设我们有下面的翻译模式,它的每个文法符号 都有一个综合属性,用小写字母表示, 和 是任 都有一个综合属性,用小写字母表示,g和f是任 意函数。 意函数。
procedure R; begin if sym = addop then begin advance; T; R end else begin /* 什么也不做 */ * end end; 产生式R 图6.19 产生式 → addop TR | ε 的分析过程
function R (in :↑ AST-node) :↑ AST-node; var nptr , i1, s1, s : ↑ AST-node; addoplexeme : char; begin if sym = addop then begin /* 产生式 R → addop T R */ nptr: T.nptr addoplexeme := lexval; i1: R1.i advance; s1: R1.s nptr := T; s: R.s i1 := mknode(addoplexme, in , nptr) ; s1 := R (i1); addoplexeme: s : = s1 addop (+|-) end else s := in; /* 产生式 R → ε */ return s end; 图6.20 递归下降构造抽象语法树
Linux下PHP5.6编译参数详解

Linux下PHP5.6编译参数详解Linux下编译PHP时选项参数相当多,今天下决心./configure --help > help.txt导出一份编译选项清单并翻译了,方便以后查阅.SAPI modules(PHP SAPI接口模块的选项):大部分与apache、nginx等web服务有关--with-aolserver=DIR AOLserver的安装路径--with-apxs=FILE 编译出apache1.x版本的共享模块所存放的路径--with-apache=DIR 编译出apache1.x版本的模块,这里设定为apa che软件根目录--enable-mod-charset 启用apache的mod_charset(俄文apache用的)--with-apxs2filter=FILE 编译apache2.0的共享过滤模块,这里设定为ap ache apxs工具的路径--with-apxs2=FILE 编译共享apache2.0处理程序的模块,这里设定为apache apxs工具的路径--with-apache-hooks=FILE共享的apache1.0的钩子模块,这里设定为apache apxs工具的路径--with-apache-hooks-static=DIR 这里设定为apache apxs工具的路径--disable-cli 禁用命令行模式(php-cli)--with-continuity=DIR 编译php为连续服务模块。
参数为安装Conti nuity Server的根目录--enable-embed=TYPE 建立内嵌的SAPI库。
参数为shared、static --enable-fpm 开启fpm模式(nginx等服务用的)--with-fpm-user=USER fpm运行的用户,默认为nobody--with-fpm-group=GRP fpm运行的组,默认为nobody--with-fpm-systemd 激活系统集成功能,开启后fpm可以上报给系统一些信息--with-fpm-acl 使用POSIX 访问控制列表,5.6.5版本起有效--with-isapi=DIR 为Zeus web服务器建立ISAPI模块--with-litespeed 编译PHP为litespeed模块--with-milter=DIR 编译PHP为Milter应用程序--with-nsapi=DIR 为Netscape/iPlanet/Sun Web服务器编译PH P为NSAPI模块--enable-phpdbg 编译开启phpdbg调试器--enable-phpdbg-debug 编译phpdbg调试器为debug模式--with-phttpd=DIR 编译PHP为phttpd模块--with-pi3web=DIR 编译PHP为pi3web模块--with-roxen=DIR 编译PHP为roxen模块--enable-roxen-zts 编译PHP为roxen模块,线程安全--with-thttpd=SRCDIR 编译PHP为thttpd模块--with-tux=MODULEDIR 编译PHP为tux模块--with-webjames=SRCDIR 编译PHP为webjames模块--disable-cgi 禁用cgiGeneral settings(综合设置):--enable-gcov 开启gcov支持(测试代码覆盖率功能,)--enable-debug Compile with debugging symbols--with-layout=TYPE Set how installed files will be laid out. Type canbe either PHP or GNU [PHP]--with-config-file-path=PATH php.ini文件位置[PREFIX/lib]--with-config-file-scan-dir=PATH 扫描配置文件的路径--enable-sigchild 使用PHP自带的SIGCHLD处理器--enable-libgcc 启用libgcc的精确链接--disable-short-tags 默认禁用短形式的<?作为php代码的开始标记--enable-dmalloc 启用dmalloc(dmalloc是Linux C编程侦测记忆体溢出工具)--disable-ipv6 关闭ipv6支持--enable-dtrace 开启DTrace(动态跟踪)支持--enable-fd-setsize 设置描述集的大小Extensions(扩展):Extensions:--with-EXTENSION=shared[,PATH]并非所有扩展都能编译成共享方式NOTE: Not all extensions can be build as 'shared'.给个例子,如何把扩展编译成共享模式:Example: --with-foobar=shared,/usr/local/foobar/o Builds the foobar extension as shared extension.o foobar package install prefix is /usr/local/foobar/--disable-all 关闭默认为启用的所有扩展功能--with-regex=TYPE 正则表达式库类型。
keil软件编译常见错误解释总结和中文翻译

Keil编译时出现错误和警告的总结和C 编译器错误信息中文翻译(1)L15重复调用***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?SPI_RECEIVE_WORD?D_SPICALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多个中断服务程序调用。
出现这种问题的原因之一是这个函数是不可重入性函数,当该函数运行时它可能会被一个中断打断,从而使得结果发生变化并可能会引起一些变量形式的冲突(即引起函数内一些数据的丢失,可重入性函数在任何时候都可以被ISR打断,一段时间后又可以运行,但是相应数据不会丢失)。
原因之二是用于局部变量和变量(暂且这样翻译,arguments,[自变量,变元一数值,用于确定程序或子程序的值])的内存区被其他函数的内存区所覆盖,如果该函数被中断,则它的内存区就会被使用,这将导致其他函数的内存冲突。
例如,第一个警告中函数WRITE_GMVLX1_REG 在D_GMVLX1.C 或者D_GMVLX1.A51被定义,它被一个中断服务程序或者一个调用了中断服务程序的函数调用了,调用它的函数是VSYNC_INTERRUPT,在MAIN.C中。
解决方法:如果你确定两个函数决不会在同一时间执行(该函数被主程序调用并且中断被禁止),并且该函数不占用内存(假设只使用寄存器),则你可以完全忽略这种警告。
如果该函数占用了内存,则应该使用连接器(linker)OVERLAY指令将函数从覆盖分析(overlay analysis)中除去,例如:OVERLAY (?PR?_WRITE_GMVLX1_REG?D_GMVLX1 ! *)上面的指令防止了该函数使用的内存区被其他函数覆盖。
如果该函数中调用了其他函数,而这些被调用在程序中其他地方也被调用,你可能会需要也将这些函数排除在覆盖分析(overlay analysis)之外。
编译原理 第5章语法制导的翻译

属性和文法符号相关联 规则和产生式相关联
根据需要,将文法符号和某些属性相关联, 并通过语义规则来描述如何计算属性的值
E→E1+T E.code=E1.code || T.code || ‘+’ code表示了我们关心的表达式的逆波兰表示,规则说明 加法表达式的逆波兰表示由两个分量的逆波兰表示并置, 然后加上‘+’得到。
digitlexval=3
18
适用于自顶向下分析的SDD
前面的表达式文法存在直接左递归,因 此无法直接用自顶向下方法处理。 消除左递归之后,无法直接使用属性val 进行处理:
比如规则:T→FT’ T’→*FT’ T对应的项中,第一个因子对应于F, 而运算符在T’中。
19
相同表达式的不同文法的比较
38
例5.15 分析栈实现的例子
假设语法分析栈存放在一个被称为stack 的记录数组中,下标top指向栈顶;
stack[top]指向这个栈的栈顶;stack[top-1] 指向栈顶下一个位置; 如果不同的文法符号有不同的属性集合,我 们可以使用union来保存这些属性值。(归 约时,我们知道栈顶向下的各个符号分别是 什么)
语义翻译的流程
输 入 符 号 串 分 析 树 依 赖 图
语
义
规
则
的 计
实际上,编译中语义翻译的实现并不是 按图中的流程处理的;而是随语法分析 的进展,识别出一个语法结构,就对它 的语义进行分析和翻译。
算
9
5.1 语法制导定义
4.什么是语法制导定义(SDD) 上下文无关文法和属性/规则的结合;
编程术语中英文翻译

candidate function 候选函式 候选函数
(在函式多载决议程序中出现的候选函式)
data 资料 数据
data member 资料成员、成员变数 数据成员、成员变量
data structure 资料结构 数据结构
binary tree 二元树 二叉树
binary operator 二元运算子 二元运算符
binding 系结 绑定
derived class 衍生类别 派生类
destructor(dtor) 解构式 析构函数、析构器
device 装置 设备
class body 类别本体 类体 ?
class declaration 类别宣告、类别宣告式 类声明
class definition 类别定义、类别定义式 类定义
class derivation list 类别衍化列 类继承列表
class head 类别表头 类头 ?
class hierarchy 类别继承体系 ?
bit 位元 位
bitwise 以 bit 为单元┅、位元逐一┅ ?
bitwise copy 以 bit 为单元进行复制、位元逐一复制 位拷贝
access function 存取函式 存取函数
address-of operator 取址运算子 & 取地址运算符
algorithm 演算法 算法
类别范本局部特制体、 类模板部分特化
类别范本局部特殊化
class template specializations
类别范本特制体、类别范本特殊化 类模板特化
enclosing class 外围类别(与巢状类别 num (enumeration) 列举(一种 C++ 资料型别) 枚举
linux下gcc编译选项

linux下gcc编译选项(1)c/c++编译过程编译⼀个.cpp⽂件时,经过处理、编译、汇编和链接 4 个步骤,⽣成⼀个可执⾏程序:gcc编译过程1. 预处理:将(include)的⽂件插⼊原⽂件中、将宏定义展开、根据条件编译命令选择要使⽤的代码2. 编译:将预处理得到的源代码⽂件,进⾏“翻译转换”,⽣成汇编代码(编译阶段要检查代码的规范性、是否有语法错误,如函数、变量是否被声明等)3. 汇编:将汇编代码翻译成了机器码,表现为⼆进制⽂件4. 链接:将汇编⽣成的.o⽂件及其他函数库⽂件链接起来,⽣成能在特定平台上运⾏的可执⾏程序(在链接程序时,链接器会在所有的⽬标⽂件中找寻函数的实现。
如果找不到,那到就会报链接错误码(LinkerError))(2)gcc编译选项1. 常⽤命令选项1 --version 查看gcc版本号2 -std 指定C或C++语⾔标准版本。
⽐如 -std=c89,-std=c99等是C语⾔的标准版本号。
-std=c++11,-std=c++14等就是C++语⾔的标准版本号3 -o 指定输出⽂件,如果没有-o,输出有可能直接到stdout,有可能到默认的a.out⽂件4 -E 只做pre-process,预编译,要使⽤-o指定输出⽂件,此时⽂件⼀般都⽤.i结尾5 -S(⼤写)编译到(assembly)汇编,使⽤-o指定输出⽂件,此时⽂件⼀般都⽤.s结尾;6 -c 只编译,不链接,⽤-o指定输出⽂件,此时⽂件⼀般⽤.o结尾7 -g 附加debug信息,在输出的.o和可执⾏⽂件中,有很多.debug段。
(compile for debugging)8 -static⽤静态链接的⽅式编译,默认是动态链接,静态链接⽣产的⽂件体积会很⼤9 -shared ⽣成.so动态链接库10 -fPIC ⼀般在创建.so动态链接库的时候,都要加上-fPIC参数。
11 -fPIC 作⽤于编译阶段,告诉编译器产⽣与位置⽆关代码(Position-Independent Code),则产⽣的代码中,没有绝对地址,全12部使⽤相对地址,故⽽代码可以被加载器加载到内存的任意位置,都可以正确的执⾏。
keil软件 C 编译器错误信息中文翻译
Structure or union syntax error
结构体或联合体语法错误
Structure size too large
结构体尺寸太大
Sub scripting missing ]
下标缺少右方括号
Superfluous & with function or
allowed
不允许转换近指针
Could not find file ``xxx``
找不到XXX 文件
Declaration missing ;
说明缺少";"
Declaration syntax error
说明中出现语法错误
Default outside of switch
Default 出现在switch 语句之外
array
函数或数组中有多余的"&"
Suspicious pointer conversion
可疑的指针转换
Symbol limit exceeded
符号超限
Too few parameters in call
函数调用时的实参少于函数的
参数不
Too many default cases
编译预处理ifdef 有语法错
Bit field too large
位字段太长
Call of non-function
调用未定义的函数
Call to function with no
prototype
调用函数时没有函数的说明
Cannot modify a const object
C 编译器错误信息中文翻译
枚举常数语法错误
Error directive :xxx
错误的编译预处理命令
Error writing output file
写输出文件错误
Expression syntax error
表达式语法错误
Extra parameter in call
调用时出现多余错误
无法建立输出文件xxx
Unable to open include file
``xxx``
无法打开被包含的文件xxx
Unable to open input file ``xxx``
无法打开输入文件xxx
Undefined label ``xxx``
没有定义的标号xxx
Unknown preprocessor
directive: ``xxx``
不认识的预处理命令xxx
Unreachable code
无路可达的代码
Unterminated string or
character constant
字符串缺少引号
User break
用户强行中断了程序
指针使用非法
Improper use of a
typedefsymbol
类型定义符号使用不恰当
In-line assembly not allowed
不允许使用行间汇编
Incompatible storage class
存储类别不相容
Incompatible type conversion
Too many type in declaration
说明中类型太多
ICCAVR编译器中文使用说明
ICCAVR编译器中⽂使⽤说明ImageCraft ICCAVR的中⽂使⽤说明翻译詹卫前⼀ 运⾏光盘上的SETUP.EXE程序进⾏安装a?òµ?µ打开光盘驱动器所对应的盘符c SETUP.EXE按照屏幕提⽰a?aê?在对话框中填⼊注意drive对应你的机器中的光盘驱动器盘符cè·?¨其余同⽅法⼀注意 按上述⽅法进⾏安装后对正式版⽤户还要进⾏第⼆步的注册在标准版中有⼀些功能限制代码的压缩2éòaù×¢2áa IDEb Unlock Diskc Help Importing a License from a Floppy Disk2¢?ò??DDµ¥?÷ ICCAVR软件⾃动进⾏注册当你确定并再次重新启动ICCAVR后对不是⾸次安装或使⽤时间已超过30天的⽤户 对这类⽤户在程序启动时已不能进⼊IDE环境你应该选择按钮 这时会出现⼀个注册对话框Importing a License froma Floppy Diskc Unlock Diskµ¥?÷é?ò?2??Dìáµ?µ?°′?¥ ICCAVR软件⾃动进⾏注册当你确定并再次重新启动ICCAVR后注意 软盘在注册时应打开写保护软盘成为⼀张空盘安装和注册 当你需要在不同的电脑中使⽤ICCAVR或在同⼀台电脑中将ICCAVR重新安装在与原来不同的⽬录位置时Help TransferringYour License to a Floppy Diskµ?×¢2át′??íµ?òèí?ìé?t ImageCraft 的ICCAVR介绍ImageCraft 的ICCAVR是⼀种使⽤符合ANSI标准的C语⾔来开发微控制器程序的⼀个⼯具ICCAVR是⼀个综合了编辑器和⼯程管理器的集成⼯作环境源⽂件全部被组织到⼯程之中编译错误显⽰在状态窗⼝中光标会⾃动跳转到编辑窗⼝中引起错误的那⼀⾏INTEL HEX格式⽂件可被⼤多数的编程器所⽀持ICCAVR是⼀个32位的程序出于篇幅考虑仅介绍使⽤ICC AVR所必须具备的知识应对C语⾔有了⼀定程度的理解ICCAVR中的⽂件类型及其扩展名⽂件类型是由它们的扩展名决定的输⼊⽂件这个⽂件保存由IDE所创建和修改的⼀个⼯程的有关信息它可以由⼏个库封装在⼀起如果库被引⽤您也可以创建或修改⼀个符合你需要的库.s 对应每个C语⾔源⽂件.o 由汇编⽂件汇编产⽣的⽬标⽂件.hex INTEL HEX格式⽂件.eep INTEL HEX格式⽂件.cof COFF 格式输出⽂件.lst 列表⽂件.mp 内存映象⽂件.cmd NoICE 2.xx 调试命令⽂件.dbg ImageCraft 调试命令⽂件3编译附注#pragma interrupt_handler : : ...这个附注必须在函数之前定义func2是中断操作函数并且保存和恢复函数所使⽤的全部寄存器#pragma ctask ...这个附注指定了函数不⽣成挥发寄存器来保存和恢复代码#pragma text:改变代码段名称#pragma data:改变数据段名称这个附注在分配全局变量⾄EEPROM 中时必须被使⽤#pragma abs_address:函数与全局数据不使⽤浮动定位这在访问中断向量和其它硬件项⽬时特别有⽤使⽬标程序使⽤正常浮动定位你可以在你的源代码中使⽤C ++的 // 类型的注释你可以使⽤0b<1|0>* 来指定⼆进制常数0b10101等于⼗进制数21áé2ú±à代码转换IAR或其它ANSI C编译系统的代码转换IAR C编译器作为应⽤于AVR的第⼀个C编译器当你从IAR 编译系统转换到ImageCraft编译系统时IAR C中IO寄存器的定义与ICCAVR也是相同的ICCAVR使⽤pragma附注描述中断操作函数interrupt关键字下⾯是⼀个对照#pragma interrupt_handler func:4// 4 是这个中断的向量号ICCAVR可以使多个中断向量共⽤⼀个中断处理函数interrupt [vector_name] func() // vector_name是某⼀个中断向量的名称以增加程序的可读性FLASH存贮器ICCAVR使⽤const关键字来达到相同的⽬的过程调⽤转换在两个编译系统之间函数参数传递使⽤的寄存器是不同的在线汇编IAR不⽀持在线汇编符号三起步⾃你启动IDE后进⼊\icc\examples.avr⽬录并且选择并打开⼯程然后从Project菜单中选择Options命令打开⼯程编译选项然后从Project菜单中选择Make Project命令并且在状态窗⼝中显⽰所有的信息在与源⽂件同⼀个⽬录中输出⼀个⽂件led.hex′ó?àêy?ü?§3?AVR MCU的编程器和模拟器都⽀持这种格式这样就完成了⼀个程序的构筑⽐如AVR Studioú±àò±êCOFF输出⽂件格式你也可使⽤⼯具条或⿏标右键弹出菜单你可以在⼯程窗⼝单击⿏标右键选择编译选项IDE将使⽤编辑器打开这个⽂件作为试验可设置⼀些错误IDE⾸先⾃动保存已经改变的⽂件这时在状态窗⼝中会显⽰错误信息或单击其左边的错误符号基本上所有C编译器都是这样开始⼀个新的⼯程从Project菜单中选择New命令输出⽂件的名称取决于你的⼯程⽂件名称如果你创建⼀个名称为foo.prj的⼯程⾃从创建你⾃⼰的⼯程后并且将这个⽂件加⼊到⼯程⽂件排列中Build?éò?oüèYò×µ?11?t?a??1¤3ìéò?ê1ó?ATMEL的AVR Studio来调试你的代码你可以使⽤应⽤程序向导来⽣成⼀些使⽤有关硬件的初始化代码C程序的剖析⼀个C程序必须定义⼀个main调⽤函数可执⾏因此你也可以在你的⽬标系统中执⾏它⼀个C程序需要设定⽬标环境通常然后是⽆限循环地运⾏让我们看 \icc\examples⽬录中的⽂件led.c/* 为使能够看清LED的变化图案对应LED熄灭*/while (1){/*LED向前步进 */for (i = 0; i < 8; i++)LED_On(i);/* LED向后步进 */for (i = 8; i > 0; i--)LED_On(i);/* LED跳跃*/for (i = 0; i < 8; i += 2)LED_On(i);for (i = 7; i > 0; i -= 2)LED_On(i);}}这个main例程是很简单的它运⾏在⼀个⽆限循环中LED是在LED_On例程中被改变的因为CPU运⾏很快因为延时的实际延时值不能被确定如果这个实际定时时间是重要的其它的例⼦但同样清楚地显⽰了如何⽤C写⼀个中断处理过程四 编译⼀个单独的⽂件正常建⽴⼀个输出⽂件的次序是然⽽这时可以这样操作File Compile File...à′?′DD和中的任意⼀个⽂件应该是打开的编译⼀个⽂件为⽬标⽂件编译⼀个⽂件为输出⽂件注意2′ó2?µ¥中选择命令在对话框中你可以指定⼯程的名称如果你使⽤⼀些已经建⽴的源⽂件Project AddFile(s)áííaFile Newéò??ú2?µ¥中选择或命令来保存⽂件AddFile(s)ò2?é?úµ±?°±à?-′°?ú?Dµ¥?÷êó±êóò?ü将⽂件加⼊已打开的⼯程列表中但也可不作这样要求Project Options3ò?¨ò??ü??µ?±àò??µ±??′|àí1¤3ì11?tê±è?1?òí·t×÷á?DT??IDE会⾃动重新编译已经改变的头⽂件C⽂件必须使⽤扩展名.séòè?òat·??ú1¤3ìáD±í?D1¤3ì1üàí?÷?ú11?t1¤3ìê±′tò?íaµ?t2?óèàí2?éòú±àòDéèóD12êyê1óè?µ?±àò??ò2?é?è?±àò??×°èóD1¤3ì?D为避免你的⼯程⽬录混乱通常这个⽬录是你的⼯程⽬录的⼀个⼦⽬录 编辑窗⼝编辑窗⼝是你与IDE交流信息的主要区域当编译存在错误时编辑器会⾃动将光标定位在错误⾏的位置对C源⽂件中缺少分号编辑器定位于其下⾯⼀⾏ 应⽤构筑向导应⽤构筑向导是⽤于创建外围设备初始化代码的⼀个图形界⾯Wizard Tools ApplicationBuilderó|ó?11?t?òµ?ê1ó?±àòD???¨µ???±êMCU来产⽣相应的选项和代码它的使⽤是很显⽽易见的在这⾥你可以设置MCU的所具有的中断定时器UART2¢2úéú?àó|µ?′ú1?é2úéúmain( )函数 状态窗⼝状态窗⼝显⽰IDE的状态信息 终端仿真IDE有⼀个内置的终端仿真器在系统编程但它可以作为⼀个简单的终端也可下载⼀个ASC从6.20版本开始五弹出菜单在ICCAVR环境中单击右键2新建⼀个⽂件ReopenóD1?àúê·t??ê?µ?óò±?µ?×ó2?µ¥?D打开⼀个已以经存在的⽂件⽤于编辑Reload …form Disk′ó′??ì?D??D?×°??µ±?°t从最后⼀次的备份⽂件中装载当前⽂件保存当前⽂件则将原⽂件以.~形式保存将当前⽂件⽤另外⼀个名称来保存关闭当前⽂件系统会进⾏提⽰编译当前⽂件成⽬标⽂件其主要⽤于为创建新的启动⽂件或库产⽣⽬标⽂件编译当前⽂件成输出⽂件Save AllCloss Allí??ù?ü?áìáê±£′?ò??-DT??µt打印当前⽂件退出ICCAVR的IDE环境Edit Menu编辑菜单UndoRedoCutCopyPasteDeleteSelect AllBlock Indent对选择的整块内容左移4Find…在编辑窗⼝中寻找⼀个⽂本Match Case – 区分⼤⼩写Whole Word – 全字匹配Up/Down –往上或往下Find in Files... –在当前打开的⽂件中或在当前⼯程的所有⽂件中或当前⽬录中的⽂件中寻找⼀段⽂本Case Sensitive –⼤⼩写敏感Whole Word - 全字匹配Regular Expression – 寻找规则的表达式Replace... – 在编辑器中替换⽂本Goto Line Number – 转到指定⾏号Delete Bookmark – 删除书签Goto Bookmark – 跳转到指定的书签View Menu视图菜单Status Window – 如果选中Project Makefile – 以只读⽅式打开makefile ⽂件Output Listing File – 以只读⽅式打开列表⽂件6Open –打开⼀个已经存在的⼯程⽂件Close All Files – 关闭全部打开的⽂件Make Project –解释和编译已经修改的⽂件为输出⽂件注意在版本升级后对原有⼯程最好全部重新构筑这个⽂件可以是⾮源⽂件Option... – 打开⼯程编译选项对话框7UART的波特率éò⽣成硬件的初始化代码Compiler Options 编译选项编译选项总共有三个页⾯Compiler和Target在Paths页⾯中有Include Path(s) –你可以指定包含⽂件的路径Assembler Include Path(s) – 指定汇编包含⽂件的路径Library Path – 链接器所使⽤的库⽂件的路径Strict ANSI C Checking – 严格的ANSI C语法检查Accept Extensions – 接受C++类型语法扩充Macro Define(s) – 定义宏宏定义形式如下DEBUG:1;PRINT=printf等价于#define DEBUG 1#define PRINT printfMacro Undefine(s) –同上Output File Format – 输出⽂件格式COFF/HEXOptimizations – 代码优化Default – 基本优化共⽤相同的⼦例程等Maximize Code Size Reduction – 只有专业版才可使⽤去除了⽆⽤的碎⽚代码Device Configuration – 选择⽬标MCUMemory Sizes – 要选择"Custom" 时指定内存⼤⼩SRAM和EEPROM Text Address – 通常代码地址开始于中断向量区域后⾯通常为0x60Enhanced Core – 指定硬件⽀持增强核指令例如, 8515的SRAM 起始于0x60, 在IO寄存器空间后⾯延伸了512字节因此SRAM也是从0开始的注意这个选项需要很⼤的内存AVR Studio的终端模拟仿真被⽀持Return Stack Size – 指定编译器使⽤的硬件堆栈的⼤⼩Non Default Startup –允许你指定⼀个启动⽂件的位置这样IDE可以使⽤多个启动⽂件六 启动⽂件这个链接器会⾃动将启动⽂件连接到您的程序之前启动⽂件根据⽬标MCU的不同在crtavr.o 和 crtatmega.o 中间任意选择⼀个它也是您的程序的起点12345è?1µ??÷o¯êymain( )⼀旦退出启动⽂件也定义了复位向量具体可参考中断操作部分cd \icc\libsrc.avr; 进⼊你安装的编译器路径; 编辑修改crtavr.s⽂件; ⽤IDE打开crtavr.s⽂件Object">;选择编译到⽬标⽂件你应该⽤"crtatmega" 代替"crtavr"word⽽⾮Mega芯⽚每⼀个中断⼊⼝地址使⽤⼀个字.你也可以有多个启动⽂件注意2è±ê??·ac:\icc\libsrc.avr\libsrc.zipéò?′ó?¥á?í?é?è?òaò???UNZIP程序进⾏解压缩密码显⽰在"About"对话框中unzip -s libsrc.zip; unzip 提⽰输⼊密码2AVR特殊函数----- ICCAVR有许多访问UARTì2éo¯êy???ì2a????ê?·?ò?3?oüóDó?3io*.h (io2313.h, io8515.h, iom603.h, ... 等.)这些⽂件中是从ATMEL官⽅公开的定义IO寄存器的源⽂件经过修改得到的PORTB = 1;uc = PORTA;4macros.h这个⽂件包含了许多有⽤的宏和定义如果你的程序使⽤了头⽂件所列出的函数在使⽤浮点数和长整型数的程序中必须⽤#include预编译指令包含这些包含了这些函数原形的头⽂件assert.h - assert(), 声明宏ctype.h – 字符类型函数float.h – 浮点数原形limits.h – 数据类型的⼤⼩和范围math.h – 浮点运算函数stdarg.h – 变量参数表.stddef.h – 标准定义stdio.h – 标准输⼊输出函数stdlib.h – 包含内存分配函数的标准库string.h – 字符串处理函数3ê1ó??aD?o¯êy°ó|µ±ó?"#include "包含否则返回零int isalpha(int c)如果c是字母返回⾮零数值如FF, BELL, LF ..等否则返回零int isdigit(int c)如果c是数字返回⾮零数值否则返回零int islower(int c)如果c是⼩写字母返回⾮零数值否则返回零int ispunct(int c)如果c是⼀个可打印字符⽽不是空格否则返回零int isspace(int c)如果c是⼀个空格字符返回⾮零数值否则返回零int isupper(int c)如果c是⼤写字母返回⾮零数值否则返回零int tolower(int c)如果c是⼤写字母则返回c对应的⼩写字母int toupper(int c)如果c是⼩写字母则返回c对应的⼤写字母 浮点运算库下列函数⽀持浮点数运算#include·§?ú-之间float ceil(float x)返回对应x的⼀个整型数float cos(float x)返回以弧度形式表⽰的x的余弦值float cosh(float x)返回x的双曲余弦函数值float exp(float x)返回以e为底的x的幂即10xfloat fabs(float x)返回x的绝对值float floor(float x)返回不⼤于x的最⼤整数float fmod(float x, float y)返回x/y的余数float frexp(float x, int *pexp)把浮点数x分解成数字部分yoíò?2为底的指数n两个部分2n y y值被函数返回float fround(float x)返回最接近x的整型数float ldexp(float x, int exp)返回xêy2?·?′?·?µ?pint指向的变量并且作为函数返回值返回float sqrt(float x)返回x的平⽅根float sin(float x)返回以弧度形式表⽰的x的正弦值float sinh(float x)返回x的双曲正弦函数值float tan(float x)返回以弧度形式表⽰的x的正切值float tanh(float x)返回x的双曲正切函数值5MCU±ê×?stdio.h的许多内容不可以使⽤同样使⽤之前应⽤"#include "预处理最低层的IO程序是单字符的输⼊(getchar)和输出(putchar)程序例如⽤printf输出LCD为在ATMEL的AVR Studio模拟器使⽤标准IO函数注意单字符输出函数putchar是输出到UART装置没有修改'\n' 字符必须被映射为成对的回车和换⾏格式说明符是标准格式的⼀个⼦集同 %x%u - 输出⽆符号⼗进制整数%s – 输出⼀个以C中空字符NULL结束的字符串%c – 以 ASCII 字符形式输出取决于你的特别需要和代码的⼤⼩代码越⼤基本形: 只有 %c, %d, %x, %u, 和 %s 格式说明符是承认的长整形: 针对长整形数的修改 %ld, %lu, %lx被⽀持, 以适⽤于精度要求较⾼的领域浮点形: 全部格式包括%f 被⽀持你使⽤编译选项对话框来选择版本int putchar(int c)输出单个字符注意输出’\n’字符⾄程序终端窗⼝int sprintf(char *buf, char *fmt)按照格式说明符输出格式化⽂本frm字符串到⼀个缓冲区⽀持功能"const char *" cprintf 和csprintf 是将FLASH中的格式字符串分别以prinf和sprinf形式输出 标准库和内存分配函数标准库头⽂件定义了宏NULL和RAND_MAX和新定义的类型size_t×¢òa?ú??µ÷ó?è?òa?ú′?·3ìDòmalloc和realloc)之前int abs(int i)返回i的绝对值int atoi(char *s)转换字符串s为整型数并返回它否则返回0 double atof(const char *s)转换转换字符串s为双精度浮点数并返回它long atol(char *s)转换字符串s为长整型数并返回它否则返回0void *calloc(size_t nelem, size_t size)分配"nelem"个数据项的内存连续空间如果分配成功返回分配内存单元的⾸地址void exit(status)终⽌程序运⾏它是担任⽤户main函数的返回点如果分配成功则返回内存区地址void _NewHeap(void *start, void *end)初始化内存分配程序的堆符号_bss_end定义为编译器⽤来存放全局变量和字符串的数据内存的结束这个结束值不能被放⼊堆栈中void *realloc(void *ptr, size_t size)重新分配ptr所指向内存区的⼤⼩为size字节返回指向该内存区的地址指针long strtol(char *s, char **endptr, int base)按照"base."的格式转换"s"中起始字符为长整型数* endptr将设定"s"中转换结束的位置除了返回类型为⽆符号长整型数外 字符串函数⽤"#include "预处理后定义了NULLvoid *memchr(void *s, int c, size_t n)在字符串s中搜索n个字节长度寻找与c相同的字符否则返回NULLè?1??àí??ò·µ??0ò·µ1ò·µ-1但拷贝区不可以重迭返回s1µ±′éòµü它返回s·µ??s1包括结束NULL字符如果没有匹配字符找到int strcmp(char *s1, char *s2)⽐较两个字符串如果s1>s2则返回1char *strcpy(char *s1, char *s2)拷贝字符串s2⾄字符串s1size_t strcspn(char *s1, char *s2)在字符串s1搜索与字符串s2匹配的第⼀个字符其返回s1中找到的匹配字符的索引不包括结束NULL字符不含结束NULL字符如果s2长度⽐n⼩返回s1µ±è???°n个字符但其只拷贝前n个字符但它返回的是在s1匹配字符的地址指针char *strrchr(char *s, int c)在字符串s中搜索最后出现的c·??ò·µ??NULL°üà¨?áê?NULL字符中找到的第⼀个不匹配字符的索引如果成功它返回s1中匹配⼦字符串的地址指针⽀持函数"const char *" 这些函数除了它的操作对象是在FLASH中常数字符串外size_t cstrlen(const char *s)char *cstrcpy(char *dst, const char *src);int cstrcmp(const char *s1, char *s2);8ü¨òá2è·¨µààDíva_list和三个宏分派指定的类型如int ⼩的整型类型如"char"不能被⽀持printf()可以使⽤vfprintf()来实现#includeint printf(char *fmt, ...){va_list ap;va_start(ap, fmt);vfprintf(fmt, ap);va_end(ap);}9ú′?í?è′èí?tµ??úèY???á±???±?ó2?tê?ó?×÷o¯êyµ?·µ??µ??·同样地如果你使⽤动态分配内存警戒线警戒线数据区低端地址警戒线启动代码写了⼀个正确的关于数据区的地址字节和⼀个类似的正确的关于软件堆栈的地址字节作为警戒线如果你使⽤了你⾃⼰的启动⽂件你将需要额外改造为新的启动⽂件如果你使⽤动态分配内存参考内存分配函数如果警戒线字节仍然保持正确的值那么函数检查通过那么警戒线字节将可能被破坏你的程序将可能运⾏不正常或偶然崩溃_StackOverflowed(char c)它调⽤了带⼀个参数的函数那么硬件堆栈有过溢出那么软件堆栈曾经溢出它是两个堆栈都可能溢出的在_StackOverflowed执⾏起作⽤时作为例⼦那么将不能返回_StackCheck函数库会⽤⼀个缺省的_StackOverflowed函数来跳转到0的位置你可能希望⽤⼀个函数来代替它以指⽰更多的错误条件注意⾃堆栈溢出指⽰故障程序以来macros.h.中这两个函数的原型在头⽂件七 访问AVR的低层硬件AVR系列使⽤⾼级语⾔编程时有很⾼的C语⾔密度由于AVR性能偶然情况下⽬标MCU的硬件特点在C语⾔中不能很好地使⽤头⽂件io*.h iom603.h等这些⽂件是从ATMEL官⽅发布的⽂件经过修改⽂件macros.h定义了许多有⽤的宏这个编译器的效率很⾼outsbi等注意尽管io*.h定义了它们的bit 的位置很多时候你将需要使⽤定义在macros.h⽂件中的BIT()宏avr.h:#define SRE0x80// 外部 RAM 使能... (你的C程序)MCUCR |= SRE;io8515.h#define SRE7... (你的C程序)#includeMCUCR |= BIT(SRE);2bit很幸运⽽没有借助于汇编指令或其它⾮标准C结构a |b – 按位或这惯⽤于打开某些位例如这个运算在检查某些位是否置1时有⽤If ((PORTA & 0x81) == 0)// 检查位7和位0注意圆括号需要括在&运算符的周围这是C程序中很多错误的原因之⼀这个运算对⼀个位取反有⽤在下⾯的例⼦中PORTA ^= 0x80;// 翻转位7~a – 按位取反. 在表达式中这个运算执⾏⼀个取反与这个运算组合使⽤尤其有⽤PORTA &= ~0x80;// 关闭位7这个编译器对这些运算能产⽣最理想的机器指令sbic指令可以⽤在根据位的状态进⾏条件分枝的按位与运算中 程序存贮器和常量数据AVR是哈佛结构的MCU?a?ùµ?éè??ê?óDò?D?ó?µ?µ?·??aµ?µ??·êDíAVR装置⽐传统结构访问更多的存贮器Atmega系列允许有超过64K字的程序存贮器和64K字节的数据存贮器⽽程序计数器仍保留在16位上C不是在这种机器上发明的C指针是任意⼀个数据指针或函数指针可是同是哈佛结构的AVR⾮标准C解决了这个问题序存贮器中这个const限定词可以应⽤于不同的场合例如"ptr1"是⼀个项⽬在数据存贮器⽽指向数据的指针在程序存贮器最后在⼤多数的例⼦中"table" 和和"ptr1"是很典型的注意C标准不要求"const"数据是放⼊只读存贮器中除了正确访问就没有要紧的了在承认参数的C标准中使⽤const限定是⾮传统的这样做与标准C函数定义是有⼀定冲突的标准"strcpy"的原型是strcpy(char *dst, const char *src)èúICCAVR下因此这些函数定义设有const限制注意只有常数变量以⽂件存贮类型放⼊FLASH中如果你使⽤有const限制的局部变量4aò3µ÷×·′?×?à§??µ?ê?×?·?′?µ?·oí′|àíè?1?×?·?′?ê?·3ìDò′??ü?÷?Dò×·′?ò2±?D?±?·úêy?Y′??ü?÷?D缺省的字符串分配这个缺省的⽅法是同时分配字符串在数据和程序存贮器中为了确保它们的值是正确的因此只有单⼀的字符串拷贝函数是必须的你能使⽤常量字符型数组来将字符串只分配进程序存贮器中const char hello[] = "Hello World";在这个例⼦中但不能⽤作标准C库中字符串函数的参数另外只分配全部字符串到FLASH存贮器中当对应"Project->Options->Target->Strings In FLASH Only"检查框被选中时这时称必须很⼩⼼地调⽤库函数字符串类型"const char *"是有效的。
TurbocC编译出错信息的中文翻译-CC++C语言
TurbocC编译出错信息的中文翻译-CC++C语言致命错误:1.bad call of in-line function 内部函数非法调用在使用一个宏定义的内部函数时,没有正确调用。
一个内部函数以双下划线(__)开始和结束。
2.irrducible expression tree 不可约表达式树这种错误是由于源文件中的某些表达式使得代码生成程序无法为它产生代码。
这种表达式必须避免使用。
3.register allocation failure 存储器分配失效这种错误指的是源文件行中的表达行听表达式太复杂,代码生成程序无法为它生成代码。
此时应简化这种繁杂的表达式或干脆避免使用它。
一般错误1.#operator not followed by macro argument name#运算符后无宏变量名。
宏定义中,#用于标识一宏变量名。
"# "后必须跟一宏变量名。
2. 'xxxxxx 'not an argument'xxxxxx '不是函数参数。
在源程序中将该标识符定义为一个函数参数,但些标识符没有在函数表中出现。
3.ambiguous symbol 'xxxxx '二义性符号'xxxxxx '。
两个或多个结构的某一域名相同,但具有的偏移,类型不同。
在变量或表达式中引用该域而未带结构名时,将产生二义性,此时需修改某个域名或在引用时加上结构名。
4.argument #missing name参数表出现语法错误。
函数调用的参数间必须以逗号隔开,并以一右括号结束。
若源文件中含有一个其后不是逗号也不是右括号的参数,则出错。
5.argument list error参数表出现语法错误。
函数调用的参数必须以逗号隔开,并以一右括号结束。
若源文件中含有一个其后不是逗号也不是右括号的参数,则出错。
6.array bounds missing数组的界限符 "] "丢失。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux 2.6.19.x 内核编译配置选项简介作者:金步国版权声明本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着GPL 的精神发布。
任何人都可以自由使用、转载、复制和再分发,但必须保留作者署名,亦不得对声明中的任何条款作任何形式的修改,也不得附加任何其它条件。
您可以自由链接、下载、传播此文档,但前提是必须保证全文完整转载,包括完整的版权信息和作译者声明。
其他作品本文作者十分愿意与他人共享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有作品的列表:•金步国作品列表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 而不是APMAC 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"内核引导参数关闭MSIPCI 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文件系统和"Sysctlsupport",然后在系统启动并挂载了/proc之后执行"echo1 >/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允许针对每个连接记录已经传送的字节/包数,常用于connbytesmatchConnection 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的人应当不陌生。