按日归档: 2007/04/07

GCC编译器选项及优化提示

大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在Intel/AMD平台上默认按照i386处理器来编译。
如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。

一种方法是修改每个源码包中的Makefile文件,在其中寻找CFLAGS和CXXFLAGS变量(C和C++编译器的编译选项)并修改它的值。
一些源码包比如binutils, gcc, glibc等等,在每个子文件夹中都有Makefile文件,这样修改起来就太累了!

另一种简易做法是设置CFLAGS和CXXFLAGS环境变量。大多数configure脚本会使用这两个环境变量代替Makefile文件中的值。
但是少数configure脚本并不这样做,他们必须需要手动编辑才行。

为了设置CFLAGS和CXXFLAGS环境变量,你可以在bash中执行如下命令(也可以写进.bashrc以成为默认值):
export CFLAGS="-O3 -march=" && CXXFLAGS=$CFLAGS
这是一个确保能够在几乎所有平台上都能正常工作的最小设置。

"-march"选项表示为特定的cpu类型编译二进制代码(不能在更低级别的cpu上运行),
Intel通常是:pentium2, pentium3, pentium3m, pentium4, pentium4m, pentium-m, prescott, nocona
说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m是迅驰I/II代笔记本的cpu;
prescott是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);nocona则是最新的带有EMT64(64位)的P4(同样可以煎鸡蛋)
AMD通常是:k6, k6-2, k6-3, athlon, athlon-tbird, athlon-xp, athlon-mp, opteron, athlon64, athlon-fx
用AMD的一般都是DIYer,就不必解释了吧。

如果编译时没有抱怨"segmentation fault, core dumped",那么你设定的"-O"优化参数一般就没什么问题。
否则请降低优化级别("-O3" -> "-O2" -> "-O1" -> 取消)。
个人意见:服务器使用"-O2"就可以了,它是最安全的优化参数(集合);桌面可以使用"-O3" ;
不鼓励使用过多的自定义优化选项,其实他们之间没什么明显的速度差异(有时"-O3"反而更慢)。

编译器对硬件非常敏感,特别是在使用较高的优化级别的时候,一丁点的内存错误都可能导致致命的失败。
所以在编译时请千万不要超频你的电脑(我编译关键程序时总是先降频然的)。

注意:选项的顺序很重要,如果有两个选项互相冲突,则以后一个为准。
比如"-O3"将打开-finline-functions选项,但是可以用"-O3 -fno-inline-functions"既使用-O3的功能又关闭函数内嵌功能。

更多的优化选项请参见:
http://gcc.gnu.org/onlinedocs/gcc-3….e-Options.html
http://gcc.gnu.org/onlinedocs/gcc-3….4-Options.html
http://gcc.gnu.org/onlinedocs/gcc-4….e-Options.html
http://gcc.gnu.org/onlinedocs/gcc-4….4-Options.html
所有GCC选项完整列表参见:
http://gcc.gnu.org/onlinedocs/gcc-3….n-Summary.html
http://gcc.gnu.org/onlinedocs/gcc-4….n-Summary.html

有两个页面值的参考:
(对于gentoo-1.4)比较安全的优化选项
http://www.freehackers.org/gentoo/gc…flag_gcc3.html
(对于gentoo-1.4)进阶优化选项
http://www.freehackers.org/gentoo/gc…g_gcc3opt.html

*******************************************************************

哦,忘了说一声,"-O2"已经启用绝大多数安全的优化选项了,所以其实你不必对那一堆选项发愁。
先说说"-O3"在"-O2"基础上增加的几项,你可以按需添加(还算比较安全):
[gcc-3.4.4]
-finline-functions 允许编译器选择某些简单的函数在其被调用处展开
-fweb 为每个web结构体分配一个伪寄存器
-frename-registers 试图驱除代码中的假依赖关系,这个选项对具有大量寄存器的机器很有效。
[gcc-4.0.2]
-finline-functions 说明如上
-funswitch-loops 将循环体中不改变值的变量移动到循环体之外
-fgcse-after-reload **不太明白它的含义**[哪位大峡知道给小弟讲解一下,先行谢过 ]

说完"-O3"再说说在嵌入式系统上常用的"-Os"选项,这个选项其实也很重要,它的含义是对生成的二进制代码进行尺寸上的优化,它打开了所有"- O2"打开的选项,因此通常认为的"-Os"生成的二进制代码执行效率低的潜在意识是错误的!当然该选项与"-O2"的不同之处在于它在"-O2"的基础上禁止了所有为了对齐而插入的空间,也就是将所有"-falign-*"系列的选项禁用了。这种禁用究竟是否一定降低了代码的执行效率,依据程序的不同而不同,据说某些情况下"-Os"的效率比"-O3"还要高14%!请兄弟们在实践中自己摸索吧…

———————————————

下面选择我认为比较重要的几项简单介绍一下[gcc-3.4.4],GCC选项完整列表太长了!精力有限。
[注意]这里列出的都是非默认的选项,你只需要添加你所需要的选项即可

-w 禁止输出警告消息

-Werror 将所有警告转换为错误

-Wall 显示所有的警告消息

-v 显示编译程序的当前版本号

-V 指定gcc将要运行的版本。只有在安装了多个版本gcc的机器上才有效。

-ansi 按照ANSI标准编译程序,但并不限制与标准并不冲突的GNU扩展(一般不用该选项)

-pedantic 如果要限制代码必须严格符合ISO标准,就在"-ansi"的基础上同时启用这个选项(很少使用)

-std= 指定C语言的标准(c89,c99,gnu89),该选项禁止了GNU C的扩展关键字asm,typeof,inline (一般不用该选项)

-static 连接器将忽略动态连接库,同时通过将静态目标文件直接包含到结果目标文件完成对所有引用的解析。

-shared 连接器将生成共享目标代码,该共享库可在运行时动态连接到程序形成完整的可执行体。
如果使用gcc命令创建共享库作为其输出,该选项可以防止连接器将缺失main()方法视为错误。
为了可以正确的工作,应该一致的使用选项"-fpic"以及目标平台选项编译构成同一个库的所有共享目标模块。

-shared-libgcc 该选项指定使用共享版本的libgcc,在没有共享版本的libgcc的机器上该选项无效。

-specs= gcc驱动程序读取该文件以确定哪些选项应该传递给那些子进程。
该选项可以通过指定配置文件来覆盖默认配置,指定的文件将在默认配置文件读取后进行处理以修改默认配置。

-pipe 使用管道而不是临时文件一个阶段到另一个阶段交换输出的方式,可以加快编译速度。建议使用。

-o 指定输出文件,对各种输出皆有效。由于只能指定一个文件,所以在产生多个输出文件的情况下不要使用该选项。

–help 显示gcc的命令行选项列表;与"-v"一起使用时还将显示gcc调用的各个进程所接受的选项。

–target-help 显示目标机器相关的命令行选项列表

-b 指示需要编译程序的目标机器;默认为编译程序所运行的目标机编译代码。
目标机通过指定包含编译程序的目录来确定,通常为/usr/local/lib/gcc-lib//

-B 指定库文件的位置,包括编译程序的文件、执行程序和数据文件,如果需要运行子程序(如cpp,as,ld)就会用该前缀来定位。
这个前缀可以是用冒号分割的多个路径,环境变量GCC_EXEC_PREFIX和这个选项有相同的效果。

-I 指定搜索系统头文件的目录,可以重复使用多个该选项指定多个目录。

-dumpmachine 显示该程序的目标机名字,不做其他任何动作

-dumpspecs 显示构件编译程序的规范信息,包括用来编译、汇编和连接gcc编译程序自身用到的所有选项,不做其他任何动作。

-dumpversion 显示编译程序自身的版本号,不做其他任何动作

-falign-functions=N 将所有函数的起始地址在N(N=1,2,4,8,16…)的边界上对齐,默认为机器自身的默认值,指定为1表示禁止对齐。

-falign-jumps=N 将分支目标在N(N=1,2,4,8,16…)的边界上对齐,默认为机器自身的默认值,指定为1表示禁止对齐。
-fno-align-labels 建议使用它,以保证不和-falign-jumps("-O2"默认启用的选项)冲突

-fno-align-loops 建议使用它,以确保不会在分支目标前插入多余的空指令。

-fbranch-probabilities 在使用"-fprofile-arcs"选项编译程序并执行它来创建包含每个代码块执行次数的文件之后,程序可以利用这一选项再次编译,
文件中所产生的信息将被用来优化那些经常发生的分支代码。如果没有这些信息,gcc将猜测那一分支可能经常发生并进行优化。
这类优化信息将会存放在一个以源文件为名字的并以".da"为后缀的文件中。

-fno-guess-branch-probability 默认情况下gcc将使用随机模型进行猜测哪个分支更可能被经常执行,并以此来优化代码,该选项关闭它。

-fprofile-arcs 在使用这一选项编译程序并运行它以创建包含每个代码块的执行次数的文件后,程序可以再次使用"-fbranch-probabilities"编译,
文件中的信息可以用来优化那些经常选取的分支。如果没有这些信息,gcc将猜测哪个分支将被经常运行以进行优化。
这类优化信息将会存放在一个以源文件为名字的并以".da"为后缀的文件中。

-fforce-addr 必须将地址复制到寄存器中才能对他们进行运算。由于所需地址通常在前面已经加载到寄存器中了,所以这个选项可以改进代码。
-fforce-mem 必须将数值复制到寄存器中才能对他们进行运算。由于所需数值通常在前面已经加载到寄存器中了,所以这个选项可以改进代码。

-ffreestanding 所编译的程序能够在独立的环境中运行,该环境可以没有标准库,而且可以不从main()函数开始运行。
该选项将设置"-fno-builtin",且等同于"-fno-hosted"。
-fhosted 所编译的程序需要运行在宿主环境中,其中需要有完整的标准库,而且main()函数具有int型的返回值。
-fno-builtin 除非利用"__builtin_"进行引用,否则不识别所有内建函数。

-fmerge-all-constants 试图将跨编译单元的所有常量值和数组合并在一个副本中。但是标准C/C++要求每个变量都必须有不同的存储位置。

-fmove-all-movables 将所有不变的表达式移动到循环体之外,这种做法的好坏取决于源代码中的循环结构。

-fnon-call-exceptions 产生的代码可供陷阱指令(如非法浮点运算和非法内存寻址)抛出异常,需要相关平台的运行时支持,并不普遍有效。

-fomit-frame-pointer 对于不需要栈指针的函数就不在寄存器中保存指针,因此可以忽略存储和检索地址的代码,并将寄存器用于普通用途。
所有"-O"级别都打开着一选项,但仅在调试器可以不依靠栈指针运行时才有效。建议不需要调试的情况下显式的设置它。

-fno-optional-diags 禁止输出诊断消息,C++标准并不需要这些消息。
-fpermissive 将代码中与标准不符合的诊断消息作为警告而不是错误输出。

-fpic 生成可用于共享库的位置独立代码(PIC),所有的内存寻址均通过全局偏移表(GOT)完成。该选项并非在所有的机器上都有效。
要确定一个地址,需要将代码自身的内存位置作为表中的一项插入。该选项可以产生在共享库中存放并从中加载的目标模块。

-fprefetch-loop-arrays 生成数组预读取指令,对于使用巨大数组的程序可以加快代码执行速度,适合数据库相关的大型软件等。

-freg-struct-return 生成用寄存器返回短结构的代码,如果寄存器无法荣纳将使用内存。

-fstack-check 为防止程序栈溢出而进行必要的检测,在多线程环境中运行时才可能需要它。

-ftime-report 编译完成后显示编译耗时的统计信息

-funroll-loops 如果在编译时可以确定迭代的次数非常少而且循环中的指令也非常少,可以使用该选项进行循环展开,以驱除循环和复制指令。

-finline-limit= 对伪指令数超过的函数,编译程序将不进行展开,默认为600

–param = gcc内部存在一些优化代码程度的限制,调整这些限制就是调整整个优化全局。下面列出了参数的名字和对应的解释:
名字 解释
max-delay-slot-insn-search 较大的数目可以生成更优化的代码,但是会降低编译速度,默认为100
max-delay-slot-live-search 较大的数目可以生成更优化的代码,但是会降低编译速度,默认为333
max-gcse-memory 执行GCSE优化使用的最大内存量,太小将使该优化无法进行,默认为50M
max-gcse-passes 执行GCSE优化的最大迭代次数,默认为1

*******************************************************************
说完了命令行选项,下面来说说与硬件体系结构(主要是cpu)相关的设置[仅针对i386/x86_64]
最大名鼎鼎的"-march"上面已经说过了,下面讲讲别的(仅挑些实用的)

-mfpmath=sse P3和athlon-tbird以上级别的cpu支持

-masm= 使用指定的dialect输出汇编语言指令,可以使用"intel"或"att";默认为"att"

-mieee-fp 指定编译器使用IEEE浮点比较,这样将会正确的处理比较结果为无序的情况。

-malign-double 将double, long double, long long对齐于双字节边界上;有助于生成更高速的代码,但是程序的尺寸会变大。

-m128bit-long-double 指定long double为128位,pentium以上的cpu更喜欢这种标准。

-mregparm=N 指定用于传递整数参数的寄存器数目(默认不使用寄存器)。0<=N<=3 ;注意:当N>0时你必须使用同一参数重新构建所有的模块,包括所有的库。

-mmmx
-mno-mmx
-msse
-mno-sse
-msse2
-mno-sse2
-msse3
-mno-sse3
-m3dnow
-mno-3dnow
上面的这些不用解释了,一看就明白,根据自己的CPU决定吧

-maccumulate-outgoing-args 指定在函数引导段中计算输出参数所需最大空间,这在大部分现代cpu中是较快的方法;缺点是会增加代码尺寸。

-mthreads 支持Mingw32的线程安全异常处理。对于依赖于线程安全异常处理的程序,必须启用这个选项。
使用这个选项时会定义"-D_MT",它将包含使用选项"-lmingwthrd"连接的一个特殊的线程辅助库,用于为每个线程清理异常处理数据。

-minline-all-stringops 嵌入所有的字符串操作。可以提高字符串操作的性能,但是会增加代码尺寸。

-momit-leaf-frame-pointer 不为叶子函数在寄存器中保存栈指针,这样可以节省寄存器,但是将会是调试变的困难。参见"-fomit-frame-pointer"。

下面这几个仅用于x86_64环境:

-m64 生成专门运行于64位环境的代码,不能运行于32位环境

-mcmodel=small [默认值]程序和它的符号必须位于2GB以下的地址空间。指针仍然是64位。程序可以静态连接也可以动态连接。
-mcmodel=kernel 内核运行于2GB地址空间之外。在编译linux内核时必须使用该选项!
-mcmodel=medium 程序必须位于2GB以下的地址空间,但是它的符号可以位于任何地址空间。程序可以静态连接也可以动态连接。
注意:共享库不能使用这个选项编译!
-mcmodel=large 对地址空间没有任何限制,这个选项的功能目前尚未实现。

==============================
既然已经讲了这么多了索性再讲讲gcc使用的一些环境变量
除了大名鼎鼎的CFLAGS和CXXFLAGS以外(其实是Autoconf的环境变量),再挑几个说说:
所有的PATH类环境变量(除LD_RUN_PATH外)都是用冒号分割的目录列表。

C_INCLUDE_PATH 编译C程序时使用的环境变量,用于查找头文件。

CPLUS_INCLUDE_PATH 编译C++程序时使用的环境变量,用于查找头文件。

OBJC_INCLUDE_PATH 编译Obj-C程序时使用的环境变量,用于查找头文件。

CPATH 编译C/C++/Obj-C程序时使用的环境变量,用于查找头文件。

COMPILER_PATH 如果没有用GCC_EXEC_PREFIX定位子程序,编译程序将会在此查找它的子程序。

LIBRARY_PATH 连接程序将在这些目录中寻找特殊的连接程序文件。

LD_LIBRARY_PATH 该环境变量不影响编译程序,但是程序运行的时候会有影响:程序会查找该目录列表以寻找共享库。
当不能够在编译程序的目录中找到共享库的时候,执行程序必须设置该环境变量。

LD_RUN_PATH 该环境变量不影响编译程序,但是程序运行的时候会有影响:它在运行时指出了文件的名字,运行的程序可以由此得到它的符号名字和地址。
由于地址不会重新载入,因而可能符号应用其他文件中的绝对地址。这个和ld工具使用的"-R"选项完全一样。

GCC_EXEC_PREFIX 编译程序执行所有子程序的名字的前缀,默认值是"/lib/gcc-lib/",
其中的是安装时configure脚本指定的前缀。

LANG 指定编译程序使用的字符集,可用于创建宽字符文件、串文字、注释;默认为英文。[目前只支持日文"C-JIS,C-SJIS,C-EUCJP",不支持中文]

LC_ALL 指定多字节字符的字符分类,主要用于确定字符串的字符边界以及编译程序使用何种语言发出诊断消息;默认设置与LANG相同。
中文相关的几项:"zh_CN.GB2312 , zh_CN.GB18030 , zh_CN.GBK , zh_CN.UTF-8 , zh_TW.BIG5"

TMPDIR 编译程序存放临时工作文件的临时目录,这些临时文件通常在编译结束时被删除。

Read: 40

优秀IT书籍100本

1.vc++技术内幕第四版 (潘爱民)
ftp://210.32.157.56/课件/c++primer/vc++技术内幕IV(潘爱民).rar
2.C++经典对话系列
中文:http://www.jka77.com/book/cvst_cn.chm

3.MFC Windows 程序设计(第二版)
英文版:http://www.jka77.com/book/progmfc2.chm
中文版:暂无,制作中…
4.Effective C++中文版:
http://dlb.pchome.net/development/reference/effectiveCplus.zip
5.More Effective C++中文版-zhc译
http://cable.pchome.net/development/reference/MEC0410.zip

6.More Effective C++中文版-候捷译
http://www.nethovel.com/resources/MoreEffectiveC++(WQ).zip

7.Essential C++中文版(全)-候捷译
http://www.nethovel.com/resources/Essential%20C++中文版(全).rar

8.深入浅出MFC 2/e
http://218.30.21.125:8084/ebook/programme/mfc2e.zip

9.代码大全中文版
http://www.delphidevelopers.com/docs/tecsubject/cc/CodeComplet110.zip

11.C++经典对话系列
中文:http://www.jka77.com/book/cvst_cn.chm

12.MFC Windows 程序设计(第二版)
英文版:http://www.jka77.com/book/progmfc2.chm
中文版:暂无,制作中…

13.数据结构 C++ 语言描述(中文版)
http://www.code-labs.com/manual/c_c015.zip

14.Java编程思想中文版
ftp://202.118.72.12/pub/doc-book/Java/Java编程思想.zip

15.C++标准库英文版
ftp://166.111.64.4/incoming/新文件夹/f/The%20C++%20Standard%20Library(with%20TOC).pdf

16.Windows核心编程
英文:http://www.fmdstudio.net/book/prgapps4.zip

17.TCP-IP详解卷1:协议
ftp://202.204.4.161/学习资料/TCPIP/TCP-IP详解卷1:协议.pdf

18.TCP-IP详解卷2:实现
ftp://202.204.4.161/学习资料/TCPIP/TCP-IP详解卷3:TCP事务协议,HTTP,NNTP.pdf

19.TCP-IP详解卷3:TCP事务协议
ftp://202.204.4.161/学习资料/TCPIP/TCP-IP详解卷2:实现.pdf

20.实用算法的分析与程序设计
ftp://202.204.8.10/[4]%20编程资源/[%20书籍资料%20]/[算法与数据结构]/实用算法的分析与程序设计.rar

21.vc++技术内幕第四版 (潘爱民)
ftp://210.32.157.56/课件/c++primer/vc++技术内幕IV(潘爱民).rar

22.C++ Primer英文版:
http://computerstep.w18.net/C/C++%20Primer.zip

23.Effective C++中文版:
http://dlb.pchome.net/development/reference/effectiveCplus.zip

24.More Effective C++中文版-zhc译
http://cable.pchome.net/development/reference/MEC0410.zip

25.More Effective C++中文版-候捷译
http://www.nethovel.com/resources/MoreEffectiveC++(WQ).zip

26.Essential C++中文版(全)-候捷译
http://www.nethovel.com/resources/Essential%20C++中文版(全).rar

27.Programming Windows程式开发设计指南-Petzoldi著 余孟学 译
中文版:http://www.nethovel.com/resources/ProgrammingWindows_tw.chm
英文版:http://www.nethovel.com/resources/Petzoldi.chm

28.WinAsm32汇编教程- Iczelion
http://www.nethovel.com/resources/winasm.chm

29.Windows 95 程序设计指南-候捷译
http://www.nethovel.com/resources/win95adg.zip

30.Thinking in C++ 2nd Edition(C++编程思想)
英文版:http://www.nethovel.com/resources/ThinkinginC++.zip
中文版:http://www.dingbing.com/book/thinkc.zip

31.人月神话-中文版
http://www.goodassister.com/book/rysh.pdf

32.The C++ Programming Language英文
http://computerstep.w18.net/C/The%20C++%20Programming%20Language.rar

33.VC技术内幕第五版 http://www.helpwork.com/downdata/book/programming/vc/book/vc++2/invcpp5.chm

34.com技术内幕
http://www.helpwork.com/book/html/user/download.asp?id=1123

35.com+技术内幕
http://www.helpwork.com/book/html/user/download.asp?id=952

36.新编 Windows API参考大全
http://www.4046.com/nnsrc/down/WindowsAPIdq.rar

37.The C programming Language // By Brian W. Kernighan and Dennis M. Ritchie
下载地址:http://www.jka77.com/book/The_C_programmin.chm

38.C语言编程手册
下载地址:http://www.jka77.com/book/CL.chm

39.Delphi 7高效数据库程序设计
By 李维
下载地址:http://www.codestudy.net/book/download.asp?id=1163&sort=5

40.Windows网络编程(第2版)
By Anthony Jones,Jim Ohlund 清华大学出版社
下载地址:英文版:http://www.guxiang.com/epubcn/readings/diannaotushu/500/download/1107/network_prog_for_win_2nd.zip

41.Windows2000编程技术内幕
By Mickey Williams 机械工业出版社
下载地址:ftp://ftp.frontfree.net/Pub/Books/C&C++/VC/Windows2000编程技术内幕.rar

42.数据仓库
By W.H.Inmon 清华大学出版社
下载地址1:http://tips.9hao.com/vvbksd/20011120/数据仓库.zip
下载地址2: ftp://ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/ComputerScience/%CA%FD%BE%DD%B2%D6%BF%E2/

43.编码的奥秘
By Charles Petzold 机械工业出版社
下载地址:ftp: //ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/ComputerScience/%B1%E0%C2%EB%B5%C4%B0%C2%C3%D8/

44.编译原理及实践
By Louden, K.C 机械工业出版社
下载地址:ftp: //ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/ComputerScience/%B1%E0%D2%EB%D4%AD%C0%ED%BC%B0%CA%B5%BC%F9/

45.Inside C++ Object Model(深度探索C++对象模型)
By Lippman 候捷译
下载地址:http://www.jka77.com/book/inside-the-cpp-object-model.pdf

46.C++标准程序库
By Josuttis
下载地址1:http://www.codestudy.net/book/download.asp?id=1205&sort=5
下载地址2: ftp://ftp.math.nankai.edu.cn/Ebook/C_C++/The Cpp Standard Library.pdf

47.STL源码剖析
By 候捷
下载地址:ftp://ftp.math.nankai.edu.cn/Ebook/C_C++/STL源码剖析–侯捷.pdf

48.C++批判(第三版) -看看C++的坏话!
By I don’t know
下载地址:http://www.jka77.com/book/CPPPP.pdf

49.程序设计实践
下载地址:ftp://ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/%B3%CC%D0%F2%C9%E8%BC%C6%CA%B5%BC%F9/

50.c++沉思录
By Andrew Koenig Barbara Moo 人民邮电出版社
下载地址:http://www.codestudy.net/book/download.asp?id=1261&sort=5

51.C++Builder4技术内幕 (这本书俺不知道好不好)
By I don’t Know
下载地址:http://www.codestudy.net/book/download.asp?id=1254&sort=5

52.下面两本书一般大家硬盘里都有的吧,而且很老了,但是为了全面,就提上来吧
(1)Windows 95 程式设计指南 – 候捷
下载地址:http://jjhou.csdn.net/win95-a-developers-guide.pdf
(2)Windows 95 系统程式设计大奥秘 – 候捷
下载地址:http://jjhou.csdn.net/windows95-system-programming-secrets.pdf

53. 中国大百科全书·数学
下载地址:ftp://ftp.math.nankai.edu.cn/Ebook/中国大百科全书/中国大百科全书·数学.pdf

54、4.0M Bjarne Stroustrup – The C++ Programming Language
http://www.u-n-f.com/books/archive/The%20C++%20Programming%20Language.tar.gz

55、1.0M Richard Stevens – TCP-IP Illustrated
http://www.u-n-f.com/books/archive/TCP-IP%20Illustrated.tar.gz

56、4.5M Randall Hyde – Art Of Assembly
http://www.u-n-f.com/books/archive/Randall%20Hyde%20-%20Art%20Of%20Assembly.tar.gz

57、2.1M M. Abrash – Zen of Graphics Programming
http://www.u-n-f.com/books/archive/M.%20Abrash%20-%20Zen%20of%20Graphics%20Programming.zip

58、249k Kernighan and Ritche – The C Programming Language
http://www.u-n-f.com/books/archive/Kernighan%20and%20Ritchie%20-%20The%20C%20Programming%20Language.zip

59、3.3M Bruce Schneier – Applied Cryptography
http://www.u-n-f.com/books/archive/Bruce%20Schneier%20-%20Applied%20Cryptography.zip

60、PHP4_Grundlagen_und_Profiwissen
http://www.u-n-f.com/books/archive/lamp/PHP4_Grundlagen_und_Profiwissen.pdf

61.《C++ Builder高级编程技术》
http://www.dingbing.com/book/builder.zip

62.《VC++ 6.0 TLR 模板库参考手册》
http://www.easysea.com/diannao/download/prog/c/mbkc.zip

63.《BORLAND C++ BUILDER 实用培训教程》
http://202.101.232.120/book/openfile.asp?id=223&filename=BC98_CB526.zip

64.《Delphi高级开发指南》
http://www.pcbookcn.com/s10899book/program/delphi/Delphi_gjkfzn_for3.rar

65.《新编 Windows API参考大全》
ftp://book:book@down.pcbookcn.com/pro/delphi/新编Windows_API_参考大全.rar

66.《Delphi深度历险-附书源码》
http://www.pcbookcn.com/s10899book/program/delphi/Delphi_sdlx_code.rar

67.《Delphi 7高效数据库程序设计》
ftp://book:book@down.pcbookcn.com/pro/delphi/李维的新书《Delphi7高效数据库程序设计》.rar

68.《Delphi7开发指南》
ftp://book:book@down.pcbookcn.com/pro/delphi/delphi7开发指南.rar

69.《Delphi6集成开发环境》
ftp://book:book@down.pcbookcn.com/pro/delphi/Delphi6集成开发环境.rar

70.《Delphi6数据库编程》
ftp://book:book@down.pcbookcn.com/pro/delphi/Delphi6数据库编程.rar

72.《Delphi5.xADO_MTS_COM+高级程序设计篇》
ftp://book:book@down.pcbookcn.com/pro/delphi/Delphi5.xADO_MTS_COM+高级程序设计篇.rar

73.《VISUAL BASIC 编程标准》
http://www.dingbing.com/book/vb.zip

74.《Visual Basic6.0中文版程序员指南》
http://www.easysea.com/diannao/download/prog/vb/zwbc.zip

75.《Visual Basic 6.0 控件参考手册》
http://www.easysea.com/diannao/download/prog/vb/kjck.zip

76.《Visual Basic 6.0中文版语言参考手册》
http://www.easysea.com/diannao/download/prog/vb/zwby.zip

77.《Visual Basic 6.0 开发宝典》
http://www.easysea.com/diannao/download/prog/vb/kfbd.zip

78.《Visual Basic 6.0 实例教程》
http://www.easysea.com/diannao/download/prog/vb/sljc.zip

79.《VB 6.0 中文版实用参考手册》
http://www.easysea.com/diannao/download/prog/vb/syck.zip

80.《Visual Basic 6开发人员指南》
http://www.easysea.com/diannao/download/prog/vb/kfzn.zip

81.《VB 和 SQL Server 编程指南(第五版)》
http://www.easysea.com/diannao/download/prog/vb/bczn.zip

82.《Jbuilder 5 中文帮助》
http://www.pdown.net/download.asp?downid=2&id=991

83.《JBuilder开发人员指南》
http://youth.dlmu.edu.cn/book/list_down.php?bkid=224

84.《Win32的Internet函数说明》
档案大小: 245248K
http://www.easysea.com/diannao/download/prog/windows/win32int.zip

85.《Visual InterDev 从入门到精通》
http://www.easysea.com/diannao/download/prog/interdev/crmd.wdl

86.《Visual InterDev 6.0 Web 参考手册 》
http://www.easysea.com/diannao/download/prog/interdev/jsck.zip

87.《Visual InterDev 6.0 Guide 程序员》
http://www.easysea.com/diannao/download/prog/interdev/cxyz.zip

88.《JavaScript 程序开发手册》
http://www.cty99.com/Templet/bookdownmore.asp?booktype=script#

89.《JAVA 大全》
http://www.easysea.com/diannao/download/prog/java/cxkf.zip

90.《Visual J++ 6.0 WFC 类库参考手册》
http://www.easysea.com/diannao/download/prog/java/lkck.zip

91.《Java联想(中文)》
http://www.easysea.com/diannao/download/prog/java/lkck.zip

92.《Oracle 8 实用大全》
http://www.easysea.com/diannao/download/prog/oracle/sydq.zip

93.《Microsoft SQL Server 管理员手册》
http://www.easysea.com/diannao/download/prog/sql/glys.zip

94.《掌握ACCESS开发》
http://www.easysea.com/diannao/download/prog/sql/glys.zip

95.《Oracle Performance Tuning and Optimization》
http://www.oradb.net/book/oracle_pt.zip

96.《Oracle ProC 程序设计》
http://www.oradb.net/book/oracleproc.zip

97.《Oracle8初学者指南》
http://www.easysea.com/diannao/download/prog/oracle/cxzz.zip

98.《RED HAT LINUX 6大全》
http://www.dingbing.com/book/redhatall.zip

99.《RED HAT LINUX 6管理工具》
http://www.dingbing.com/book/redhatman.zip

100.《VC++高级编程》
http://www.easysea.com/diannao/download/prog/c/vcgj.zip
QQ群:12418867

Read: 824

解读Linux系统文件权限的设置方法

引:Windows系统其实和Linux系统有相似的地方,Windows系统文件、目录的属性有只读、隐藏,而Linux也一样。

Linux中,每一个文件都具有特定的属性。主要包括文件类型和文件权限两个方面。可以分为5种不同的类型:普通文件、目录文件、链接文件、设备文件和管道文件。

所谓的文件权限,是指对文件的访问权限,包括对文件的读、写、删除、执行。Linux 是一个多用户操作系统,它允许多个用户同时登录和工作。因此 Linux 将一个文件或目录与一个用户或组联系起来。访问控制列表(ACL:Access Control List)为计算机提供更好的访问控制,它的作用是限制包括root用户在内的所有用户对文件、资源或者套接字的访问。下面就来教大家简单的设置方法。

步骤1 检查系统核心

首先检查你的Linux系统的核心是否有支持ACL的功能。因为Linux系统并不是每一个版本的核心都有支持ACL的功能,而最简单的方法就是检查系统目前的核心能否支持:

[root@mail /]# cat /boot/config-kernel-version | grep -i ext3

CONFIG_EXT3_FS=m

CONFIG_EXT3_IDEX=y

CONFIG_EXT3_FS_XATTR_SHARING=y

CONFIG_EXT3_FS_XATTR_USER=y

CONFIG_EXT3_FS_XATTR_TRUSTED=y

CONFIG_EXT3_FS_ACL=y

此时如果能看到上面的几项则表示已经编译到核心中,ext3文件系统已支持ACL功能,这些功能在编译核心选项中都可以找到。如果编译时找不到,可以到ACL的官方网站来安装Kernel(acl.bestbits.at/)。

步骤2 挂载分区

你可以用下列的方式挂载分区并启用ACL:

#mount -t ext3 -o acl /dev/sda1 /fs1

你也可以直接写在/etc/fstab文件中,这样就可以在开机后支持ACL功能:

#vi /etc/fstab

步骤3 设置ACL权限

ACL常常针对个别用户来进行设置,下面是多个不同的例子:

例如需要创建test1、test2、test3三个用户,可以先用root身份登录系统,然后执行以下命令分别创建三个用户名和密码:

[root@mail root]#adduser test1

[root@mail root]#adduser test2

[root@mail root]#adduser test3

[root@mail root]#passwd test1

[root@mail root]#passwd test2

[root@mail root]#passwd test3

然后mount一个ext3文件到目录/fs1:

[root@mail root]#mount -t ext3 -o acl /dev/sda1 /fs1

再将test1 建立的文件设置读写的权限给test2 :

[root@mail root]#chmod -R 777 /fs1

让所有的用户都能增加文件到目录的权限:

先用test1登录系统,执行命令:

[test1@mail test1]# cd /fs1

[test1@mail fs1]# echo "Create by test1" > test1.txt

[test1@mail fs1]# chmod go-r test1.txt

[test1@mail fs1]# ll test1.txt

-rw——- 1 test1 test1 17 Jul 14 22:11 test1.txt

而如下操作则可以让除了test1有读写的权限外其他人没有读写test1.txt的权限(root除外),先用test2 登录系统后执行以下命令:

[test2@mail test2]# cd /fs1

[test2@mail fs1]# cat test1.txt

cat : test1.txt Permission denied

接着用test1登录系统,执行如下命令:

[test1@mail fs1]# setfacl -m u:test2:rw test1.txt

这样就修改权限允许test2 有这个文件的读写权限。再看一下它的文件属性的变化:

[test1@mail fs1]# ll

-rw-rw-r–+ 1 test1 test1 10 Feb 16 13:52 test1.txt

会看到后面多了一个“+”,表示这个文件使用ACL的属性设置,再用命令getfacl来看ACL的文件属性设置:

[test1@mail fs1]# getfacl test1.txt

# file &: test1.txt

# owner: test1

# group: test1

user::rw-

user:test2:rw-

group::rw-

mask::rw-

other::r–

可以看到 test2 有权限读写这个文件。

我们再用test2登录系统执行以下命令,看看发生了什么?

[test2@mail test2]# cd /fs1

[test2@mail fs1]# cat test1.txt

Create by test1

原来test2可以读取test1.txt文件了。

[test2@mail fs1]# echo "Modify by test2" >> test1.txt

[test2@mail fs1]# cat test1.txt

Create by test1

Modify by test2

现在test2也可以修改test1.txt文件了。

接着用test3 登录系统:

[test3@mail test3]# cd /fs1

[test3@mail fs1]# cat test1.txt

cat : test1.txt Permission denied

嘿嘿,除了test1、test2外没有其他用户有读写test1.txt的权限(root 除外)。

看着虽然有点晕,其实命令就是这么一两条,主要是把各种情况给大家讲清楚,这样,大家在使用Linux中才会发现,比起脆弱的Windows的权限防护,Linux实在是做得相当不错!

Read: 539

10年编程无师自通

原文:Teach Yourself Programming in Ten Years
作者:Peter Norvig
翻译:郭晓刚(foosleeper@163.net)
最后修订日期:2004-3-19
2005-01-12增加了新的译本链接。

本中文译本得到了Peter Norvig的许可。

为什么每个人都急不可耐?

走进任何一家书店,你会看见《Teach Yourself Java in 7 Days》(7天Java无师自通)的旁边是一长排看不到尽头的类似书籍,它们要教会你Visual Basic、Windows、Internet等等,而只需要几天甚至几小时。我在Amazon.com上进行了如下搜索:
pubdate: after 1992 and title: days and (title: learn or title: teach yourself)
(出版日期:1992年后 and 书名:天 and (书名:学会 or 书名:无师自通))
我一共得到了248个搜索结果。前面的78个是计算机书籍(第79个是《Learn Bengali in 30 days》,30天学会孟加拉语)。我把关键词“days”换成“hours”,得到了非常相似的结果:这次有253本书,头77本是计算机书籍,第78 本是《Teach Yourself Grammar and Style in 24 Hours》(24小时学会文法和文体)。头200本书中,有96%是计算机书籍。
结论是,要么是人们非常急于学会计算机,要么就是不知道为什么计算机惊人地简单,比任何东西都容易学会。没有一本书是要在几天里教会人们欣赏贝多芬或者量子物理学,甚至怎样给狗打扮。
让我们来分析一下像《Learn Pascal in Three Days》(3天学会Pascal)这样的题目到底是什么意思:

* 学会:在3 天时间里,你不够时间写一些有意义的程序,并从它们的失败与成功中学习。你不够时间跟一些有经验的程序员一起工作,你不会知道在那样的环境中是什么滋味。简而言之,没有足够的时间让你学到很多东西。所以这些书谈论的只是表面上的精通,而非深入的理解。如Alexander Pope(译注:英国诗人、作家,1688-1744)所言,一知半解是危险的(a little learning is a dangerous thing)

* Pascal:在3 天时间里你可以学会Pascal的语法(如果你已经会一门类似的语言),但你无法学到多少如何运用这些语法。简而言之,如果你是,比如说一个Basic程序员,你可以学会用Pascal语法写出Basic风格的程序,但你学不到Pascal真正的优点(和缺点)。那关键在哪里?Alan Perlis(译注:ACM第一任主席,图灵奖得主,1922-1990)曾经说过:“如果一门语言不能影响你对编程的想法,那它就不值得去学”。另一种观点是,有时候你不得不学一点Pascal(更可能是Visual Basic和java script之类)的皮毛,因为你需要接触现有的工具,用来完成特定的任务。但此时你不是在学习如何编程,你是在学习如何完成任务。

* 3天:不幸的是,这是不够的,正如下一节所言。

10年编程无师自通

一些研究者(Hayes、Bloom)的研究表明,在许多领域,都需要大约10 年时间才能培养出专业技能,包括国际象棋、作曲、绘画、钢琴、游泳、网球,以及神经心理学和拓扑学的研究。似乎并不存在真正的捷径:即使是莫扎特,他4 岁就显露出音乐天才,在他写出世界级的音乐之前仍然用了超过13年时间。再看另一种音乐类型的代表–披头士,他们似乎是在1964年的Ed Sullivan节目中突然冒头的。但其实他们从1957年就开始表演了,即使他们很早就显示出了巨大的吸引力,他们第一次真正的成功之作《Sgt. Peppers》也要到1967年才发行。Samuel Johnson(译注:英国诗人)认为10 年还是不够的:“任何领域的卓越成就都只能通过一生的努力来获得;稍低一点的代价也换不来。” (Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price.) 乔叟(译注:Chaucer,英国诗人,1340- 1400)也抱怨说:“生命如此短暂,掌握技艺却要如此长久。”(the lyf so short, the craft so long to lerne.)
下面是我在编程这个行当里获得成功的处方:

* 对编程感兴趣,因为乐趣而去编程。确定始终都能保持足够的乐趣,以致你能够将10年时间投入其中。

* 跟其他程序员交谈;阅读其他程序。这比任何书籍或训练课程都更重要。

* 编程。最好的学习是从实践中学习。用更加技术性的语言来讲,“个体在特定领域最高水平的表现不是作为长期的经验的结果而自动获得的,但即使是非常富有经验的个体也可以通过刻意的努力而提高其表现水平。”(p. 366),而且“最有效的学习要求为特定个体制定适当难度的任务,有意义的反馈,以及重复及改正错误的机会。”(p. 20-21)《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life》(在实践中认知:心智、数学和日常生活的文化)是关于这个观点的一本有趣的参考书。

* 如果你愿意,在大学里花上4年时间(或者再花几年读研究生)。这能让你获得一些工作的入门资格,还能让你对此领域有更深入的理解,但如果你不喜欢进学校,(作出一点牺牲)你在工作中也同样能获得类似的经验。在任何情况下,单从书本上学习都是不够的。“计算机科学的教育不会让任何人成为内行的程序员,正如研究画笔和颜料不会让任何人成为内行的画家”,Eric Raymond,《The New Hacker’s Dictionary》(新黑客字典)的作者如是说。我曾经雇用过的最优秀的程序员之一仅有高中学历;但他创造出了许多伟大的软件,甚至有讨论他本人的新闻组,而且股票期权让他达到我无法企及的富有程度(译注:指Jamie Zawinski,XEmacs和Netscape Navigator的作者)。

* 跟别的程序员一起完成项目。在一些项目中成为最好的程序员;在其他一些项目中当最差的一个。当你是最好的程序员时,你要测试自己领导项目的能力,并通过你的洞见鼓舞其他人。当你是最差的时候,你学习高手们在做些什么,以及他们不喜欢做什么(因为他们让你帮他们做那些事)。

* 接手别的程序员完成项目。用心理解别人编写的程序。看看在没有最初的程序员在场的时候理解和修改程序需要些什么。想一想怎样设计你的程序才能让别人接手维护你的程序时更容易一些。

* 学会至少半打编程语言。包括一门支持类抽象(class abstraction)的语言(如Java或C++),一门支持函数抽象(functional abstraction)的语言(如Lisp或ML),一门支持句法抽象(syntactic abstraction)的语言(如Lisp),一门支持说明性规约(declarative specification)的语言(如Prolog或C++模版),一门支持协程(coroutine)的语言(如Icon或Scheme),以及一门支持并行处理(parallelism)的语言(如Sisal)。

* 记住在“计算机科学”这个词组里包含“计算机”这个词。了解你的计算机执行一条指令要多长时间,从内存中取一个word要多长时间(包括缓存命中和未命中的情况),从磁盘上读取连续的数据要多长时间,定位到磁盘上的新位置又要多长时间。(答案在这里。)

* 尝试参与到一项语言标准化工作中。可以是ANSI C++委员会,也可以是决定自己团队的编码风格到底采用2个空格的缩进还是4个。不论是哪一种,你都可以学到在这门语言中到底人们喜欢些什么,他们有多喜欢,甚至有可能稍微了解为什么他们会有这样的感觉。

* 拥有尽快从语言标准化工作中抽身的良好判断力。

抱着这些想法,我很怀疑从书上到底能学到多少东西。在我第一个孩子出生前,我读完了所有“怎样……”的书,却仍然感到自己是个茫无头绪的新手。30个月后,我第二个孩子出生的时候,我重新拿起那些书来复习了吗?不。相反,我依靠我自己的经验,结果比专家写的几千页东西更有用更靠得住。
Fred Brooks在他的短文《No Silver Bullets》(没有银弹)中确立了如何发现杰出的软件设计者的三步规划:

1. 尽早系统地识别出最好的设计者群体。

2. 指派一个事业上的导师负责有潜质的对象的发展,小心地帮他保持职业生涯的履历。

3. 让成长中的设计师们有机会互相影响,互相激励。

这实际上是假定了有些人本身就具有成为杰出设计师的必要潜质;要做的只是引导他们前进。Alan Perlis说得更简洁:“每个人都可以被教授如何雕塑;而对米开朗基罗来说,能教给他的倒是怎样能够不去雕塑。杰出的程序员也一样”。
所以尽管去买那些Java书;你很可能会从中找到些用处。但你的生活,或者你作为程序员的真正的专业技术,并不会因此在24小时、24天甚至24个月内发生真正的变化。

参考文献

Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Hayes, John R., Complete Problem Solver, Lawrence Erlbaum, 1989.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.

答案

各种操作的计时,2001年夏天在一台典型的1GHz PC上完成:
执行单条指令            1 纳秒 = (1/1,000,000,000) 秒
从L1缓存中取一个word        2 纳秒
从主内存中取一个word        10 纳秒
从连续的磁盘位置中取一个word    200 纳秒
从新的磁盘位置中取一个word(寻址) 8,000,000纳秒 = 8毫秒

脚注

T. Capey指出Amazon上面《Complete Problem Solver》的页面中,《Teach Yourself Bengali in 21 days》和《Teach Yourself Grammar and Style》被列在了“购买此书的顾客还买了以下书籍”栏目里面。我猜其中一大部分察看这两本书的人都是从我这里过去的。

译本

感谢以下作者将本文翻译成其他语言:
日文(Yasushi Murakawa),中文(郭晓刚),繁体中文(Jason Chen),西班牙文(Carlos Rueda),德文(Stefan Ram),法文(P. E. Allary),土耳其文(?a??l Ulu?ahin)。

Peter Norvig (Copyright 2001)

Read: 554

如何成为一个Linux系统内核开发者

你想成知道如何成为一个Linux内核开发者么?或者你的老板告诉你,“去为这个设备写一个Linux驱动。“这篇文档的目的,就是通过描述你需要经历的过程和提示你如何和社区一起工作,来教给你为达到这些目的所需要知道的所有知识。本文也尝试解释社区为什么这样工作的一些原因。

  内核几乎全是用C写成的,有一些架构相关的部分是用汇编语言写成的。熟练掌握C语言是内核开发的必备条件。汇编语言(任何架构)的了解不是必须的,除非你准备做某个架构的底层开发。虽然下面这些书不能完全代替扎实的C语言教学和/或者成年累月的经验,他们还是不错的参考,如果用得着的话: – "The C Programming Language" 作者: Kernighan and Ritchie [Prentice Hall]- "Practical C Programming" 作者: Steve Oualline [O’Reilly]

  内核是用 GNU C 和 GNU 工具链写成的。虽然它符合 ISO C89 标准,它还是使用了一些标准中没有的扩展。内核是自成体系的 C 环境,它并不依赖标准C库,所以某些C语言标准是不支持的。任意长度long long类型除法和浮点数是不被允许的。有时候会很难理解内核对于它所使用的工具链和扩展的假定,而且不幸的是也没有关于它们的绝对的参考。请查阅gcc 的info页(`info gcc`)以获取有关信息。

  请记住你是在尝试学习如何与已经存在的开发社区一起工作。这是一群成分复杂的人们,他们对于代码,风格和步骤有高的标准。这些标准是经过时间检验的。

  他们发现遵循这些标准对于这样一个大规模的且地理上分散的团队是最佳的选择。尝试提前学习尽可能多的有关这些标准的知识,因为它们都有很好的文档;不要期望别人会遵照你或者你公司的行事方式。

  法律问题

  Linux内核源代码依照GPL发布。请参考源代码树下的COPYING文件,以获取有关这个许可证的详细信息。如果你对这个许可证有疑问,请联系你的律师,不要在Linux内核邮件列表里询问。邮件列表里的人们不是律师,你不应该依赖于他们对于法律问题的解释。

  文档

  Linux内核源代码树有很多文档,它们对于学习如何与内核社区交流来说有不可估量的价值。当新的功能加进内核的时候,通常建议作者把解释这个新功能的文档也加进内核。如果一个内核变动导致了内核对用户空间界面的改变,建议你把这个信息或者一个解释了这个变动的manpage的补丁发送给手册页的维护者 mtk-manpages@gmx.net。

  这里有一个内核源代码树里需要阅读的文件列表:

  README

  这个文件简单介绍了Linux内核的背景,并描述了配置和编译内核需要做哪些事情。内核新手应该从这里开始。

  Do*****entation/Changes

  这个文件介绍了成功编译和运行内核所需要各种不同软件的列表。

  Do*****entation/CodingStyle

  这个文件描述了Linux内核代码风格,还有背后的一些原因。所有的新代码的要符合这个文档里的准则。大多数维护者只会接受符合这些规则的补丁,很多人只看符合正确风格的代码。

  Do*****entation/SubmittingPatches

  Do*****entation/SubmittingDrivers

  这些文件非常详细的介绍了如何成功的创建和发送一个补丁,包括(但不限于):

  -Email内容

  -Email格式

  -发送给谁

  遵守所有这些规则并不能保证成功(对所有的补丁都需要进行内容和风格的详细检查),但是不遵守这些规则就一定不会成功。

  其他关于如何创建补丁的很好的文章有:

  “The Perfect Patch"

  www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt

  "Linux kernle patch submission format"

  linux.yyz.us/patch-format.html

  Do*****entation/stable_api_nonsense.txt

  这个文件解释了有意识的决定-不在内核里使用稳定的API-的原因,包括:

  -子系统分隔层(为了兼容?)

  -操作系统之间的驱动可移植性

  -缓和(或者阻止)内核源代码树的急速变动

  这个文档对于了解Linux的开发哲学是非常关键的,对于由开发其他操作系统转而开发Linux人也是很重要的。

  Do*****entation/SecurityBugs

  如果你感觉到你发现了Linux内核里的一个安全问题,请遵照这个文档里所描述的步骤来提醒内核开发者,并帮助解决问题。

  Do*****entation/ManagementStyle

  这个文档描述了Linux内核维护者如何运作,以及他们为什么这样做。它对于任何内核开发新手(或者任何对本话题感兴趣的人)来说是非常重要的。

  因为它解释了一些惯有的错误概念,可解决有关内核维护者独特行为的疑惑。

  Do*****entation/stable_kernel_rules.txt

  本文件描述了稳定版本内核释出的规则,还有如果你想对其中的一个版本做一些改动应该做些什么。

  Do*****entation/kernel-docs.txt

  一个有关内核开发的外部文档的列表。如果你在内核内部文档里没有找到? 要找的东西,你可以参考这个列表。

  Do*****entation/applying-patches.txt

  介绍了对于什么是补丁,以及如何应用补丁于不同的内核开发分支。

   

  内核也有很多可以从源代码自动产生的文档。这包括内核内部API的全面描述,有关如何处理好锁定的规则。这些文档会被创建于 Do*****entation/DocBook/文件夹中。在内核主源码树中通过运行下面的命令可以创建出PDF,Postscript, HTML 和manpage等不同格式的文档: make pdfdocsmake psdocsmake htmldocsmake mandocs

  成为一个内核开发者

  如果你对Linux内核开发一无所知,你可以看看Linux KernelNewbies项目:

  kernelnewbies.org

  它包含一个邮件列表,在那里你可以问任何有关内核开发的基础问题(在问问题之前先搜索一下存档,很可能这个问题已经被解答过了。)它还有一个IRC频道,你可以在里面实时的提问。它还有很多有用的文档,对于学习Linux内核开发很有用。

  这个网站有有关代码组织,子系统,当前项目(代码树之内的和之外的)的基本信息。它也描述了一些基本的“物流”信息,比如怎么样编译内核和怎么样打补丁。

  如果你不知道从何处起步,但是你想找一些任务来做以加入内核开发社区,请看一下Linux Kernel Janitor项目:

  janitor.kernelnewbies.org/

  这是一个很好的起步的地方。它描述了一些相对来说简单的内核中需要清理的和解决的问题。和负责这个项目的开发者一起工作,你会学到如何令你的补丁进入Linux内核树的基本知识,而且可能会为你指明下一步的发展方向,如果你自己尚不明确的话。

  如果你已经有了一段代码想要放到内核树里,但是需要某种形式的帮助,那么kernel-mentors项目就可以帮你的忙了。这是一个邮件列表,可以在下面找到:

  selenic.com/mailman/listinfo/kernel-mentors

  在你对Linux内核代码作任何实际的改动之前,必须要了解相关的代码是如何工作的。为了达到这个目的,没有比直接读它(很多困难的地方都有很好的注释)更好的方法了,甚至可能是在某个特殊工具的帮助下来阅读。很值得推荐的这样一种工具是Linux Cross-Reference项目,它可以把源代码以一种自我引用的、索引的网页形式显示出来。一个非常好的最新的内核代码仓库可以在这里找到: //sosdg.org/~coywolf/lxr

  所有这些事情有时候很难做到。要想完美做到这些要求可能需要几年的时间。这是一个持续的发展过程,需要很多耐心和决心。但是不要放弃,这是可以实现的。很多人已经做到了这一点,每个人都经历过你现在这个阶段。

Read: 543