linux内核编写翻译,配置本机驱动,linux内核

inux 2.6.15.6内核配置(unfinished)

轻松学习Linux操作系统内核源码的方法

linux内核编译,配置本机驱动,linux内核

1.前言                                                  

编译linux内核失败的原因很多时候就是驱动选错,适合自己本机的驱动没编译进去。面对特殊平台(或者有些洁癖者,我就是^_^),要编译精简内核,只要本机驱动,其他都不需要。面对内核里面这么多驱动,不懂硬件的我们,看到都头大。本人第一次安装gentoo的时候,内核编译了5次,前4次主要失败原因是以太网卡驱动、无线网卡驱动、显卡驱动、声卡驱动都没一次性配置正确。虽然gentoo提供了genkernel命令,可以自动帮你编译内核,但还是想自己手工尝试下。

2.获取本机驱动信息                              

既然跟内核挂钩,我们获取本机内核驱动信息最直接的办法就是使用lspci命令,这个命令可以输出本机驱动信息,配合-k选项可以看到此驱动在内核的位子。

一般编译内核的场景:更新旧内核,安装定制版linux发行版(gentoo,arch等),嵌入式平台,其他特殊平台等等…

大部分场景在下都可以使用lspci命令,安装gentoo的livecd版都提供了该工具,如果其他系统没有就安装该工具

debian系列安装

1 $:sudo apt-get install pciutils 

或者源码编译安装,下载地址

然后我们获取本机环境现存的驱动信息,下面是我的机器上面的信息:

 1 $:lspci -k
 2 00:00.0 Host bridge: Intel Corporation 2nd Generation Core Processor Family DRAM Controller (rev 09)
 3     Subsystem: Lenovo Device 21e2
 4 00:01.0 PCI bridge: Intel Corporation Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port (rev 09)
 5     Kernel driver in use: pcieport
 6 00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
 7     Subsystem: Lenovo Device 21e3
 8     Kernel driver in use: i915
 9 00:16.0 Communication controller: Intel Corporation 6 Series/C200 Series Chipset Family MEI Controller #1 (rev 04)
10     Subsystem: Lenovo Device 21e2
11     Kernel driver in use: mei_me
12 00:1a.0 USB controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #2 (rev 04)
13     Subsystem: Lenovo Device 21e2
14     Kernel driver in use: ehci-pci
15 00:1b.0 Audio device: Intel Corporation 6 Series/C200 Series Chipset Family High Definition Audio Controller (rev 04)
16     Subsystem: Lenovo Device 21e2
17     Kernel driver in use: snd_hda_intel
18 00:1c.0 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 1 (rev b4)
19     Kernel driver in use: pcieport
20 00:1c.1 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 2 (rev b4)
21     Kernel driver in use: pcieport
22 00:1c.2 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 3 (rev b4)
23     Kernel driver in use: pcieport
24 00:1c.3 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 4 (rev b4)
25     Kernel driver in use: pcieport
26 00:1c.7 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 8 (rev b4)
27     Kernel driver in use: pcieport
28 00:1d.0 USB controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #1 (rev 04)
29     Subsystem: Lenovo Device 21e2
30     Kernel driver in use: ehci-pci
31 00:1f.0 ISA bridge: Intel Corporation HM65 Express Chipset Family LPC Controller (rev 04)
32     Subsystem: Lenovo Device 21e2
33     Kernel driver in use: lpc_ich
34 00:1f.2 SATA controller: Intel Corporation 6 Series/C200 Series Chipset Family 6 port SATA AHCI Controller (rev 04)
35     Subsystem: Lenovo Device 21e2
36     Kernel driver in use: ahci
37 00:1f.3 SMBus: Intel Corporation 6 Series/C200 Series Chipset Family SMBus Controller (rev 04)
38     Subsystem: Lenovo Device 21e2
39 01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Seymour [Radeon HD 6400M/7400M Series] (rev ff)
40     Kernel driver in use: radeon
41 03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 06)
42     Subsystem: Lenovo Device 21e2
43     Kernel driver in use: r8169
44 04:00.0 System peripheral: Ricoh Co Ltd PCIe SDXC/MMC Host Controller (rev 07)
45     Subsystem: Lenovo Device 21e2
46     Kernel driver in use: sdhci-pci
47 09:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8188CE 802.11b/g/n WiFi Adapter (rev 01)
48     Subsystem: Realtek Semiconductor Co., Ltd. Device 8195
49     Kernel driver in use: rtl8192ce

我们可以看到每个驱动后面都有Kernel driver in
use:,代表驱动在内核中的链接位子。

3.配置内核驱动                              

下载内核源码
4.3.3,解压后进入源码目录执行:

1 $:make menuconfig

接下来就会弹出编译选项界面,如图:

图片 1

我们可以看到上面有快捷键操作说明,我重点在</> for
Search,在界面直接按反斜杠,进入搜索界面。接下来挑个重点驱动说明一下,我们看

Network controller,可以看到型号是Realtek  RTL8188CE,然后Kernel driver
in use: rtl8192ce,在内核的位子链接是rtl8192ce

我们按</>,输入rtl8192ce,然后回车,就会出现详细位子,如图:

图片 2图片 3

我们可以看到Pormt提示上面跟我要的型号一样,具体选项的前面有个(1),注意这里同一个Symbol(就是刚刚输入的rtl8192ce)有的对应很多选项,根据前面的序号,按对应的数字就可以直接进入选项,按<esc>可以返回来这个界面。这里,我直接按1。按1后,就到具体选项了,如图:

图片 4

我们看到上面,发行版为了兼容各种机器,把所有Realtek的驱动都编译进成了模块。接下来就保留自己的驱动型号,去掉其他不要的。

剩下的驱动跟上面操作一样的,还有的不必要驱动是直接编译进了内核,非模块。对照自己的驱动,其他都可以不要。配置好后的内核

配置文件最好保存下来,如果驱动没配置成功,再配置的时候把保存的配置文件复制一份到源码目录,命名为.config。继续make
menuconfig配置。 

1.前言
编译linux内核失败的原因很多时候就是驱动选错,适合自己本机的驱动没编译进去。面对特殊…

对于每一个配置选项,用户可以回答”y”、”m”或”n”。其中”y”表示将相应特性的支持或设备驱动程序编译进内核;”m”表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;”n”表示内核不提供相应特性或驱动程序的支持。只有<>才能选择M

在微软Windows
7大行其道的今天,你是否还坚持应用Linux操作系统。如果你是Linux操作系统的老用户。
这里为你讲解的问题会对你linux内核配置有所帮助。Linux内核的名字也是“Linux”。Linux操作系统也是自由软件和开放源代码发展中最著名的例子。

注意: 不同的内核版本配置选项(或组织)可能不同, 但原理都是一样的!

针对好多Linux
爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制;
一.核心源程序的文件组织:
1.Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核心(例如2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心。

1. General setup(通用选项)

压源文件后进入目录执行 make menuconfig 出错
原因: 缺少文件 build-seeential 和 libncurses5-dev
方法:apt-get install libncurses5-dev
再执行 make menuconfig 出现如下界面

另外, 关于compile in, compile as module的选择: 根文件系统,
根文件系统所处的设备, PS/2鼠标驱动不能编译为模块!

本文基于稳定的2.2.5源代码,第二部分的实现平台为 RedHat Linux 6.0。
2.核心源程序的文件按树形结构进行组织,在源程序树的最上层你会看到这样一些目录:
●Arch
:arch子目录包括了所有和体系结构相关的核心代码。它的每一个子目录都代表一种支持的体系结构,例如i386就是关于intel
cpu及与之相兼容体系结构的子目录。PC机一般都基于此目录;
●Include:
include子目录包括编译核心所需要的大部分头文件。与平台无关的头文件在
include/linux子目录下,与 intel
cpu相关的头文件在include/asm-i386子目录下,而include/scsi目录则是有关scsi设备的头文件目录;
●Init:
这个目录包含核心的初始化代码(注:不是系统的引导代码),包含两个文件main.c和Version.c,这是研究核心如何工作的一个非常好的起点。
●Mm :这个目录包括所有独立于 cpu
体系结构的内存管理代码,如页式存储管理内存的分配和释放等;而和体系结构相关的内存管理代码则位于arch/*/mm/,例如arch/i386/mm/Fault.c
●Kernel:主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c;同样,和体系结构相关的代码在arch/*/kernel中;
●Drivers:
放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录:如,/block
下为块设备驱动程序,比如ide(ide.c)。如果你希望查看所有可能包含文件系统的设备是如何初始化的,你可以看drivers/block/genhd.c中的device_setup()。它不仅初始化硬盘,也初始化网络,因为安装nfs文件系统的时候需要网络其他:
如, Lib放置核心的库代码; Net,核心与网络相关的代码;
Ipc,这个目录包含核心的进程间通讯的代码; Fs
,所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统,例如fat和ext2;
Scripts, 此目录包含用于配置核心的脚本文件等。
一般,在每个目录下,都有一个 .depend 文件和一个 Makefile
文件,这两个文件都是编译时使用的辅助文件,仔细阅读这两个文件对弄清各个文件这间的联系和依托关系很有帮助;而且,在有的目录下还有Readme
文件,它是对该目录下的文件的一些说明,同样有利于我们对内核源码的理解;
二.解读实战:为你的内核增加一个系统调用
虽然,Linux
的内核源码用树形结构组织得非常合理、科学,把功能相关联的文件都放在同一个子目录下,这样使得程序更具可读性。然而,Linux
的内核源码实在是太大而且非常复杂,即便采用了很合理的文件组织方法,在不同目录下的文件之间还是有很多的关联,分析核心的一部分代码通常会要查看其它的几个相关的文件,而且可能这些文件还不在同一个子目录下。
体系的庞大复杂和文件之间关联的错综复杂,可能就是很多人对其望而生畏的主要原因。当然,这种令人生畏的劳动所带来的回报也是非常令人着迷的:你不仅可以从中学到很多的计算机的底层的知识(如下面将讲到的系统的引导),体会到整个操作系统体系结构的精妙和在解决某个具体细节问题时,算法的巧妙;而且更重要的是:在源码的分析过程中,你就会被一点一点地、潜移默化地专业化;甚至,只要分析十分之一的代码后,你就会深刻地体会到,什么样的代码才是一个专业的程序员写的,什么样的代码是一个业余爱好者写的。
为了使读者能更好的体会到这一特点,下面举了一个具体的内核分析实例,希望能通过这个实例,使读者对Linux的内核的组织有些具体的认识,从中读者也可以学到一些对内核的分析方法。

[*]Prompt for development and/or incomplete code/drivers,设置界面中显示还在开发或者还没有完成的代码与驱动,最好选上,许多设备都需要它才能配置。

图片 5 

Code maturity level options —>

以下即为分析实例:
A、操作平台:
硬件:cpu intel Pentium II ;
软件:RedHat Linux 6.0; 内核版本2.2.5
B、相关内核源代码分析:
1.系统的引导和初始化:Linux 系统的引导有好几种方式:常见的有 Lilo,
Loadin引导和Linux的自举引导(bootsect-loader),而后者所对应源程序为arch/i386/boot/bootsect.S,它为实模式的汇编程序,限于篇幅在此不做分析;无论是哪种引导方式,最后都要跳转到

[ ]Cross-compiler tool prefix,交叉编译工具前缀,如果你要使用交叉编译工具的话输入相关前缀。默认不使用。嵌入式Linux更不需要。

输入要添加的配置文件 保存退出
执行 make zImage
等待一分钟左右时间生成linux 映像文件
zImage,这样你就完成了linux内核配置。

[*] Prompt for development and/or incomplete code/drivers  (y)

arch/i386/Kernel/setup.S,
setup.S主要是进行时模式下的初始化,为系统进入保护模式做准备;此后,系统执行
arch/i386/kernel/head.S (对经压缩后存放的内核要先执行
arch/i386/boot/compressed/head.S);
head.S 中定义的一段汇编程序setup_idt ,它负责建立一张256项的 idt
表(Interrupt Descriptor
Table),此表保存着所有自陷和中断的入口地址;其中包括系统调用总控程序
system_call
的入口地址;当然,除此之外,head.S还要做一些其他的初始化工作;
2.系统初始化后运行的第一个内核程序asmlinkage void __init
start_kernel(void) 定义在
/usr/src/linux/init/main.c中,它通过调用usr/src/linux/arch/i386/kernel/traps.c
中的一个函数
void __init trap_init(void) 把各自陷和中断服务程序的入口地址设置到
idt
表中,其中系统调用总控程序system_cal就是中断服务程序之一;void __init
trap_init(void) 函数则通过调用一个宏
set_system_gate(SYSCALL_VECTOR,&system_call);
把系统调用总控程序的入口挂在中断0x80上;
其中SYSCALL_VECTOR是定义在
/usr/src/linux/arch/i386/kernel/irq.h中的一个常量0x80; 而
system_call
即为中断总控程序的入口地址;中断总控程序用汇编语言定义在/usr/src/linux/arch/i386/kernel/entry.S中;
3.中断总控程序主要负责保存处理机执行系统调用前的状态,检验当前调用是否合法,
并根据系统调用向量,使处理机跳转到保存在 sys_call_table
表中的相应系统服务例程的入口;
从系统服务例程返回后恢复处理机状态退回用户程序;
而系统调用向量则定义在/usr/src/linux/include/asm-386/unistd.h
中;sys_call_table
表定义在/usr/src/linux/arch/i386/kernel/entry.S 中; 同时在
/usr/src/linux/include/asm-386/unistd.h
中也定义了系统调用的用户编程接口;
4.由此可见 , linux 的系统调用也象 dos 系统的 int 21h 中断服务, 它把0x80
中断作为总的入口, 然后转到保存在
sys_call_table 表中的各种中断服务例程的入口地址 ,
形成各种不同的中断服务;
由以上源代码分析可知, 要增加一个系统调用就必须在 sys_call_table
表中增加一项 ,
并在其中保存好自己的系统服务例程的入口地址,然后重新编译内核,当然,系统服务例程是必不可少的。
由此可知在此版linux内核源程序中,与系统调用相关的源程序文件就包括以下这些:
arch/i386/boot/bootsect.S
arch/i386/Kernel/setup.S
arch/i386/boot/compressed/head.S
arch/i386/kernel/head.S
init/main.c
arch/i386/kernel/traps.c
arch/i386/kernel/entry.S
arch/i386/kernel/irq.h
include/asm-386/unistd.h
当然,这只是涉及到的几个主要文件。而事实上,增加系统调用真正要修改文件只有include/asm-386/unistd.h和arch/i386/kernel/entry.S两个。
C、对内核源码的修改:
1.在kernel/sys.c中增加系统服务例程如下:
asmlinkage int sys_addtotal(int numdata)
{
int i=0,enddata=0;
while(i<=numdata)
enddata+=i++;
return enddata;
}
该函数有一个 int 型入口参数 numdata , 并返回从 0 到 numdata 的累加值;
当然也可以把系统服务例程放在一个自己定义的文件或其他文件中,只是要在相应文件中作必要的说明;
2.把 asmlinkage int sys_addtotal( int)
的入口地址加到sys_call_table表中:
arch/i386/kernel/entry.S 中的最后几行源代码修改前为:
… …
.long SYMBOL_NAME(sys_sendfile)
.long SYMBOL_NAME(sys_ni_syscall) /* streams1 */
.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
.long SYMBOL_NAME(sys_vfork) /* 190 */
.rept NR_syscalls-190
.long SYMBOL_NAME(sys_ni_syscall)
.endr
修改后为: … …
.long SYMBOL_NAME(sys_sendfile)
.long SYMBOL_NAME(sys_ni_syscall) /* streams1 */
.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
.long SYMBOL_NAME(sys_vfork) /* 190 */
/* add by I */
.long SYMBOL_NAME(sys_addtotal)
.rept NR_syscalls-191
.long SYMBOL_NAME(sys_ni_syscall)
.endr

[ ]Local version – append to kernel release,自定义版本,也就是uname -r可以看到的版本,可以自行修改,没多大意义。

  1. Linux和uClinux比较分析
  2. linux下修改IP、DNS、路由命令行设置
  3. linux多线程编程—-信号量的使用
  4. linux下logrotate配置和理解
  5. 微软Windows 8是否借鉴Linux

; 选择尚未完全测试的代码alpha-test态),事实上它是安全的,建议选择.

  1. 把增加的 sys_call_table
    表项所对应的向量,在include/asm-386/unistd.h
    中进行必要申明,以供用户进程和其他系统进程查询或调用:
    增加后的部分 /usr/src/linux/include/asm-386/unistd.h 文件如下:
    … …
    #define __NR_sendfile 187
    #define __NR_getpmsg 188
    #define __NR_putpmsg 189
    #define __NR_vfork 190
    /* add by I */
    #define __NR_addtotal 191
    4.测试程序(test.c)如下:
    #include
    #include
    _syscall1(int,addtotal,int, num)
    main()
    {
    int i,j;
    do
    printf(“Please input a number\n”);
    while(scanf(“%d”,&i)==EOF);
    if((j=addtotal(i))==-1)
    printf(“Error occurred in syscall-addtotal();\n”);
    printf(“Total from 0 to %d is %d \n”,i,j);
    }
    对修改后的新的内核进行编译,并引导它作为新的操作系统,运行几个程序后可以发现一切正常;在新的系统下对测试程序进行编译(*注:由于原内核并未提供此系统调用,所以只有在编译后的新内核下,此测试程序才能可能被编译通过),运行情况如下:
    $gcc -o test test.c
    $./test
    Please input a number
    36
    Total from 0 to 36 is 666
    可见,修改成功;
    而且,对相关源码的进一步分析可知,在此版本的内核中,从/usr/src/linux/arch/i386/kernel/entry.S
    文件中对 sys_call_table
    表的设置可以看出,有好几个系统调用的服务例程都是定义在/usr/src/linux/kernel/sys.c
    中的同一个函数:
    asmlinkage int sys_ni_syscall(void)
    {
    return -ENOSYS;
    }
    例如第188项和第189项就是如此:
    … …
    .long SYMBOL_NAME(sys_sendfile)
    .long SYMBOL_NAME(sys_ni_syscall) /* streams1 */
    .long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
    .long SYMBOL_NAME(sys_vfork) /* 190 */
    … …
    而这两项在文件 /usr/src/linux/include/asm-386/unistd.h 中却申明如下:
    … …
    #define __NR_sendfile 187
    #define __NR_getpmsg 188 /* some people actually want streams */
    #define __NR_putpmsg 189 /* some people actually want streams */
    #define __NR_vfork 190
    由此可见,在此版本的内核源代码中,由于asmlinkage int
    sys_ni_syscall(void) 函数并不进行任何操作,所以包括 getpmsg,
    putpmsg 在内的好几个系统调用都是不进行任何操作的,即有待扩充的空调用;
    但它们却仍然占用着sys_call_table表项,估计这是设计者们为了方便扩充系统调用而安排的;
    所以只需增加相应服务例程(如增加服务例程getmsg或putpmsg),就可以达到增加系统调用的作用。

[ ]Automatically append version information to the version string,自动生成版本信息。这个选项会自动探测你的内核并且生成相应的版本,使之不会和原先的重复。这需要Perl的支持。由于在编译的命令make-kpkg 中我们会加入- – append-to-version 选项来生成自定义版本,所以这里选N。

7大行其道的今天,你是否还坚持应用Linux操作系统。如果你是Linux操作系统的老用户。
这里为你讲解的问题会对你linux内核配置…

[*] Select only drivers expected to compile cleanly  (y)

Kernel compression mode (LZMA),选择压缩方式。

;
隐藏可能存在问题的驱动,建议选择,如果没找到对应设备的驱动,将它取消试试.

[ ]Support for paging of anonymous memory (swap),交换分区支持,也就是虚拟内存支持,嵌入式不需要。

General setup —>

[*]System V IPC,为进程提供通信机制,这将使系统中各进程间有交换信息与保持同步的能力。有些程序只有在选Y的情况下才能运行,所以不用考虑,这里一定要选。

()  Local version – append to kernel release (enter,输入字符窜)

[*]POSIX Message Queues,这是POSIX的消息队列,它同样是一种IPC(进程间通讯)。建议你最好将它选上。

; 从2.6.8的版本起,可以在内核版本号后面添加个性化字符窜.

[*]BSD Process Accounting,允许进程访问内核,将账户信息写入文件中,主要包括进程的创建时间/创建者/内存占用等信息。可以选上,无所谓。

[ ] Automatically append version information to the version string
(NEW)  (n)

[*]BSD Process Accounting version 3 file format,选用的话统计信息将会以新的格式(V3)写入,注意这个格式和以前的 v0/v1/v2 格式不兼容,选不选无所谓。

; 这个没看懂,先不选上.

[ ]Export task/process statistics through netlink (EXPERIMENTAL),通过通用的网络输出工作/进程的相应数据,和BSD不同的是,这些数据在进程运行的时候就可以通过相关命令访问。和BSD类似,数据将在进程结束时送入用户空间。如果不清楚,选N(实验阶段功能,下同)。

[*] Support for paging of anonymous memory (swap)  (y)

[ ]Auditing support,审计功能,某些内核模块需要它(SELINUX),如果不知道,不用选。

; 如果使用了swap分区提供虚拟内存,一定要选上它.

[ ]RCU Subsystem,一个高性能的锁机制RCU 子系统,不懂不了解,按默认就行。

[*] System V IPC (y)

[ ]Kernel .config support,将.config配置信息保存在内核中,选上它及它的子项使得其它用户能从/proc/ config.gz中得到内核的配置,选上,重新配置内核时可以利用已有配置

; System V 的进程间通信, 选上.

Enable access to .config through /proc/config.gz,上一项的子项,可以通过/proc/ config.gz访问.config配置,上一个选的话,建议选上。

[*] POSIX Message Queues (y)

(16)Kernel log buffer size (16 => 64KB, 17 => 128KB) ,内核日志缓存的大小,使用默认值即可。12 => 4 KB,13 => 8 KB,14 => 16 KB单处理器,15 => 32 KB多处理器,16 => 64 KB,17 => 128 KB。

; POSIX消息队列, 选上.

[ ]Control Group support(有子项),使用默认即可,不清楚可以不选。

[*] BSD Process Accounting (y)

Example debug cgroup subsystem,cgroup子系统调试例子

; 如果选上,user
process可以通过系统调用使内核在它退出时将相关信息写入某个文件(如进程创建时间,拥有者,命令,内存使用量…)

Namespace cgroup subsystem,cgroup子系统命名空间

选上它,可以在应用程序中利用这些信息.

Device controller for cgroups,cgroups设备控制器

[*] BSD Process Accounting version 3 file format (y)

Cpuset support,只有含有大量CPU(大于16个)的SMP系统或NUMA(非一致内存访问)系统才需要它。

; 将前面所述的进程信息记录到v3格式的文件中, 选上它

[ ]enable deprecated sysfs features to support old userspace tools,在某些文件系统上(比如debugfs)提供从内核空间向用户空间传递大量数据的接口,一般不选。

[*] Sysctl support (y)

[ ]Kernel->user space relay support (formerly relayfs),内核系统区和用户区进行传递通讯的支持,这个选项在特定文件系统(relayfs)中提供数据接口支持,它可以支持从内核空间到用户空间的大批量数据传递的支持。不清楚可以不选。

; 提供动态更改内核参数与变量的接口, 而不需要重新启动系统.
打开这个选项将会增加内核的体积至少8KB。

[ ]Namespaces support,(有子项)命名空间支持,允许服务器为不同的用户信息提供不同的用户名空间服务,不清楚可以不选。

如果你的内核仅用制作安装与恢复系统系统盘那么可以不选,
以减少对内存的占用.

[ ]Initial RAM filesystem and RAM disk (initramfs/initrd) support,初始RAM的文件和RAM磁盘( initramfs /initrd)支持(如果要采用initrd启动则要选择,否则可以不选),不需要,不用选。嵌入式linux一般不选。

[ ] Auditing support  (n)

[ ]Optimize for size,优化大小,-Os代替-O2参数,可能会有二进制错误问题,一般不选。

; 允许其他内核子系统的内核审查,不知道什么鸟意思,不选上.

(0)Default panic timeout,添0即可。

[*] Kernel Userspace Events  (y)

[*]Configure standard kernel features (for small systems),特殊内核用到,可以不选,嵌入式linux则必选。

; 开启内核-用户空间事件层,它是比socket简单的kernel-user通信机制.
这样应用程序就可以通过监听不用轮询系统设备或文件

[ ]Enable the Anonymous Shared Memory Subsystem,启用匿名共享内存子系统,不清楚可以不选。

[ ] Kernel .config support  (n)

[ ]Enable AIO support,支持AIO(Asynchronous I/O 异步事件非阻塞I/O),(包含aio.h, aio_read,向内核发出读命令,aio_write向内核写命令,详细见‘AIO介绍‘文档),AIO机制为服务器端高并发应用程序提供了一种性能优化的手段。加大了系统吞吐量,所以一般用于大型服务器,一般不用选。

; 将.config文件编译到内核中, 以显示运行中的内核使用哪个选项.不要选择.

[ ]Kernel Performance Events And Counters(有子项),不清楚,不选。

()  Initramfs source file(s)  (n)

[*]Enable VM event counters for /proc/vmstat,允许在/proc/vmstat中包含虚拟内存事件记数器。

; 好像是RAM FS初始化的吧,不知道什么鸟东西,不选!

[*]Enable SLUB debugging support,支持SLUB内存分配管理器调试,

[ ] Optimize for size (Look out for broken compilers!)  (n)

[ ]Disable heap randomization,禁用随即head,选不选均可。

; 用gcc编译内核时,优化选项是 -O2,选择它将改为-Os,
生成比较小的内核.(老版本的gcc可能因此产生错误代码)

Choose SLAB allocator (SLUB (Unqueued Allocator))  —>, 选择内存分配管理器,强烈推荐使用SLUB。

[ ] Configure standard kernel features (for small systems)  —>
(n)

[ ]Profiling support,剖面支持,用一个工具来扫描和计算计算机的剖面图,支持系统测评,一般开发人员使用,不选。

; 针对小系统 (embedded)裁减内核, 桌面系统不用选择.

[ ]Kprobes,调试人员使用,不选。

Loadable module support  —>

GCOV-based kernel profiling  —>(有子项),默认即可。

[*] Enable loadable module support   (y)

2. Enable loadable module support(可加载模块)

; 使内核支持模块,当然要选择! (使用modprobe, lsmod, modinfo, insmod,
rmmod工具…)

[ ]Forced module loading, 强行加载模块,不建议选。

[*] Module unloading (y)

[*]Module unloading,支持模块卸载,必须选上。

; 卸载模块,选择!(有些模块一旦加载就不能卸载, 不管是否选择了这个选项)

[ ]Forced module unloading,强行卸载模块,即使内核认为这样并不安全,也就是说你可以把正在使用中的模快卸载掉。如果你不是内核开发人员或者骨灰级的玩家,不建议选。

[*] Forced module unloading  (y)

[ ]Module versioning suppor,这个功能可以让你使用其它版本的内核模块,除非特殊需要,一般不选。

; 强制卸载内核, 即便内核认为该行为不安全的时候.( rmmod -f
强制卸载,不等停止使用模块)

[ ]Source checksum for all modules,这个功能是为了防止更改了内核模块的代码但忘记更改版本号而造成版本冲突,现在很少使用,不选。

[ ]  Module versioning support (EXPERIMENTAL)  (n)

3. Enable the block layer(块设备层)

; 一般地,我们编译的模块是用于当前运行的内核,
选择该选项可以针对其他的内核编译模块. 先不选择.

[*]Support for large (2TB+) block devices and files,仅在使用大于2TB的块设备时需要

2.6.15.6内核配置(unfinished) 注意:
不同的内核版本配置选项(或组织)可能不同, 但原理都是一样的! 另外,
关于compile in, compile as module的选择…

[*]Block layer SG support v4,通用SCSI设备第四版支持。

[*]Block layer data integrity support,块设备数据完整性支持。

[*]IO Schedulers  —>(有子项),IO调度器

[ ]Anticipatory I/O scheduler,抢先式I/O调度器,大多数块设备只有一个物理查找磁头(例如一个单独的SATA硬盘),将多个随机的小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量.适用于大多数环境,特别是写入较多的环境(比如文件服务器)

[ ]Deadline I/O scheduler,期限式I/O调度器,轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库)。

[ ]CFQ I/O scheduler,使用QoS策略为所有任务分配等量的带宽,避免进程被饿死并实现了较低的延迟,可以认为是上述两种调度器的折中.适用于有大量进程的多用户系统CFQ调度器尝试为所有进程提供相同的带宽。它将提供平等的工作环境,对于桌面系统很合适。

Default I/O scheduler (CFQ)  —>默认IO调度器有上面三个IO调度器:抢先式是传统的,它的原理是一有响应,就优先考虑调度。如果你的硬盘此时在运行一项工作,它也会暂停下来先响应用户。期限式则是:所有的工作都有最终期限,在这之前必须完成。当用户有响应时,它会根据自己的工作能否完成,来决定是否响应用户。CFQ则是平均分配资源,不管你的响应多急,也不管它的工作量是多少,它都是平均分配,一视同仁的。

4. System Type(arm 占用配置,一般是厂家提供,与第7项代替了原有的Processor type and features)

5. [ ]FIQ Mode Serial Debugger,一般不选。

6. Bus support(总线支持)

PCI support,PCI总线支持,主板上最长用的插槽,最好选上,arm linux可以不选,arm一般没有PCI总线。

PCCard (PCMCIA/CardBus) support,一般笔记本有这种插槽,笔记本选上,arm linux 不选。

7. Kernel Features(内核特征)

[ ] Tickless System (Dynamic Ticks),非固定平率系统,能让内核运行的更有效率,并且省电,pc下可选,特别是笔记本,arm linux一般不用选。

[ ] High Resolution Timer Support,支持高频率时间发生器,需要硬件兼容,但大多数PC和ARM都不支持,不选

Memory split (2G/2G user/kernel split)  —>,内核与用户空间各占2G,内核空间0-0x7FFFFFFF,用户空间80000000-FFFFFFFF

Preemption Model (No Forced Preemption (Server))  —>,内核抢占模式。普通PC用户一般选2,arm linux 选1就可以。

No Forced Preemption (Server),禁止内核抢占,适合服务器环境。针对于高吞吐量的设计,但有可能延时较长,适用于服务器或科学运算,或向要最大的运算能力,而不理会调度上的延时。

Voluntary Kernel Preemption (Desktop),自愿内核抢占,适合普通的桌面环境。已降低吞吐量为代价,降低内核调度的最大延时,提供更快的应用程序响应,即使系统已经高负荷运转,应用程序仍然能运行的很“流畅”,适合用户桌面环境

Preemptible Kernel (Low-Latency Desktop),主动内核抢占,适合运行实时程序的环境。更低的吞吐量,进一步降低内核的调度延时,使应用程序更加流畅。

[ ]Compile the kernel in Thumb-2 mode,编译Thumb-2 mode内核,一般不选

[*] Use the ARM EABI to compile the kernel,与下面绑定配置。

[*] Allow old ABI binaries to run with this kernel (EXPERIMENTAL),对于嵌入式系统(jffs2 yaffs2),这两个要选上,否则很可能启动的时候报错(kernel panic- not syncing: Attempted to kill init!)

[ ] High Memory Support (EXPERIMENTAL)(有子项), 1G物理内存以下不选,超过1G才选。(配置略有变化,以前的选项是OFF(<1G),4G(>1G && <4G),64G(>4G))。

Allocate 2nd-level pagetables from highmem,1G物理内存以下不选,超过1G(小于4G)才选

Allocate 3nd-level pagetables from highmem,大于4G,选择此项目。

Memory model (Flat Memory)  —>,一般选”Flat Memory”,其他选项涉及内存热插拔。

[ ] Enable KSM for page merging,允许linux内核识别出包含相同内容的内存页,然后合并这些内存页,将数据整合在一个位置可以多次引用,特殊功能,不用选。

(4096) Low address space to protect from user allocation,默认4096即可

[ ] Use kernel mem{cpy,set}() for {copy_to,clear}_user() (EXPERIMENTAL),不清楚可以不选。


附:yaffs2 文件系统:Kernel panic – not syncing: Attempted to kill init!  

在内核挂载根文件系统时,提示Kernel panic – not syncing: Attempted to kill init!的解决方法:

方法1:

Kernel Features  —>

[*] Use the ARM EABI to compile the kernel                 

[*]   Allow old ABI binaries to run with this kernel (EXPERIMENTA)

方法2:

修改busybox的Makefile

修改

CC=$(CROSS_COPILE)gcc

CC=$(CROSS_COPILE)gcc -march=armv4t

一般海思编译器选择此选项,linux-gcc-3.4.5 以下的编译器,不用选,如果用4.3.3(支持EABI的编译器)以上的最好选上。

 

8. Boot options

一般不需要配置,u-boot会把启动参数传递给内核。如果bootloader没有传参数,可以配置启动参数,类似下面这样:

(0x0) Compressed ROM boot loader base address

(0x0) Compressed ROM boot loader BSS address

(mem=32M console=ttySAC0 root=/dev/ram initrd=0x30800000,4M ramdisk_size=4096 rw) Default kernel command string

 

9. CPU Power Management

[ ] CPU idle PM support,允许软件控制的空闲进程电源管理,arm linux一般不用选。

10. Floating point emulation(浮点运算,(arm专用)看arm是否支持硬浮点协处理器,支持的话选择VFP,不支持选择NWFPE)

[ ] NWFPE math emulation

[ ] FastFPE math emulation (EXPERIMENTAL)

[*] VFP-format floating point maths

[ ] Advanced SIMD (NEON) Extension support

10. Userspace binary formats(二进制支持)

[*] Kernel support for ELF binaries,必须选,否则内核可能不能启动,其他可以全部不选,

[ ] Write ELF core dumps with partial segments

< > Kernel support for a.out and ECOFF binaries

< > Kernel support for MISC binaries

11. Power management options(电源管理)

一般用于笔记本,PC和arm可以不选。

[*] Power Management support,选择此项,下面的项才能可见

[ ] Power Management Debug Support,调试用,不用选

[*] Suspend to RAM and standby,待机到内存,即内存供电而暂时关闭硬盘等外设。

< > Advanced Power Management Emulation,高级电源管理,

[ ] Run-time PM core functionality,允许对运行中接入的I/O设备进行电源管理。

12. Networking support,(协议层的网络支持,socket等,硬件层的支持在Device Drivers中配置)

Networking options  —>,网络选项

<*> Packet socket,这种socket能够让应用程序(tcpdump,iptables)直接与网络设备通讯,而不通过内核中的其他中介协议,最好选上。

<*> Unix domain sockets,一种仅运行于本机上的效率高于TCP/IP 的socket,简称Unix socket.许多程序都使用它在操作系统内部进行进程间通信(IPC),比如X Window 和syslog,最好选上。

< > Transformation user configuration interface,为IPsec(可在ip层加密)之类的工具提供XFRM 用户配置接口支持,不清楚可以不选。

[ ] Transformation sub policy support (EXPERIMENTAL),XFRM子策略支持,仅供开发者使用,不清楚不要选。

[ ] Transformation migrate database (EXPERIMENTAL),

[ ] Transformation statistics (EXPERIMENTAL),

< > PF_KEY sockets,用于可信任的密钥管理程序和操作系统内核内部的密钥管理进行通信,IPsec也依赖于它,可以不选。

[ ]   PF_KEY MIGRATE (EXPERIMENTAL),子项,不用选。

[*] TCP/IP networking,TCP/IP协议,必须要选

[*]   IP: multicasting,群组广播,选上

[]   IP: advanced router,高级路由功能,做路由器的话选上,可以不选。

Choose IP: FIB lookup algorithm (choose FIB_HASH if unsure) (FIB_HASH),子项,不懂的话就选FIB_HASH吧

[ ]   IP: policy routing,策略路由,不清楚可以不选。

[ ]   IP: equal cost multipath,用于路由的基于目的地址的均衡。不清楚可以不选。

[ ]   IP: verbose route monitoring,显示冗余的路由监控信息,可以不选

[ ]   IP: kernel level autoconfiguration,内核启动时自动配置IP地址、路由表等,需要从网络启动的无盘工作站需要这个,普通用户不需要。

< >  IP: tunneling,IP隧道,将一个IP报文装在另一个IP报文的技术。不清楚不用选。

< >  IP: GRE tunnels over IP,基于IP的GRE(通用路由封装)隧道,不清楚可以不选。

[]   IP: multicast routing,多重传播路由,没有特殊需求可以不选。

[ ]     IP: multicast policy routing,子项,不清楚可以不选

[ ]     IP: PIM-SM version 1 support,子项,不清楚可以不选

[ ]     IP: PIM-SM version 2 support,子项,不清楚可以不选

[ ]   IP: ARP daemon support,废弃功能,不选。

[ ]   IP: TCP syncookie support,抵抗SYN flood攻击的好东西,要启用它必须同时启用/proc文件系统和”Sysctlsupport”, 然后在系统启动并挂载了/proc 之后执行”echo 1>/proc/sys/net/ipv4/tcp_syncookies”命令,不清楚可以不选。

< >  IP: AH transformation,IPsec验证头(AH),实现了数据发送方的验证处理,可确保数据既对于未经验证的站点不可用也不能在路由过程中更改,不清楚可以不选。

< >  IP: ESP transformation,IPsec封闭安全负载(ESP),实现了发送方的验证处理和数据加密处理,用以确保数据不会被拦截/查看或复制。不清楚可以不选。

< >  IP: IPComp transformation,IPComp(IP静荷载压缩协议),用于支持IPsec,不清楚可以不选。

< >  IP: IPsec transport mode,IPsec传输模式,常用于对等通信,用以提供内网安全.数据包经过了加密但IP头没有加密,因此任何标准设备或软件都可查看和使用IP头,不清楚可以不选。

< >  IP: IPsec tunnel mode,IPsec隧道模式,用于提供外网安全(包括虚拟专用网络).整个数据包(数据头和负载)都已经过加密处理且分配有新的ESP 头/IP 头和验证尾,从而能够隐藏受保护站点的拓扑结构,不清楚可以不选。

< >  IP: IPsec BEET mode,IPsec BEET模式,不清楚可以不选。

[*]   Large Receive Offload (ipv4/tcp),针对 TCP 流量的 LRO (Large Receive Offload) 支持,选上。

<*>  INET: socket monitoring interface,socket监视接口,一些Linux 本地工具(如:包含ss的iproute2)需要使用它,选上

[]   TCP: advanced congestion control  —>,高级拥塞控制,如果没有特殊需求(比如无线网络)就别选了,内核会自动将默认的拥塞控制设为”Cubic”并将”Reno”作为候补,可以不选。如果网络用处较多,还是选上为好(如网络视频服务器)。
关于拥塞控制,见tcp拥塞控制.doc文档。

[ ]   TCP: MD5 Signature Option support (RFC2385) (EXPERIMENTAL),不清楚可以不选。

<*>   The IPv6 protocol  —>,IPV6支持的话,就选上,

[*] Only allow certain groups to create sockets,只允许特定的群体创建socket,选上,没什么坏处。

[*] Network activity statistics tracking,最好选上。

…….网络选项中,后面的不清楚的话 可以不选,选上基本几项,网络就可以工作了,有时间进一步深入研究。

 

-*-   Wireless  —>(无线,没有无线网卡的话可以不选)

<*>   cfg80211 – wireless configuration API,暂时未会,使用默认配置

13. Device Drivers(设备驱动)

Generic Driver Options  —>,通用选项

(/sbin/mdev) path to uevent helper,不理解,用的默认值

[ ] Maintain a devtmpfs filesystem to mount at /dev,让devtmpfs文件系统安装在/dev,不清楚可以不选。

[*] Select only drivers that don’t need compile-time external firmware,只显示那些不需要内核对外部设备的固件作map支持的驱动程序,除非你有某些怪异硬件,否则请选上。

[ ] Prevent firmware from being built,不编译固件(固化的软件,如bios).固件一般是随硬件的驱动程序提供的,仅在更新固件的时候才需要重新编译。可以不选,但想要更新固件的话就要重新编译内核了。

{*} Userspace firmware loading support,提供某些内核之外的模块需要的用户空间固件加载支持,在内核树之外编译的模块可能需要它,选上。

[*]  Include in-kernel firmware blobs in kernel binary 

()   External firmware blobs to build into the kernel binary

< > Connector – unified userspace <-> kernelspace linker  —>,用户空间和内核空间连接器,工作在netlink socket协议的顶层,不清楚可以不选。

<*> Memory Technology Device (MTD) support  —>,特殊的存储技术,如常用语数码相机或嵌入式系统的闪存卡,一般是NOR flash和Nand的支持,arm linux必选,PC不用选。

[ ]   Debugging,调试模式,不选。

< >  MTD tests support,MTD测试支持,不清楚可以不选。

< >  MTD concatenating support,连接多个MTD设备,例如使用JFFS2文件系统管理多片Flash的情形。只有一片Flash时不选。

[*]  MTD partitioning support,分区支持,选上。

< >     RedBoot partition table parsing,使用RedBoot解析Flash分区表,如果需要读取这个分区表的信息选择此项

[*]     Command line partition table parsing,允许通过内核命令行传递MTD分区表信息,

< >     ARM Firmware Suite partition parsing,使用AFS分区信息

< >     TI AR7 partitioning support,AR7分区支持

<*>  Direct char device access to MTD devices,将系统中的MTD设备看做字符设备进行读写,需要与驱动同步的。

-*-  Common interface to block layer for MTD ‘translation layers’

<*>  Caching block device access to MTD devices,文件系统挂载后,模拟块设备进行访问。常用于只读文件系统。如果是DiskOnChip使用NFTL方式。

< >  FTL (Flash Translation Layer) support,提供对Flash翻译层支持,可以不选

< >  NFTL (NAND Flash Translation Layer) support,NAND Flash翻译层支持,可以不选

< >  INFTL (Inverse NAND Flash Translation Layer) support,提供INFTL支持,DiskOnChip使用

< >  Resident Flash Disk (Flash Translation Layer) support,提供RFD支持,为嵌入式系统提供类似BIOS功能,不清楚可以不选,使用Uboot驱动的话也不用选。

< >  NAND SSFDC (SmartMedia) read only translation layer,NAND SSFDC只读翻译层,不清楚可以不选。

< >  SmartMedia/xD new translation layer,不清楚可以不选。

< >  Log panic/oops to an MTD buffer,MTD缓冲日志,不清楚可以不选。

RAM/ROM/Flash chip drivers  —>,RAM/ROM/Flash芯片驱动,不清楚可以不选。

Mapping drivers for chip access  —>,为芯片的访问方式选择Mapping驱动,不清楚可以不选。

Self-contained MTD device drivers  —>,自身包含MTD设备驱动,一般不选。

< >  Include chip ids for known NAND devices.,NAND flash信息,不用选。

< >  NAND Device Support  —>,Nand设备支持,有nand的话选上,子项默认配置即可,如果支持Nand,加选这一项就够了。

< >  OneNAND Device Support  —>,One nand支持,不清楚可以不选。

LPDDR flash memory drivers  —>,LPDDR Flash内存驱动,未用,不用选。

UBI – Unsorted block images  —>未分类block影响,不清楚不选。

附:配置支持jffs2两步

1) 在“memory technology devices(mtd)”选项中选择:

<*>memory technology device(mtd)support

<*>mtd partitioning support

<*>cashing block device access to mtd devices

ram/rom/flash chip drivers—>

<*> detect flash chips by common flash interface(cfi) probe

<*> support for intel/sharp flash chips

mapping drivers for chip access—>

<*> cfi flash device in physical memory map

(0)   physical start address of flash mapping

(1000000)physical length of flash mapping

(2)buswidthin octets

<*> intel strataflash device mapped on at91rm9200

这里设置了flash芯片的起始地址、大小以及宽度,比如:起始地址为“0”,大小为“1000000”,即16mb,宽度为“2”,即16字节。然后选中自己加入的“intel strataflash device mapped on at91rm9200”这一项

2) 在“file systems”选项中选择:

<*>joumalling flash file system v2(jffs2)support

对于其他功能,可根据自己的实际情况,进行裁减,然后保存退出,接下来编译出操作系统内核映像。(详细见 linux支持nor flash.txt 文档)

 

< > Parallel port support  —>,配置并口,如打印机,arm linux可以不用配置

< >   PC-style hardware (NEW),

< >   AX88796 Parallel Port (NEW),

[ ]    IEEE 1284 transfer modes (NEW),

[*] Block devices  —>,块设备,一般都不用选,除非有特殊需要

< >   Loopback device support,拿文件来模拟块设备,想要mount iOS文件的话必须选上,一般不选。

< >   Network block device support,网络块设备支持,让PC成为网络块设备的客户端。一般不选

< >   Low Performance USB Block driver,低性能USB块设备驱动程序,一般不选。

<*>   RAM block device support,RAM块设备支持,子选项保持默认就好了。

< >   Packet writing on CD/DVD media,不清楚可以不选。

< >   ATA over Ethernet support,不清楚可以不选。

[*] Misc devices  —>,混杂设备驱动,一般不选。

< > ATA/ATAPI/MFM/RLL support (DEPRECATED)  —>,不清楚可以不选。

SCSI device support  —>,支持u盘的话,需要选上。

< > RAID Transport Class,不清楚可以不选。

<*> SCSI device support,支持u盘选上,子选项默认配置即可。

< > Serial ATA and Parallel ATA drivers  —>,SATA和PATA支持,没有硬盘的话可以不选。

[ ] Multiple devices driver support (RAID and LVM)  —>,特殊服务器管理用到,如LVM,一般用户不会用到,不用选,

[*] Network device support  —>,网络设备支持,必选。包括前兆网卡,PPPOE等的支持。

[*] HID Devices  —>,HID支持,选上

[*] USB support  —>,USB支持,选上

<*> MMC/SD/SDIO card support  —>,SD卡支持,选上。

……

其他选项根据需求来。在嵌入式linux中一般IIC SPI等device都自己写驱动,不用选。

14. File systems(文件系统)

<*> Second extended fs support,EXT2文件系统支持。

[*]   Ext2 extended attribute,EXT2文件系统支持。

<*> Ext3 journalling file system support,EXT3文件系统支持,子项默认就行。

<*> The Extended 4 (ext4) filesystem ,EXT4文件系统支持,子项默认就行。

……

有JFS(IBM所用)文件系统等,省略,用的不多。

……

[*] Enable POSIX file locking API,使能POSIX文件锁的API,最好选上。

[*] Dnotify support,基于目录的文件变化的通知机制,不选nfsd起不来,比选的。

[ ] Inotify file change notification support,新式的文件体统的变化通知机制,用以替代老旧的Dnotify,选了Dnotify就不要选它了。

[*] Inotify support for userspace,用户空间的Inotify支持,最好选上。(notify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建)。

<*> FUSE (Filesystem in Userspace) support,允许在用户空间实现一个文件系统,如果打算开发一个自己的文件系统或使用一个机遇FUSE的文件系统,最好打开。

<*>   Character device in Userpace support,允许在用户空间实现一个字符设备,

-*- Miscellaneous filesystems  —>,杂项文件系统,子项很复杂,主要配置jffs2 和 yaffs2文件系统,一般用于嵌入式设备。

[*] Network File Systems  —>,网络文件系统,NFS等。

……

其他没有特殊需求可以不选。

15. Kernel hacking(内核hack选项,基本上选Enable __must_check logic和Stacktrace就可以了,有需要再深入研究)

[ ] Show timing information on printks,在printk的输出中包含时间信息,可以用来分析内核启动过程各步骤所用时间,需要时选上。

[ ] Enable __deprecated logic,不清楚不要选。

[*] Enable __must_check logic,在编译内核的过程中使用”必须检查”的逻辑,禁用它将不会显示某些警告信息,选上。

[ ] Magic SysRq key,不懂,千万别选。

[ ] Strip assembler-generated symbols during link,,不清楚不要选。

[ ] Enable unused/obsolete exported symbols,没用的信息符号,会使内核增大,不选.

[ ] Debug Filesystem,不是内核开发者的别选。

[ ]Run ‘make headers_check’ when building vmlinux,在编译内核时运行’make headers_check’命令检查内核头文件,当你修改了与用户空间相关的内核头文件后建议启用该选项。

[ ] Kernel debugging,不是内核开发者的别选。

[ ] SLUB debugging on by default,不清楚不要选。

[ ] Enable SLUB performance statistics,不清楚不要选。

[*] Stacktrace,支持调用栈,用于出错排查问题。

[ ] Debug memory initialization,调试内存初始化,不选,

[ ] Check for stalled CPUs delaying RCU grace periods ,检查停止CPU延缓RCU的宽限期,

[ ] Latency measuring infrastructure,不清楚不要选。

[ ] Sysctl checks,不清楚不要选。

[ ] Tracers  —>,不清楚不要选。

[ ] Perform an atomic64_t self-test at boot,不清楚不要选。

[ ] Sample kernel code  —>  ,不清楚不要选。

[*] Enable stack unwinding support,可以不选(31没选)。

[*] Verbose user fault messages,可以不选(31没选)。

[ ] On-chip ETM and ETB,片上ETM、ETB,不清楚可以不选。

16. Security options(安全选项,一般不需要配置,)

[ ]  Enable the /proc/keys file by which keys may be viewed,允许有权限的进程通过/proc/keys读取所有的key,最好不要选。

[ ]  Restrict unprivileged access to the kernel syslog,限制未经授权访问内核日志。

[ ]  Enable different security models,允许内核选择不同的安全模式,如果未选择按默认处理。

[*] Enable the securityfs filesystem,不清楚可以不选(16没选)。

Default security module (Unix Discretionary Access Controls)  —>,默认安全模式。

17. Cryptographic API(支持的加密算法) 

18. Library routines(库子程序)

转自: 

 

相关文章