手机根目录下的字母加字母数字下划线组合的文件是什么软件生成的?.g_b_d_v、.g_c_o_m

2725人阅读
linux驱动开发(17)
&&&&&& 在下载内核前,我们应该讨论一些重要的术语和事实。Linux内核是一个宏内核,这意味着整个操作系统都运行在内核预留的内存里。说的更清楚一些,内核是放在内存里的。内核所使用的空间是内核预留的。只有内核可以使用预留的内核空间。内核拥有这些内存空间,直到系统关闭。与内核空间相对应的还是用户空间。用户空间是内存上用户程序拥有的空间。比如浏览器、电子游戏、文字处理器、媒体播放器、壁纸、主题等都是放在内存里的用户空间。当一个程序关闭的时候,任何程序都可以使用新释放的空间。在内核空间,一旦内存被占用,则没有任何其他程序可以使用这块空间。
  Linux内核也是一个抢占式多任务内核。这意味该内核可以暂停一些任务来保证任何应用都有机会来使用CPU。举个例子,如果一个应用正在运行但是正在等待一些数据,内核会把这个应用暂停并允许其他的程序使用新释放的CPU资源,直到数据到来。否则的话,系统就会浪费资源给那些正在等待数据或者其他程序执行的的任务。内核将会强制程序去等待或者停止使用CPU。没有内核的允许,应用程序不能脱离暂停或者使用CPU。
  Linux内核使得设备作为文件显示在/dev文件夹下。举个例子,USB端口位于/dev/bus/usb。硬盘分区则位于/dev/disk/分区。因为这个特性,许多人说:“在Linux上,一切皆文件”。举个例子,如果一个用户想要访问在存储卡上的数据,他们能通过设备文件访问这些数据。(译注:此处原文是“If a user wanted to access data on their memory card, for example, they&cannot&access the
data through these device files.”,但根据上下文和实际经验看,应该是“can 能”)
  Linux内核是可移植的。可移植性是Linux流行的一个最重要的原因。可移植性使得内核可以工作在各种处理器和系统上。一些内核支持的处理器的型号包括:Alpha、AMD、ARM、C6X、Intel、x86、Microblaze、MIPS、PowerPC、SPARC、UltraSPARC等,这还不是全部的列表。
  在引导文件夹(/boot),用户会看到诸如“vmlinux”或者“vmlinuz”的文件。这两者都是已编译的Linux内核。以“z”结尾的是已压缩的。“vm”代表虚拟内存。在SPARC处理器的系统上,用户可以看见一个zImage文件。一小部分用户可以发现一个bzImage文件,这也是一个已压缩的Linux内核。无论用户有哪个文件,这些引导文件都是不能更改的,除非用户知道他们正在做什么。否则系统会变成无法引导,也就是说系统启动不了了。
  内核源代码就是程序编码。有了源代码,程序员可以修改内核并能观察到内核是如何工作的。
  现在我们想更多地了解了内核,就要下载内核源代码了。进入并点击那个巨大的下载按钮。下载完成后,解压下载的文件。
  对于本文,我使用的源代码是Linux kernel 3.9.4.这个文章系列的所有指导对于所有的内核版本是相同的(或者非常相似的)
  更多精彩内容请看下一页:
  Linux Kernel 的详细介绍:请点这里
Linux Kernel 的下载地址:请点这里
  推荐阅读:
  怎样在 Ubuntu 上安装 Linux 3.11 内核
  Ubuntu 13.10 (Saucy Salamander) 内核已升级至 Linux Kernel 3.10 RC5
  Linux内核参数设置文件nf
  在下载并解压内核源代码后,用户可以看到许多文件夹和文件。源代码以一个特定的方式组织的。这使开发者能够轻松找到任何文件或者内核的一部分。
kernel第一级目录:
  内核源代码的根目录下包含了以下文件夹
Documentation
arch&- 这个文件夹包含了一个Kconfig文件,它用于设置这个目录里的源代码编译所需的一系列设定。每个支持的处理器都在它相应的文件夹中。如,Alpha处理器的源代码在alpha文件夹中。请记住,随着时间的推移,一些新的处理器将被支持,有些会被放弃。
  block&– 此文件夹包含块设备驱动程序的代码。块设备是以数据块方式接收和发送的数据的设备。数据块都是一块一块的数据而不是持续的数据流。-----该目录用于实现块设备的基本框架和块设备的I/O调度算法
  crypto&- 这个文件夹包含许多加密的源代码。例如,“sha1_generic.c”这个文件包含了SHA1加密算法的代码。
  Documentation&- 此文件夹包含了内核信息和其他许多文件信息的文本文档。如果开发者需要一些信息,他们也许能在这里找到所需要的信息。
  drivers&- 该目录包含了驱动代码。驱动是一个控制硬件的软件。例如,要让计算机知道键盘并使其可用,键盘驱动是必要的。这个文件夹中存在许多文件夹。每个文件夹都以硬件的种类或者型号命名。例如,'bluetooth'包含了蓝牙驱动程序的代码。还有其他很明显的驱动像SCSI、USB和火线等。有些驱动程序可能会比较难找到。例如,操纵杆驱动不在'joystick'文件夹中,它们却在./drivers/input/joystick。同样键盘和鼠标驱动也在这个input文件夹中。
'Macintosh'包含了苹果的硬件代码。 'Xen'包含了Xen hypervisor代码。(hypervisor是一种允许用户在一台计算机上运行多个操作系统的软件或硬件。这意味着在Xen允许用户在一台计算机上同时运行的两个或两个以上的Linux系统。用户还可以运行Windows,Solaris,FreeBSD或其他操作系统在Linux系统上。)driver文件夹下还有许多其他的文件夹,但他们在这篇文章中无法一一列举,他们将在以后的文章中提到。
  firmware&- fireware中包含了让计算机读取和理解从设备发来的信号的代码。举例来说,一个摄像头管理它自己的硬件,但计算机必须了解摄像头给计算机发送的信号。Linux系统会使用vicam固件(firmware)来理解摄像头的通讯。否则,没有了固件,Linux系统将不知道如何处理摄像头发来的信息。另外,固件同样有助于将Linux系统发送消息给该设备。这样Linux系统可以告诉摄像头重新调整或关闭摄像头。
  fs&- 这是文件系统的文件夹。理解和使用的文件系统所需要的所有的代码就在这里。在这个文件夹里,每种文件系统都有自己的文件夹。例如,ext4文件系统的代码在ext4文件夹内。 在fs文件夹内,开发者会看到一些不在文件夹中的文件。这些文件用来控制整个文件系统。例如,mount.h中会包含挂载文件系统的代码。文件系统是以结构化的方式来存储和管理的存储设备上的文件和目录。每个文件系统都有自己的优点和缺点。这是由文件系统的设计决定的。举例来说,NTFS文件系统支持的透明压缩(当启用时,会在用户不知道的情况下自动压缩存储文件)。大多数文件系统缺乏此功能,但如果在fs文件夹里编入相应的文件,它们也有这种能力。
  include&- include包含了内核所需的各种头文件.这个名字来自于C语言用&include&来在编译时导入头文件。
  init&- init文件夹包含了内核启动的处理代码(INITiation)。main.c是内核的核心文件,这是用来衔接所有的其他文件的源代码主文件。
  ipc&- IPC代表进程间通讯。----用于实现System V的进程间通信(Inter Process Communication,IPC)模块 .&&&&&& 此文件夹中的代码是作为内核与进程之间的通信层。内核控制着硬件,因此程序只能请求内核来执行任务。假设用户有一个打开DVD托盘的程序。程序不直接打开托盘,相反,该程序通知内核托盘应该被打开。然后,内核给硬件发送一个信号去打开托盘。这些代码同样管理kill信号。举例来说,当系统管理员打开进程管理器去关闭一个已经锁死的程序,这个关闭程序的信号被称为kill信号。内核接收到信号,然后内核会要求程序停止或直接把进程从内存和CPU中移除(取决于kill的类型)。命令行中的管道同样用于进程间通信。管道会告诉内核在某个内存页上写入输出数据。程序或者命令得到的数据是来自内存页上的某个给定的指针。
  kernel&- 这个文件夹中的代码控制内核本身。例如,如果一个调试器需要跟踪问题,内核将使用这个文件夹中代码来将内核指令通知调试器跟踪内核进行的所有动作。这里也有跟踪时间的代码。在内核文件夹下有个&power&文件夹,这里的代码可以使计算机重新启动、关机和挂起。
  lib&- 这个文件夹包含了内核需要引用的一系列内核库文件代码。
  mm&- mm文件夹中包含了内存管理代码。内存并不是任意存储在RAM芯片上的。相反,内核小心地将数据放在RAM芯片上。内核不会覆盖任何正在使用或保存重要数据的内存区域。
  net&- net文件夹中包含了网络协议代码。这包括IPv6、AppleTalk、以太网、WiFi、蓝牙等的代码,此外处理网桥和DNS解析的代码也在net目录。
  samples&- 此文件夹包含了程序示例和正在编写中的模块代码。假设一个新的模块引入了一个想要的有用功能,但没有程序员说它已经可以正常运行在内核上。那么,这些模块就会移到这里。这给了新内核程序员一个机会通过这个文件夹来获得帮助,或者选择一个他们想要协助开发的模块。
  scripts&- 这个文件夹有内核编译所需的脚本。最好不要改变这个文件夹内的任何东西。否则,您可能无法配置或编译内核。
  security&- 这个文件夹是有关内核安全的代码。它对计算机免于受到病毒和黑客的侵害很重要。否则,Linux系统可能会遭到损坏。关于内核的安全性,将在以后的文章中讨论。
  sound&- 这个文件夹中包含了声卡驱动。------存放声音系统架构相关代码和具体声卡的设备驱动程序
  tools&- 这个文件夹中包含了和内核交互的工具。
  usr&- 还记得在以前的文章中提到vmlinuz和其他类似的文件么?这个文件夹中的代码在内核编译完成后创建这些文件。----该目录中的代码为内核尚未完全启动时执行用户空间代码提供了支持
  virt&- 此文件夹包含了虚拟化代码,它允许用户一次运行多个操作系统。这与先前提到的Xen是不同的。通过虚拟化,客户机操作系统就像任何其他运行在Linux主机的应用程序一样运行。通过Xen这样的hypervisor(注:虚拟机管理程序),两个操作系统可以同时管理硬件。在虚拟化中,在客户机操作系统上运行在Linux内核上,而在hypervisor中,它没有客户系统并且所有的系统不互相依赖。
  还有一些文件在源代码的根目录下。它们会在下面列出。
  COPYING&-许可和授权信息。Linux内核在GPLv2许可证下授权。该许可证授予任何人有权免费去使用、修改、分发和共享源代码和编译代码。然而,没有人可以出售源代码。
  CREDITS&- 贡献者列表
  Kbuild&- 这是一个设置一些内核设定的脚本。打个比方,这个脚本设定一个ARCH变量,这是开发者想要生成的内核支持的处理器类型。
  Kconfig&- 这个脚本会在开发人员配置内核的时候用到,这会在以后的文章中讨论。
  MAINTAINERS&- 这是一个目前维护者列表,他们的电子邮件地址,主页,和他们负责开发和维护的内核的特定部分或文件。当一个开发者在内核中发现一个问题,并希望能够报告给能够处理这个问题的维护者时,这是是很有用的。
  Makefile&- This script is the main file that is used to compile the kernel. This file passes parameters to the compiler as well as the list of files to compile and any other necessary information. 这个脚本是编译内核的主要文件。这个文件将编译参数和编译所需的文件和必要的信息传给编译器。
  README&- 这个文档提供给开发者想要知道的如何编译内核的信息。
  REPORTING-BUGS&- 这个文档提供如何报告问题的信息。
第二级目录:
(1)ARCH目录
对于Linux v3.9.4,arch下有以下文件夹:
microblaze
该目录中每个子目录都与某种体系结构对应,用于存放系统结构相关代码,向平台无关的系统核心模块提供所需的功能接口。每个体系结构对应的子目录下通常至少包含以下几个子目录:&
&&&&&&&& Kernel子目录:用于存放特定体系结构特有信号量的实现代码和对称多处理器(Symmetric MultiProccessing,简称SMP)相关模块。
Lib子目录:用于存放以来依赖当前体系结构的辅助功能,如利用当前体系结构特性实现的strlen和memcpy内存操作函数;与通用的实现方法相比,他们的开销小、更加高效。&
&&&&&&&& Mm子目录:用于存放体系架构特定的内存管理模块,包括内存的初始化、页表管理等内容。
&&&&&&&& Boot子目录:该目录中包含了当前平台上系统引导过程使用的部分或全部代码。这部分代码以来当前平台,用于完成向系统内存装载内核镜像的工作。
各处理器简单介绍:
alpha 处理器
Alpha 处理器最早由美国DEC 公司设计制造,在Compaq (康柏)公司收购DEC 之后,Alpha 处理器继续得到发展,并且应用于许多高档的Compaq 服务器上,HP (惠普)收购的Compaq ,Alpha 便为HP(惠普)所有,不过HP (惠普)已经放弃发展alpha 处理器。
arm 处理器
Arm 系列处理器 是英国Arm 公司设计的主流嵌入式32 位RISC 处理器,Arm 公司不直接生产Arm 处理器,而是采用IP 授权的方式由第3 方开发生产,著名的公司如Ti 、Samsung 等都有出品Arm 处理器。目前在手机领域广泛应用。
avr32 处理器
Avr32 处理器美国 Atmel 公司设计开发的32 位RISC 处理器, 设计目的是在每一个时钟周期内完成更多处理工作,从而在较低的时钟频率下实现相同的吞吐量。适合在工业控制、汽车电子等嵌入式设备领域中使用。Avr32 属于MCU 型的处理器。
blackfin 处理器
Blackfin 处理器是美国ADI 公司开发的具有DSP 能力的 32 位RISC 处理器, Blackfin 处理器基于由 ADI 和 Intel 公司联合开发的微信号架构 (MSA ), 适用于 嵌入式音频、视频和通信应用等领域。
cris 处理器
Cris 处理器是 瑞典 Axis 通信公司开发的32 位RISC 处理器,主要用于网络设备,属于比较专业的应用领域。因为 Axis 通信公司主要开发网络监控设备,所以 Cris 处理器在其网络监控设备中应用广泛。
frv 处理器
Frv 处理器是 日本富士通开发的32 位高性能RISC处理器, 采用VLIW (Very Long Instruction Word )构架,具备良好的多媒体处理能力,在机顶盒(STB )、数码刻录机(DVR )、数码相机(DSC)等嵌入式领域应用广泛。
h8300 处理器
H8300 处理器是 日本瑞萨科技开发的32 位高性能RISC 处理器, 具有强大的位操作指令,最适于实时控制应用如汽车电子、家用电器、医疗器械等领域。H8300 属于MCU 型的处理器。
ia64 处理器
Ia64 处理器是 美国英特尔开发的面向服务器应用的64 位处理器, 由于具有64 位寻址能力,它能够使用100 万TB 的地址空间,足以运算企业级或超大规模的数据库任务;64 位宽的寄存器可以使CPU 浮点运算达到非常高的精度。
m32r 处理器
M32r 处理器是 日本瑞萨科技开发的32 位高性能RISC 处理器, 内置大容量存储器,适用于车载系统、数字AV 设备、数字成像设备等产品领域。属于MCU 型的处理器。
m68k 处理器
M68k 处理器是美国 Motorola 公司开发的高性能处理器, 具有高性价比、高集成度等特点,在工业自动化设备、控制设备、医疗仪器系统、安全系统等领域多有应用。现在为Freescale 公司所有, 风头已不敌PowerPC 处理器。
microblaze 处理器
Microblaze 处理器是美国 Xilinx 公司提供的嵌入在其FPGA 芯片上的32 位RISC 软核。 它具有运算能力强、外围接口配置灵活等特点,集成在 FPGA之中,可以和FPGA 实现协同设计,具备软硬件可配置的灵活性。
mips 处理器
Mips 处理器 是由美国斯坦福大学Hennessy 教授领导的研究小组研制出来, 现为Mips 公司拥有,和Arm 处理器一样采用IP 授权的方式由第3 方开发生产。著名的公司如Broadcom 、Nxp 等都有出品Mips处理器。我国的龙芯CPU 也是采用Mips 体系结构。
mn10300 处理器
Mn10300 处理器 日本松下开发的32 位多媒体处理器。
parisc 处理器
Parisc 处理器是由 HP (惠普)开发设计的处理器,主要用于HP (惠普)公司的服务器中,目前HP(惠普)已经放弃 Parisc 处理器的开发,不过一些Parisc 处理器技术已经融合到ia64 处理器之中。
powerpc 处理器
Powerpc 处理器是由美国IBM 、Apple 、Motorola 联合开发的处理器,Powepc 处理器在IBM 的服务器、Apple 的MAC 电脑中都有应用。不过现在多应用在网络设备、视频系统、工业系统等领域。Sony PS3 游戏机Cell 处理器也是Powerpc 体系结构。
s390 处理器
S390 处理器是由美国IBM 开发的面向大型机应用的处理器 。
score 处理器
Score 处理器是由台湾 凌阳开发的32 位RISC 处理器。Score 属于MCU 型的处理器。
Sh 处理器又称SuperH 处理器 ,最先由日本Hitachi 公司开发,后由 Hitachi 及 ST Microelectronics 两家公司共同开发,2003 年 瑞萨科技从 Hitachi 公司继承到拥有权。Sh 属于MCU 型的处理器。
sparc 处理器
Sparc 处理器是由美国SUN 和TI 公司共同开发的RISC 微处理器,最突出的特点就是它的可扩展性。SUN 公司将它做为高端处理器应用到服务器产品。
x86 处理器
X86 处理器是由美国Intel 推出的 复杂指令集(cisc ) 处理器,广泛应用在PC 电脑领域和服务器领域,在工业控制领域也有应用。目前主要是Intel、AMD 、VIA 在开发x86 体系结构的处理器。
xtensa 处理器
Xtensa 处理器是由美国 Tensilica (泰思立达)公司开发的可配置及可扩展的微处理器
OpenRisc处理器
OpenRisc是OpenCores组织提供的基于GPL协议的开放源代码的RISC()处理器。有人认为其性能介于ARM7和ARM9之间,适合一般的使用。最重要的一点是OpenCores组织提供了大量的开放源代码IP核供研究人员使用,因此对于一般的开发单位具有很大的吸引力
(2)drivers目录有以下文件夹:
许多驱动程序是通用驱动程序,这意味着一个通用键盘驱动可以使内核可以处理几乎所有的键盘。然而,有些驱动是专用驱动,像苹果和Commodore就分别为苹果电脑和Amiga系统制造了专门的硬件。Linux内核中已经包含了许多诸如手机、苹果、Amiga系统、PS3、平板,和许多其他设备的驱动程序。
  注意有些设备的驱动不在本目录中。比如,射频驱动在net和media文件夹下。
  accessibility&- 这些驱动提供支持一些辅助设备。在Linux 3.9.4中,这个文件夹中只有一个驱动就是盲文设备驱动。
  acpi&- 高级配置和电源接口(ACPI : Advanced Configuration and Power Interface)驱动用来管理电源使用。
  amba&- 高级微控制器总线架构(AMBA : Advanced Microcontroller Bus Architecture)是与片上系统(SoC)的管理和互连的协议。SoC是一块包含许多或所有必要的计算机组件的芯片。这里的AMBA驱动让内核能够运行在这上面。
  ata&- 该目录包含PATA和SATA设备的驱动程序。串行ATA(SATA)是一种连接主机总线适配器到像硬盘那样的存储器的计算机总线接口。并行ATA(PATA)用于连接存储设备,如硬盘驱动器,软盘驱动器,光盘驱动器的标准。PATA就是我们所说的IDE。
  atm&- 异步通信模式(ATM : Asynchronous Transfer Mode)是一种通信标准。这里有各种接到PCI桥的驱动(他们连接到PCI总线)和以太网控制器(控制以太网通信的集成电路芯片)。
  auxdisplay&- 这个文件夹提供了三个驱动。LCD 帧缓存(framebuffer)驱动、LCD控制器驱动和一个LCD驱动。这些驱动用于管理液晶显示器 —— 液晶显示器会在按压时显示波纹。注意:按压会损害屏幕,所以请不要用力戳LCD显示屏。
  base&- 这是个重要的目录包含了固件、系统总线、虚拟化能力等基本的驱动。
  bcma&- 这些驱动用于使用基于AMBA协议的总线。AMBA是由博通公司开发。
  block&- 这些驱动提供对块设备的支持,像软驱、SCSI磁带、TCP网络块设备等等。
  bluetooth&- 蓝牙是一种安全的无线个人区域网络标准(PANs)。蓝牙驱动就在这个文件夹,它允许系统使用各种蓝牙设备。例如,一个蓝牙鼠标不用电缆,并且计算机有一个电子狗(小型USB接收器)。Linux系统必须能够知道进入电子狗的信号,否则蓝牙设备无法工作。
  bus&- 这个目录包含了三个驱动。一个转换ocp接口协议到scp协议。一个是设备间的互联驱动,第三个是用于处理互联中的错误处理。
  cdrom&- 这个目录包含两个驱动。一个是cd-rom,包括DVD和CD的读写。第二个是gd-rom(只读GB光盘),GD光盘是1.2GB容量的光盘,这像一个更大的CD或者更小的DVD。GD通常用于世嘉游戏机中。
  char&- 字符设备驱动就在这里。字符设备每次传输数据传输一个字符。这个文件夹里的驱动包括打印机、PS3闪存驱动、东芝SMM驱动和随机数发生器驱动等。
  clk&- 这些驱动用于系统时钟。
  clocksource&- 这些驱动用于作为定时器的时钟。
  connector&- 这些驱动使内核知道当进程fork并使用proc连接器更改UID(用户ID)、GID(组ID)和SID(会话ID)。内核需要知道什么时候进程fork(CPU中运行多个任务)并执行。否则,内核可能会低效管理资源。
  cpufreq&- 这些驱动改变CPU的电源能耗。
  cpuidle&- 这些驱动用来管理空闲的CPU。一些系统使用多个CPU,其中一个驱动可以让这些CPU负载相当。
  crypto&- 这些驱动提供加密功能。
  dca&- 直接缓存访问(DCA : Direct Cache Access)驱动允许内核访问CPU缓存。CPU缓存就像CPU内置的RAM。CPU缓存的速度比RAM更快。然而,CPU缓存的容量比RAM小得多。CPU在这个缓存系统上存储了最重要的和执行的代码。
  devfreq&- 这个驱动程序提供了一个通用的动态电压和频率调整(DVFS : Generic Dynamic Voltage and Frequency Scaling)框架,可以根据需要改变CPU频率来节约能源。这就是所谓的CPU节能。
  dio&- 数字输入/输出(DIO :Digital Input/Output)总线驱动允许内核可以使用DIO总线。
  dma&- 直接内存访问(DMA)驱动允许设备无需CPU直接访问内存。这减少了CPU的负载。
  edac&- 错误检测和校正( Error Detection And Correction)驱动帮助减少和纠正错误。
  eisa&- 扩展工业标准结构总线(Extended Industry Standard Architecture)驱动提供内核对EISA总线的支持。
  extcon&- 外部连接器(EXTernal CONnectors)驱动用于检测设备插入时的变化。例如,extcon会检测用户是否插入了USB驱动器。
  firewire&- 这些驱动用于控制苹果制造的类似于USB的火线设备。
  firmware&- 这些驱动用于和像BIOS(计算机的基本输入输出系统固件)这样的设备的固件通信。BIOS用于启动操作系统和控制硬件与设备的固件。一些BIOS允许用户超频CPU。超频是使CPU运行在一个更快的速度。CPU速度以MHz(百万赫兹)或GHz衡量。一个3.7 GHz的CPU的的速度明显快于一个700Mhz的处理器。
  gpio&- 通用输入/输出(GPIO :General Purpose Input/Output)是可由用户控制行为的芯片的管脚。这里的驱动就是控制GPIO。
  gpu&- 这些驱动控制VGA、GPU和直接渲染管理(DRM :Direct Rendering Manager )。VGA是640*480的模拟计算机显示器或是简化的分辨率标准。GPU是图形处理器。DRM是一个Unix渲染系统。
  hid&- 这驱动用于对USB人机界面设备的支持。
  hsi&- 这个驱动用于内核访问像Nokia N900这样的蜂窝式调制解调器。
  hv&- 这个驱动用于提供Linux中的键值对(KVP :Key Value Pair)功能。
  hwmon&- 硬件监控驱动用于内核读取硬件传感器上的信息。比如,CPU上有个温度传感器。那么内核就可以追踪温度的变化并相应地调节风扇的速度。
  hwspinlock&- 硬件转锁驱动允许系统同时使用两个或者更多的处理器,或使用一个处理器上的两个或更多的核心。
  i2c&- I2C驱动可以使计算机用I2C协议处理主板上的低速外设。系统管理总线(SMBus :System Management Bus)驱动管理SMBus,这是一种用于轻量级通信的two-wire总线。
  ide&- 这些驱动用来处理像CDROM和硬盘这些PATA/IDE设备。
  idle&- 这个驱动用来管理Intel处理器的空闲功能。
  iio&- 工业I/O核心驱动程序用来处理数模转换器或模数转换器。
  infiniband&- Infiniband是在企业数据中心和一些超级计算机中使用的一种高性能的端口。这个目录中的驱动用来支持Infiniband硬件。
  input&- 这里包含了很多驱动,这些驱动都用于输入处理,包括游戏杆、鼠标、键盘、游戏端口(旧式的游戏杆接口)、遥控器、触控、耳麦按钮和许多其他的驱动。如今的操纵杆使用USB端口,但是在上世纪80、90年代,操纵杆是插在游戏端口的。
  iommu&- 输入/输出内存管理单元(IOMMU :Input/Output Memory Management Unit)驱动用来管理内存管理单元中的IOMMU。IOMMU连接DMA IO总线到内存上。IOMMU是设备在没有CPU帮助下直接访问内存的桥梁。这有助于减少处理器的负载。
  ipack&- Ipack代表的是IndustryPack。 这个驱动是一个虚拟总线,允许在载体和夹板之间操作。
  irqchip&- 这些驱动程序允许硬件的中断请求(IRQ)发送到处理器,暂时挂起一个正在运行的程序而去运行一个特殊的程序(称为一个中断处理程序)。
  isdn&- 这些驱动用于支持综合业务数字网(ISDN),这是用于同步数字传输语音、视频、数据和其他网络服务使用传统电话网络的电路的通信标准。
  leds&- 用于LED的驱动。
  lguest&- lguest用于管理客户机系统的中断。中断是CPU被重要任务打断的硬件或软件信号。CPU接着给硬件或软件一些处理资源。
  macintosh&- 苹果设备的驱动在这个文件夹里。
  mailbox&- 这个文件夹(pl320-pci)中的驱动用于管理邮箱系统的连接。
  md&- 多设备驱动用于支持磁盘阵列,一种多块硬盘间共享或复制数据的系统。
  media&- 媒体驱动提供了对收音机、调谐器、视频捕捉卡、DVB标准的数字电视等等的支持。驱动还提供了对不同通过USB或火线端口插入的多媒体设备的支持。
  memory&- 支持内存的重要驱动。
  memstick&- 这个驱动用于支持Sony记忆棒。
  message&- 这些驱动用于运行LSI Fusion MPT(一种消息传递技术)固件的LSI PCI芯片/适配器。LSI大规模集成,这代表每片芯片上集成了几万晶体管、
  mfd&- 多用途设备(MFD)驱动提供了对可以提供诸如电子邮件、传真、复印机、扫描仪、打印机功能的多用途设备的支持。这里的驱动还给MFD设备提供了一个通用多媒体通信端口(MCP)层。
  misc&- 这个目录包含了不适合在其他目录的各种驱动。就像光线传感器驱动。
  mmc&- MMC卡驱动用于处理用于MMC标准的闪存卡。
  mtd&- 内存技术设备(MTD :Memory technology devices)驱动程序用于Linux和闪存的交互,这就就像一层闪存转换层。其他块设备和字符设备的驱动程序不会以闪存设备的操作方式来做映射。尽管USB记忆卡和SD卡是闪存设备,但它们不使用这个驱动,因为他们隐藏在系统的块设备接口后。这个驱动用于新型闪存设备的通用闪存驱动器驱动。
  net&- 网络驱动提供像AppleTalk、TCP和其他的网络协议。这些驱动也提供对调制解调器、USB 2.0的网络设备、和射频设备的支持。
  nfc&- 这个驱动是德州仪器的共享传输层之间的接口和NCI核心。
  ntb&- 不透明的桥接驱动提供了在PCIe系统的不透明桥接。PCIe是一种高速扩展总线标准。
  nubus&- NuBus是一种32位并行计算总线。用于支持苹果设备。
  of&- 此驱动程序提供设备树中创建、访问和解释程序的OF助手。设备树是一种,用于描述硬件。
  oprofile&- 这个驱动用于从驱动到用户空间进程(运行在用户态下的应用)评测整个系统。这帮助开发人员找到性能问题----性能分析机制-是用于 Linux 的若干种评测和性能监控工具中的一种
  parisc&- 这些驱动用于HP生产的PA-RISC架构设备。PA-RISC是一种特殊指令集的处理器。
  parport&- 并口驱动提供了Linux下的并口支持。
  pci&- 这些驱动提供了PCI总线服务。
  pcmcia&- 这些是笔记本的pc卡驱动
  pinctrl&- 这些驱动用来处理引脚控制设备。引脚控制器可以禁用或启用I/O设备。
  platform&-这个文件夹包含了不同的计算机平台的驱动像Acer、Dell、Toshiba、IBM、Intel、Chrombooks等等。
  pnp&- 即插即用驱动允许用户在插入一个像USB的设备后可以立即使用而不必手动配置设备。
  power&- 电源驱动使内核可以测量电池电量,检测充电器和进行电源管理。
  pps&- Pulse-Per-Second驱动用来控制电流脉冲速率。这用于计时。
  ps3&- 这是Sony的游戏控制台驱动- PlayStation3。
  ptp&- 图片传输协议(PTP)驱动支持一种从数码相机中传输图片的协议。
  pwm&- 脉宽调制(PWM)驱动用于控制设备的电流脉冲。主要用于控制像CPU风扇。
  rapidio&- RapidIO驱动用于管理RapidIO架构,它是一种高性能分组交换,用于电路板上交互芯片的交互技术,也用于互相使用底板的电路板。
  regulator&- 校准驱动用于校准电流、温度、或其他可能系统存在的校准硬件。----用于控制系统中某些设备的电压电流供应
  remoteproc&- 这些驱动用来管理远程处理器。
  rpmsg&- 这个驱动用来控制支持大量驱动的远程处理器通讯总线(rpmsg)。这些总线提供消息传递设施,促进客户端驱动程序编写自己的连接协议消息。----该基础架构允许主处理器上的 Linux 操作系统管理远程处理器上远程软件环境的生命周期和通信-用于在 AMP 环境中的操作系统之间实现 IPC 的 rpmsg 组件和 API
  rtc&- 实时时钟(RTC)驱动使内核可以读取时钟。
  s390&- 用于31/32位的大型机架构的驱动。
  sbus&- 用于管理基于SPARC的总线驱动。
  scsi&- 允许内核使用SCSI标准外围设备。例如,Linux将在与SCSI硬件传输数据时使用SCSI驱动。
  sfi&-简单固件接口(SFI)驱动允许固件发送信息表给操作系统。这些表的数据称为SFI表。
  sh&- 该驱动用于支持SuperHway总线。
  sn&- 该驱动用于支持IOC3串口。
  spi&- 这些驱动处理串行设备接口总线(SPI),它是一个在在全双工下运行的同步串行数据链路标准,。全双工是指两个设备可以同一时间同时发送和接收信息。双工指的是双向通信。设备在主/从模式下通信(取决于设备配置)。
  ssb&- ssb(Sonics Silicon Backplane)驱动提供对在不同博通芯片和设备上使用的迷你总线的支持。
  staging&- 该目录含有许多子目录。这里所有的驱动还需要在加入主内核前经过更多的开发工作。
  target&- SCSI设备驱动
  tc&- 这些驱动用于TURBOchannel,TURBOchannel是数字设备公司开发的32位开放总线。这主要用于DEC工作站。
  thermal&- thermal驱动使CPU保持较低温度。---Linux温控框架
  tty&- tty驱动用于管理物理终端连接。
  uio&- 该驱动允许用户编译运行在用户空间而不是内核空间的驱动。这使用户驱动不会导致内核崩溃。-----运行在用户空间的IO技术
  usb&- USB设备允许内核使用USB端口。闪存驱动和记忆卡已经包含了固件和控制器,所以这些驱动程序允许内核使用USB接口和与USB设备。
  uwb&- Ultra-WideBand驱动用来管理短距离,高带宽通信的超低功耗的射频设备
  vfio&- 允许设备访问用户空间的VFIO驱动。----用户态驱动框架
  vhost&- 这是用于宿主内核中的virtio服务器驱动。用于虚拟化中。
  video&- 这是用来管理显卡和监视器的视频驱动。
  virt&- 这些驱动用来虚拟化。
  virtio&- 这个驱动用来在虚拟PCI设备上使用virtio设备。用于虚拟化中。
  vlynq&- 这个驱动控制着由德州仪器开发的专有接口。这些都是宽带产品,像WLAN和调制解调器,VOIP处理器,音频和数字媒体信号处理芯片。
  vme&- WMEbus最初是为摩托罗拉68000系列处理器开发的总线标准
  w1&- 这些驱动用来控制one-wire总线。
  watchdog&- 该驱动管理看门狗定时器,这是一个可以用来检测和恢复异常的定时器。
  xen&- 该驱动是Xen管理程序系统。这是个允许用户运行多个操作系统在一台计算机的软件或硬件。这意味着xen的代码将允许用户在同一时间的一台计算机上运行两个或更多的Linux系统。用户也可以在Linux上运行Windows、Solaris、FreeBSD、或其他操作系统。
  zorro&- 该驱动提供Zorro Amiga总线支持。
  Linux内核是所有Linux系统的核心。如果有任何恶意代码控制或破害了内核的任何一部分,那么系统会严重受损,文件可能被删除或损坏,私人信息可能被盗等等。很明显,保持内核安全涉及到用户的最大利益。值得庆幸的是,由于Linux内核极其安全,Linux是一个非常安全的系统。在用户比例上,Linux病毒比Windows病毒更少,并且Linux用户比Windows用户个人更少感染病毒。(这就是为什么许多公司使用Linux来管理他们的服务器的一个原因。) 然而,我们仍然没有借口去忽视内核的安全。Linux有几个安全特性和程序,但本文只讨论Linux安全模块(LSM)及其它的内核安全特性。
  提示: 绝不在内核源代码内移动文件,除非你知道你在做什么。否则,编译会由于 失文件失败。
  Linux内核的文件夹结构保持相对稳定。内核开发者会做一些修改,但总体来说,这些设置对整个内核版本都是一样。驱动程序文件夹的布局也基本保持一样。
  驱动程序是使内核能够沟通和操作硬件或协议(规则和标准)的小程序。没有驱动程序,内核不知道如何与硬件沟通或者处理协议(内核实际上先发送指令给BIOS,然后BIOS传给硬件)。 Linux的内核代码在驱动程序文件夹中以源代码的形式包含了许多驱动程序。驱动文件夹中的每个文件夹会在下面说明。在配置和 编译内核时,这样有助于你了解驱动程序。否则,用户可能会在编译时加入不必要的或者漏掉重要的驱动。驱动代码通常会包含一个单行注释来指出驱动的目的。
比如,tc的驱动代码,有一行的注释说是用于TURBOchannel总线。由于这些文档,用户应该看驱动前几行的注释来了解它们的用途。
  有几个术语你应该已经知道,所以下面的信息应该是明白的。一个I/O设备指的是输入/输出设备。例如调制解调器和网卡,他们发送和接收数据。监视器是一个输出设备 - 只有信息出来。键盘、鼠标和游戏杆是数据输入系统。存储设备用于存储数据,例如SD卡、硬盘、光盘、存储卡等。CPU(处理器)是计算机的“大脑”或“心脏” ,如果没有它,电脑就无法运作。主板则是一块连接板上不同组件的印刷线路板。主板及各个组件是计算机的运行的基础。许多计算机用户说主板是电脑的心脏(主板上有CPU)。主板包含了用于连接外设的端口,外设包括输入、输出和存储设备。总线是主板的电路,它连接着外设。网络设备用于两台或多台计算机之间的连接。端口则是用户可以插入另外一台设备或一根电缆的设备,例如,用户可以将插入一根火线记忆棒插入一个火线端口;将以太网电缆插入一个以太网端口。光碟的读取是利用激光,从可以散射或反射的激光的反射面上读出数据,一个常见的
光盘是DVD。许多系统说自己是32位或者64位,这指的是寄存器、地址总线或数据总线的位数。例如,在一块64位的主板上,数据总线(组件之间的银线)有64根并排到目的的线。存储器地址以位(0和1)的形式在存储器中编址,因此,一个32位存储地址包含32个0和1来表示存储器上的某处地址。
Linux安全模块:
  AppArmor(应用盔甲)最初是由Immunix写的安全模块。自从2009年以来,Canonical维护着这些代码(Novell在Immunix之后,Canonical以前管理这些代码)。这个安全模块已经从2.6.36版本进入Linux主分支之中。AppArmor限制了程序的能力。AppArmor使用文件路径来跟踪程序限制。许多Linux管理员称AppArmor是最容易配置的安全模块。然而,而许多Linux用户觉得这个模块与其它的替代品相比很糟糕。
  安全增强Linux(SELinux)是AppArmor的替代品,它最初由美国国家安全局开发(NSA)。SELinux自从2.6版本就进入内核主分支中。SELinux是限制修改内核和用户空间的工具。SELinux给可执行文件(主要是守护进程和服务端程序)最小特权去完成它们的任务。SELinux也可以用来控制用户权限。SELinux不像AppArmor那样使用文件路径,而SELinux在追踪权限时使用文件系统去标记可执行文件。因为SElinux本身使用文件系统管理可执行文件,所以SELinux不能像AppArmor那样对整个文件系统提供保护。
  注意:守护进程是在后台运行的程序
  注意:虽然在内核中有AppArmor、SELinux及其它安全模块,但只能有一个安全模块被激活。
  Smack是安全模块的另一种选择。Smack从2.6.25起进入内核主分支。Smack应能比AppArmor更安全,但比SELinux更容易配置。
  TOMOYO,是另外一个安全模块,在2.6.30进入内核主分支。TOMOYO可以提供安全防护,但是它的主要用途是分析系统安全缺陷。
  AppArmor、SELinux、Smack和TOMYO组成了四个标准Linux安全模块。这些都通过使用强制访问控制(MAC : mandatory access control)工作,这种访问控制是通过限制程序或者用户执行一些任务来实现的。安全模块还有某些形式的列表规定了它们可以做什么不可以做什么。
  Yama在Linux内核中一个新安全模块。Yama还没有作为标准的安全模块,但是在将来他会成为第5个标准安全模块。Yama和其他安全模块一样使用相同的机制。
  “grsecurity”是一系列Linux内核安全补丁的集合。多数补丁用于处理远程网络连接和缓冲区溢出的安全问题(以后讨论)。grsecurity中有一个叫PaX的有趣组件。PaX补丁允许内存里的代码使用最少的所需权限。例如,存储程序的内存段被标为不可写。想想看,为什么一个可执行的程序需要在内存中是可写的?通过这个补丁,恶意代码就不能修改目前正在执行的程序。缓冲区溢出是一种当程序由于bug或者恶意代码在内存上写入数据,并让它的内存边界超出到其他程序的内存页上的安全事件。当Pax被激活时,它会帮助阻止这些缓冲区溢出,因为程序没有写到其他内存页上的权限了。
  Linux入侵检测系统(LIDS)是一个内核安全补丁,提供了强制访问控制(MAC)的特性。这个补丁就像扮演LSM模块的角色。
  Systrace是一个减少和控制应用程序访问系统文件和系统调用的工具。系统调用是对内核的服务请求。比如,当一个文本编辑器写入一个文件到硬盘上时,程序将会发送一个系统请求让内核写入文件到硬盘中。
  这些是在Linux安全系统中非常重要的组件。这些安全模块和补丁使内核免于受到恶意代码的攻击。没有这些特性,Linux系统将会变成一个不安全的操作系统。
配置并编译内核代码:
  现在我们已经了解了内核,现在我们可以进入主要工作:配置并编译内核代码。配置内核代码并不会花费太长时间。配置工具会询问许多问题并且允许开发者配置内核的每个方面。如果你有不确定的问题或者特性,你最好使用配置工具提供的默认值。本系列教程会使读者逐步了解配置内核的整个过程。
  配置代码前需要在源文件的文件夹内打开一个终端。当终端打开后,基于你喜好的配置界面,这里有几种不同的配置方法:
make config - 纯文本界面 (最常用的选择)。&
make menuconfig - 基于文本彩色菜单和单选列表。这个选项可以加快开发者开发速度。需要安装ncurses(ncurses-devel)。&
make nconfig - 基于文本的彩色菜单。需要安装curses (libcdk5-dev)。&
make xconfig - QT/X-windows 界面。需要安装QT。&
make gconfig - Gtk/X-windows 界面。需要安装GTK。&
make oldconfig - 纯文本界面,但是其默认的问题是基于已有的本地配置文件。&
make silentoldconfig - 和oldconfig相似,但是不会显示配置文件中已有的问题的回答。&
make olddefconfig -和silentoldconfig相似,但有些问题已经以它们的默认值选择。&
make defconfig - 这个选项将会创建一份以当前系统架构为基础的默认设置文件。&
make ${PLATFORM}defconfig - 创建一份使用arch/$ARCH/configs/${PLATFORM}defconfig中的值的配置文件。&
make allyesconfig - 这个选项将会创建一份尽可能多的问题回答都为‘yes’的配置文件。&
make allmodconfig - 这个选项将会创建一份将尽可能多的内核部分配置为模块的配置文件。
  注意:内核代码可以放进内核自身,也可以成为一个模块。例如,用户可以将蓝牙驱动作为一个模块加入(独立于内核),或者直接放到内核栗,或者完全不加蓝牙驱动。当代码放到内核本身时,内核将会请求更多的内存并且启动会花费更长的时间。然而,内核会执行的更好。如果代码作为模块加入,代码将会一直存在于硬盘上直到被需要时加载。接着模块被加载到内存中。这可以减少内核的内存使用并减少启动的时间。然而,因为内核和模块在内存上相互独立所以会影响内核的性能。另一种选择是不添加一些代码。举例来说,内核开发人员假如知道系统永远都不会使用蓝牙设备,因此这个驱动就可以不加到内核中。这提升了内核的性能。然而,如果用户之后需要蓝牙设备,那么他么需要安装蓝牙模块或者升级内核才行。
make allnoconfig - 这个选项只会生成内核所必要代码的配置文件。它对尽可能多的问题都回答no。这有时会导致内核无法工作在为编译该内核的硬件上。&
make randconfig - 这个选项会对内核选项随机选择(译注:这是做什么用途的?!)。&
make localmodconfig - 这个选项会根据当前已加载模块列表和系统配置来生成配置文件。&
make localyesconfig - 将所有可装载模块(LKM)都编译进内核(译者注:这里与原文 ‘This will set all module options to yes - most (or all) of the kernel will not be in modules’的意思不同,作者也作出了解释:13307)。
  贴士:最好使用“make menuconfig”,因为用户可以保存进度。“make config”不会提供这样的便利,因为配置过程会耗费大量时间。
  大多数开发者选择使用“make menucongfig”或者其他图形菜单之一。当键入上述配置命令后,第一个问题,是受否将内核编译成64位。选项有“Y”、“n”和“?”。问号用来解释这个问题,“n”代表这个问题回答否(no),&Y&代表这个问题回答是(yes)。在这个教程里,我选择是。 这里我输入&Y&(这里是大小写敏感的)并输入回车。
  注意:当内核在32位系统上编译时,编译工具会询问内核是否编译成32位。第一个问题在不同的处理器上不一样。
  下一行显示的是&Cross-compiler tool prefix (CROSS_COMPILE) []&(交叉编译器工具前缀)。如果你不是做交叉编译就直接按下回车。如果你正在交叉编译,对ARM系统输入像&arm-unknown-linux-gnu-&,对64位PC输入像&x86_64-pc-linux-gnu-&的字样。对其他处理器而言还有许多其他可能的命令,但是这个表太大了。一旦一名开发者知道他们想要支持的处理器,很容易就可研究出处理器需要的命令。
  注意:交叉编译是为别的处理器编译代码。比如,一台Intel系统正编译着不在Intel处理器上运行的程序,比如,这个系统可能正在编译着要在ARM或AMD处理器上运行的代码。
  注意:每一项选择会改变接下来显示什么问题及何时显示。我会(在教程里)包含上我的选择让读者可以在他们自己的系统上跟上配置的进度。
  接下来,用户会看到“Local version - append to kernel release (LOCALVERSION) []”(本地版本号,附加到内核版本号后面)。这使开发人员可以给定一个特殊版本号或命名他们自定义的内核。我将输入“LinuxDotOrg”,这样,内核版本会显示为“3.9.4-LinuxDotOrg”。接下来,配置工具会询问“Automatically append version information to the version string (LOCALVERSION_AUTO)
[N/y/?]”(是否自动添加版本信息到版本号后)。如果本地有一个版本库,git的修订号会被添加到版本号后面。这个例子中我们没有使用git,所以我回答&no&。不然git修订号将会追加到版本号中。还记得vmlinuz和几个类似的文件么?好了,下一个问题就是问使用哪一种格式压缩内核。开发人员可以从五个选项中选择一个。它们是
Gzip (KERNEL_GZIP)&
Bzip2 (KERNEL_BZIP2)&
LZMA (KERNEL_LZMA)&
XZ (KERNEL_XZ)&
LZO (KERNEL_LZO)
  Gzip是默认值,所以我选择&1&并按回车。每种压缩格式和其他压缩格式相比都有更高或者更低的压缩比。更好的压缩比意味着更小的体积,但是与低压缩比文件相比,它解压时需要更多的时间。
  现在这行显示“Default hostname (DEFAULT_HOSTNAME) [(none)]”(默认主机名)。这里可以配置主机名。通常地,开发者这行留空(我这里留空),以便以后Linux用户可以自己设置他们的主机名。
  接下来开发者可以启用或者禁用交换分区。Linux使用一个叫做&swap space&的独立分区来使用虚拟内存。这相当于Windows中的页面文件。典型地,开发者在这行“Support for paging of anonymous memory (swap) (SWAP) [Y/n/?]”(是否支持匿名内存换页)回答“Y”。
  接下来的一行(System V IPC (SYSVIPC) [Y/n/?])询问内核是否支持IPC。进程间通信使进程间可以通信和同步。最好启用IPC不然许多程序将无法工作。这个问题回答“Y”会使配置工具接下来问“POSIX Message Queues (POSIX_MQUEUE) [Y/n/?]”(是否使用POSIX消息队列),这个问题只会在IPC启用后看见。POSIX消息队列是一种给每条消息一个优先级的消息队列(一种进程间通信形式)。默认的选择是“Y”。按回车选择默认选择(以大写选择指示默认)。
  下一个问题“open by fhandle syscalls (FHANDLE) [Y/n/?]”(是否使用文件句柄系统调用来打开文件)是问当有需要进行文件系统操作的时候,程序是否允许使用文件句柄而不是文件名进行。默认上,这个选择是“Y”。
  有时,开发者在做了一些选择后,某些问题会自动回答。比如,下一个问题“Auditing support (AUDIT) [Y/?]”(是否支持审计)会在没有提示的情况下自动回答,因为先前的选项需要这个特性。审计支持会记录所有文件的访问和修改。下一个关于审计的问题“Enable system-call auditing support (AUDITSYSCALL) [Y/n/?]”(是否启用系统调用审计支持)。如果启用,所有的系统调用都会记录下来。如果开发者想要更好的性能,那么最好尽可能地禁用审计特性并且不把它加入内核。而另外一些开发者可能为了安全监控而启用审计。这个问题我选择“n”。下一个审计方面的问题“Make
audit loginuid immutable (AUDITLOGINUIDIMMUTABLE) [N/y/?]”(是否要审计进程身份ID不可变)是询问进程是否可以改变它们的loginuid(LOGIN User ID),如果启用,用户空间的进程将无法改变他们的loginuid。为了更好的性能,我们这里禁用这个特性。(译注:对于使用systemd这样的系统,其是通过中央进程来重启登录服务的,设置为“y”可以避免一些安全问题;而使用较旧的SysVinit和Upstart的系统,其需要管理员手工重启登录服务,应该设置为“N”)
  注意:当通过“make config”配置时,这些通过配置工具回答的问题会显示出来但是用户无法改变答案。当通过&make menuconfig&配置时,无论用户按任何键都无法改变选项。开发者不需要去改变这些选项,因为之前的选择决定了另外一个问题的选择。
  这一部分我们讲配置内核IRQ子系统。中断请求(IRQ)是硬件发给处理器的一个信号,它暂时停止一个正在运行的程序并允许一个特殊的程序占用CPU运行。
  这个目录中的第一个问题属于内核特性(Expose hardware/virtual IRQ mapping via debugfs (IRQ_DOMAIN_DEBUG))(通过debugfs来显示硬件/虚拟的IRQ映射),它询问是否可以使用虚拟的调试文件系统来映射硬件及Linux上对应的IRQ中断号。这个用作调试目的,大多数用户不需要用到,所以我选择了&no&。
  下一个标题显示&Timers subsystem&(计时器子系统)。第一个有关定时器子系统的问题是“Tickless System (Dynamic Ticks) (NO_HZ)”(无滴答系统)。我选择了“yes”,这会启用一个无滴答系统。这意味着定时器中断将会按需使用,定时器中断允许任务以特定的时间间隔执行。下一个问题(High Resolution Timer Support (HIGH_RES_TIMERS))问是否支持高精度定时器。并不是所有的硬件支持这个,通常地说,如果硬件很慢或很旧,那么选择&no&,否则像我一样选择&yes&。
  下一个标题&CPU/Task time and stats accounting&(CPU/任务用时与状态统计),这个是关于进程的追踪。第一个问题看上去像这样:
  Cputime accounting (CPU用时统计)
  Simple tick based cputime accounting (TICK_CPU_ACCOUNTING) (简单基于滴答的用时统计)&
Full dynticks CPU time accounting (VIRT_CPU_ACCOUNTING_GEN) (NEW) (全动态滴答的用时统计)&
Fine granularity task level IRQ time accounting (IRQ_TIME_ACCOUNTING) (细粒度的任务级IRQ用时统计)&
TICKCPUACCOUNTING会在每个CPU滴答中检测/proc/stat。这是默认的选项,这个记账方法非常简单。
  注意:CPU滴答是抽象测量CPU时间的方式。每个处理器、操作系统和安装的系统都不同,比如说,一个更强大的处理器会比老的处理器拥有更多的CPU滴答。如果你安装了一个Linux系统,然后接着在同一块磁盘上重新安装了它,你可能会得到一个更快或更慢的CPU滴答时间(至少一些计算机技术书上这么说)。通常来讲,一个更快的时钟速度意味着更多的CPU滴答。
  如果启用了VIRT_CPU_ACCOUNTING_GEN,任务和CPU时间统计将由监视内核-用户边界实现。这个选择的代价是会增加额外的开销。
  IRQ_TIME_ACCOUNTING记账方式则通过检测IRQ状态间的时间戳工作,这个性能开销很小。
  我选择了&1&并被询问有关BSD记账&BSD Process Accounting (BSD_PROCESS_ACCT)&(BSD进程记账)的问题。这个内核特性会记录每个进程不同的关闭信息。为了得到一个更小和更快的内核,我选择了&no&.
  下一组问题看上去就像下面这样。
  Export task/process statistics through netlink (TASKSTATS) (通过netlink导出任务/进程统计数据)&
Enable per-task delay accounting (TASK_DELAY_ACCT) (启用针对每个任务的延迟统计)&
Enable extended accounting over taskstats (TASK_XACCT) (启用taskstats的扩展统计)&
TASKSTATS使内核可以通过网络套接字导出进程统计。网络套接字是内核和用户空间进程间IPC通信的一种形式。TASKDELAY\ACCT监视进程并注意资源访问的延迟。比如,TASKDELAYACCT可以看到X进程正在为了CPU时间而等待,如果TASK_DELAY_ACCT观察到进程已经等待了太长时间,这个进程接着就会被给予一些CPU时间。TASK_XACCT会收集额外的统计数据,为了更小的内核负载我会禁用这个。
  现在接下来的目录就会显示RCU子系统:读取-复制-更新子系统是一种低负载的同步机制,它允许程序查看到正在被修改/更新的文件。配置工具已经回答了第一个问题。
  RCU Implementation (RCU 实现方式)
  & 1. Tree-based hierarchical RCU (TREE_RCU) (树形分层结构的RCU)
  choice[1]: 1
  这里就选择“1”。除了TREE_RCU,还有classic RCU(更老的实现)。下一个问题(Consider userspace as in RCU extended quiescent state (RCU_USER_QS) [N/y/?])(是否在用户空间记录扩展的quiescent状态)问RCU是否可以在CPU运行在用户空间时设置一个特殊的quiescent状态。这个选项通常被禁用,因为这会增加太多消耗。下面是另一个RCU问题(Tree-based hierarchical RCU fanout
value (RCU_FANOUT) [64])(树形分层结构的RCU端点数),问的是关于端点数。下一个问题(Tree-based hierarchical RCU leaf-level fanout value (RCU_FANOUT_LEAF) [16])(树形分层结构的RCU叶级端点数),是另外一个关于端点数的问题,但它只处理叶级。还有另外一个RCU问题(Disable tree-based hierarchical RCU auto-balancing (RCU_FANOUT_EXACT) [N/y/?])(是否禁用树形分层结构的RCU的自动平衡),询问是否禁用RCU自动平衡树,而采用上述的端点数。
  接下来,配置脚本将会询问&Accelerate last non-dyntick-idle CPU's grace periods (RCU_FAST_NO_HZ)&(加速最后的非dyntick-idle CPU的RCU宽限期)。在这之后会显示&Offload RCU callback processing from boot-selected CPUs (RCU_NOCB_CPU)&(从选择引导的CPU里面卸载RCU回调)。(译注:此处作者没做解释。前一个能够节省电力,但是降低了性能;后一个用于调试。)
  下一个问题非常重要(nfig support (IKCONFIG))(内核nfig支持)。开发人员可以选择保存由这个配置工具生成的设置到一个文件中。这个文件可以放在内核中,也可在一个模块中,或者完全不保存。这个文件可以被想要编译一个完全跟某人相同内核的开发者使用。这个文件还可以帮助开发人员使用一个更新的编译器重新编译一个内核。举例来说,开发人员配置并编译了一个内核,然而编译器有一些bug,但开发人员仍然需要一个使用这些设置的内核。而值得庆幸的是,开发人员可以升级他们的编译器,并使用设置文件来节省他们重新配置内核的时间。开发人员也可以在另一台计算机上保存源代码和配置文件并编译内核。至于另一个目的,开发人员可以加载该文件,并根据需要调整设置。我选择保存配置文件在一个模块中,这个问题
&Enable access nfig through /proc/config.gz (IKCONFIG_PROC)&(启用通过/proc/config.gz来访nfig的功能)是询问这个文件是否是可以通过这次方式访问的,我选择了&yes&。
  下一个问题是内核使用多大的log缓冲区(Kernel log buffer size (16 =& 64KB, 17 =& 128KB) (LOG_BUF_SHIFT) [17])(内核日志缓冲区大小)。小的缓冲区意味着它无法像更大的缓冲区那样保持日志更长的时间。这个选择取决于开发者想要日志保持的时间,我选择的是&12&。
  接着,出现了另外一个问题。该问题询问关于是否启用NUMA(非一致性内存访问)的内存/任务的均衡(Automatically enable NUMA aware memory/task placement (NUMA_BALANCING_DEFAULT_ENABLED))(自动启用NUMA的内存/任务均衡)。如果在NUMA的机器上设置了该选项,那么NUMA自动平衡就会启用。在NUMA下,处理器可以比非本地内存(内存分配给另外一个处理器或在处理器之间共享的内存)更快地访问它的本地内存。如果上面启用了(我启用了),那么最好对这个问题&Memory
placement aware NUMA scheduler (NUMA_BALANCING)&(由NUMA调度器进行内存分配)回答&yes&,这是一个NUMA调度器。
  在新的标题&Control Group support&(Cgroup支持)下,因为先前的选择,&Control Group support (CGROUPS)&(Cgroup支持)被自动地回答了&yes&。
  以下设定(Example debug cgroup subsystem (CGROUP_DEBUG))(导出Cgroup子系统的调试信息)是启用一个用于调试cgroup框架的一个简单cgroup子系统。下一个选项(Freezer cgroup subsystem (CGROUP_FREEZER))(冻结Cgroup子系统)可以让程序员可以冻结或解冻cgroup内的任务。
  注意:cgroup是一组进程。
  下面我们要求回答&Device controller for cgroups (CGROUP_DEVICE)&(Cgroup的设备控制器)。cgroup(控制组)是一种用来控制资源使用的特性。回答&yes&可以允许设备cgroup的白名单可以使用open和mknod系统调用(用来创建文件系统节点的系统调用)。
  下一个问题(Cpuset support (CPUSETS))(CPU分组支持)询问的是内核是否可以创建和管理CPU分组。这允许管理员可以在一个系统上动态分配各组内存节点,并分配任务在这些内存上运行。这通常用于SMP和NUMA系统中。我这个问题回答的是&no&。
  注意:请记住,如果我没有指定我选的是什么,那么我选的就是默认选项。
  启用cgroup统计子系统(Simple CPU accounting cgroup subsystem (CGROUP_CPUACCT))(Cgroup子系统的简单CPU统计)会生成一个资源控制器来监控在一个cgroup组内的独立任务的CPU使用情况。我选择了&no&。
  资源计数器(Resource counters (RESOURCE_COUNTERS))使控制器的独立资源统计功能能够统计cgroup。我选择了&no&。
  下一个问题(Enable perf_event per-cpu per- group (cgroup) monitoring (CGROUP_PERF))(启用每个CPU、每个容器组的pref_event监控)允许开发者扩展每个CPU的模式,使它可以只监控运行在特定CPU上的一个特别的cgroup组的线程。
  下一章节是&Group CPU Scheduler&(CPU分组调度器)。前两个已经回答的问题包括:
  Group CPU scheduler (CGROUPSCHED)(CPU分组调度器) Group scheduling for SCHEDOTHER (FAIRGROUP\SCHED)(SCHED_OTHER分组调度)
  第一个已回答的问题(CPU bandwidth provisioning for FAIR_GROUP_SCHED (CFS_BANDWIDTH))(CPU带宽分配)询问的是内核是否允许用户设置在公平组调度器内执行的任务的CPU带宽限制。没有限制的组会被认为不受约束,并会没有限制地运行。
  注意:并不是所有内核选项都在这里。我这里提到的组只是为了便于阅读,并挑出那些新的和大的部分。并不需要了解所有的分组。分组有助于使用图形工具配置内核,这样开发者可以在搜索特定的设置时,直接通过分组菜单找到。
  开发者可以通过回答&Group scheduling for SCHED_RR/FIFO (RT_GROUP_SCHED)&(SCHED_RR/FIFO分组调度)这个问题为&yes&来让用户可以分配CPU带宽到任务组中。
  下一个问题是&Block IO controller (BLK_CGROUP)&(阻塞IO控制器)。任务组可以被识别,并且它们的磁盘带宽是由使用块IO控制器实现的CFQ IO调度器分配的。BIO在块级的限制逻辑使用块IO控制器来提供设备上的IO速率上限。
  这里有一个调试问题(Enable Block IO controller debugging (DEBUGBLKCGROUP) [N/y/?])(启用阻塞IO控制器的调试)询问是否启用块IO控制器的调试。为了制作一个精简的内核,最好禁用这个 性。
  为了启用内核中的检查点和还原特性。这个问题“Checkpoint/restore support (CHECKPOINT_RESTORE)”(检查点及还原支持)可以选择“yes”,不过为了更低的负载这里我选择了“n”。启用这个特性会增加辅助的进程控制代码来设置进程的代码段、数据段和堆的大小,并增加了一些额外的程序入口。
  下面我们就要配置命名空间的支持了。命名空间是一组标识符的容器。比如,/usr/lib/python3/dist-packages/re.py就是一个标识符,/usr/lib/python3/dist-packages/就是一个命名空间。而re.py是这个命名空间下的本地名称。
  第一个命名空间问题(Namespaces support (NAMESPACES))询问的是是否启用命名空间。这允许可以使用相同的PID但在不同的命名空间内(译注:原文为& This will allow the same PIDs (Process ID) to be used but indifferent namespaces&,这里indiffernt根据上下文应该是少了空格),否则PID永远不会重复。
  下一个问题(UTS namespace (UTS_NS))询问是否可以让UTS命名空间内的任务可以在uname()系统调用中看到不同的信息。uname()系统调用提供查看机器和操作系统的信息。
  启用IPC命名空间(IPC namespace (IPC_NS))将允许在这个命名空间内的任务与其他命名空间内相对应IPC ID的对象协同工作。
  PID命名空间(PID Namespaces (PID_NS))就是进程ID命名空间。这可以使不同的进程在不同的PID命名空间使用相同的PID。这是一个容器的构建块。
  接下来,启用网络命名空间(Network namespace (NET_NS))可以使用户创建一个拥有多个实例的网络栈。
  当启用后,自动进程分组调度(SCHED_AUTOGROUP)会填充并创建任务组来优化桌面程序的调度。它将把占用大量资源的应用程序放在它们自己的任务组,这有助于性能提升。
  这里是一个调试特性,除非你有特别的需求否则应该禁用它。这个问题(Enable deprecated sysfs features to support old userspace tools (SYSFS_DEPRECATED))(启用不推荐的sysfs功能来支持旧式的用户空间工具)询问是否启用sysfs,这是调试内核时用的虚拟文件系统。
  接下来,因为当前的配置需要它,所以&Kernel-&user space relay support (formerly relayfs) (RELAY)&(内核-&用户空间的中继支持,即relayfs)已经被设成&yes&了。最好启用initrd支持(Initial RAM filesystem and RAM disk (initramfs/initrd) support (BLK_DEV_INITRD))(初始化内存文件系统和内存盘(initramfs/initrd))。
  用户会被问及哪里放置initramfs源文件。如果没有需要,请留空。
  接下来,开发人员会被询问关于初始虚拟磁盘(Linux的内核映像文件)所支持的压缩格式。你可以启用所有支持的压缩格式。
  Support initial ramdisks compressed using gzip (RD_GZIP)&
Support initial ramdisks compressed using bzip2 (RD_BZIP2)&
Support initial ramdisks compressed using LZMA (RD_LZMA)&
Support initial ramdisks compressed using XZ (RD_XZ)&
Support initial ramdisks compressed using LZO (RD_LZO)&
这里设置了内核的编译内核编译选项(Optimize for size (CC_OPTIMIZE_FOR_SIZE))(优化大小)。开发者可以让编译器在编译时优化代码。我选择了&yes&。
  用户想要配置更多的内核特性,那么下个问题就回答&yes&(Configure standard kernel features (expert users) (EXPERT))(配置标准内核特性(专家级用户))。
  要启用过时的16位UID系统调用封装器,这个问题设成&yes&(Enable 16-bit UID system calls (UID16))。系统调用就会使用16位UID。
  推荐启用&sysctl syscall&(Sysctl syscall support (SYSCTL_SYSCALL))支持。这使/proc/sys成为二进制路径的接口。
  接下来的两个问题已经被预先回答了&yes&,它们是&Load all symbols for debugging/ksymoops (KALLSYMS)&(载入所以的调试符号)和&“Include all symbols in kallsyms (KALLSYMS_ALL)&(包括所有的kallsyms符号)。这些都是启用调试标志。
  下一步,开发者应该启用printk支持( (Enable support for printk (PRINTK))),这会输出内核消息到内核日志中。这在内核出错时是很重要的。编译一个&哑巴&内核并不是一个好主意。然而,如果我们启用了这个支持,就会被一些开发者看到这些出错,要么就不要启用。
  除非有必要,开发者可以禁用bug支持(BUG() support (BUG))。禁用这项将会不支持WARN信息和BUG信息。这会减小内核的体积。
  OK,我们还继续配置内核。还有更多功能等待着去配置。
  下一个问题(Enable ELF core dumps (ELF_CORE))询问的是内核是否可以生成内核转储文件。这会使内核变大4KB。所以我选择了&no&。
  注意:内核转储文件(内存或者系统的转储)是程序崩溃前已记录的状态。内核转储是用来调试问题的。这个转储文件的格式是ELF(Executable and Linkable Format )。
  下面可以启用PC扬声器(Enable PC-Speaker support (PCSPKR_PLATFORM))。大多数计算机用户拥有并使用扬声器,所以这个启用它。
  虽然下面的特性会增加内核的大小(Enable full-sized data structures for core (BASE_FULL))(启用完全大小的内核数据结构),但性能也随之增加。所以我选择&yes&。
  为了使内核可以运行基于glibc的程序,必须启用FUTEX(Enable futex support (FUTEX))。这个特性启用了快速用户空间互斥锁(Fast Userspace muTEXes)。
  注意:glibc(GNU C Library)是由GNU实现的标准C库。
  注意:FUTEX (fast userspace mutex)是用来防止两个线程访问同一个不能被多个线程使用的共享资源。
  下一个问题(Enable eventpoll support (EPOLL))可以通过回答&no&来禁用epoll系统调用。然而,为了含有epoll系统调用,我选择了&yes&。epoll是一种I/O事件通知系统。
  为了收到来自文件描述符的信号,我们启用signalfd系统调用(Enable signalfd() system call (SIGNALFD)。
  如果启用这个特性(Enable timerfd() system call (TIMERFD)),它允许程序使用定时器事件获取文件描述符。
  我们现在的配置必须启用eventfd系统调用(Enable eventfd() system call (EVENTFD))。它默认启用访问共享内存文件系统(Use full shmem filesystem (SHMEM)。共享内存文件系统是一种虚拟内存文件系统。
  下一个问题是&Enable AIO support (AIO)&。这个特性启用了线程化程序使用的POSIX异步I/O。
  注意:异步I/O用来处理输入/输出,它允许线程在传输完成前就完成处理。
  如果你正在给一个嵌入式系统配置一个内核,那么问题“Embedded system (EMBEDDED)”可以选择&yes&。否则就像我一样选择&no&。
  注意:嵌入式系统是运行在一个更大的电子系统的实时计算机。
  现在,我们可以配置内核性能事件和计时器了。配置工具没有给开发者选择,直接启用了事件和计数器(Kernel performance events and counters (PERF_EVENTS))(内核性能事件和计数器)。这是一个重要特性。
  接下来,我们可以禁用另外一个调试特性(ebug: use vmalloc to back perf mmap() buffers (DEBUG_PERF_USE_VMALLOC))。
  如果启用了VM事件计数器,那么事件计数就会显示在/proc/vmstat(Enable VM event counters for /proc/vmstat (VM_EVENT_COUNTERS))。如果禁用了事件计数就不会显示,/proc/vmstat只会显示内存页计数。
  为了更好地支持PCI芯片,(Enable PCI quirk workarounds (PCI_QUIRKS))回答yes。这会启用对PCI芯片的怪异行为和bug的临时解决方案。
  下面一个调试特性可以像我一样禁用掉(Enable SLUB debugging support (SLUB_DEBUG))。这个特性会耗费很多空间并且会禁用用于调试内核的SLB sysfs。如果这个特性被禁用,那么/sys/slab就不会存在并且系统上也不再支持缓冲验证。
  堆随机化是一个让利用堆漏洞更加困难的特性(Disable heap randomization (COMPAT_BRK))。然而我们不应该去启用它,因为任何基于libc5的软件都无法工作在这个系统上!只有我们有特别的理由这么做或者如果你不会使用基于libc5的软件时才去启用它。我禁用了这个特性。当编译一个通用的内核时,开发这会希望禁用这个特性。
  接下来必须选择一个SLAB分配器。SLAB分配器是一个没有碎片且有效率地将内核对象放置在内存中的内存管理系统。默认选择是&2&。
  Choose SLAB allocator
  1. SLAB (SLAB)
  & 2. SLUB (Unqueued Allocator) (SLUB)
  3. SLOB (Simple Allocator) (SLOB)
  choice[1-3?]: 2
  为了支持扩展性能支持,(Profiling support (PROFILING))回答&yes&。
  下一个问题让开发者选择是否启用OProfile系统。它可以禁用、启用或者添加为一个模块在需要时载入。我选择禁用这个特性。
  Kprobes允许用户捕捉几乎任意的内核地址去启动一个回调函数。这是一个可以像我一样禁用的调试工具(Kprobes (KPROBES))。
  这个优化特性可以启用(Optimize very unlikely/likely branches (JUMP_LABEL))(优化非常近似/不近似的分支)。这使分支预判更加简单并可以减小开销。
  配置工具启用了一个实验性特性&透明用户空间探针&(Transparent user-space probes (EXPERIMENTAL) (UPROBES))。不过不要担心,系统可以很好工作,并不是所有的实验性特性是不稳定或者坏的。
  接下来,我们会被询问基于gcov的内核分析(Enable gcov-based kernel profiling (GCOV_KERNEL))。这可以被禁用。
  为了允许内核加载模块,需要启用可加载模块支持(Enable loadable module support (MODULES))。
  内核一般只能加载有版本号的模块。如果想允许内核加载没有版本号的模块,就启用这个特性(Forced module loading (MODULE_FORCE_LOAD))(强制模块载入)。这么做是一个很糟糕的注意,所以我已经禁用了它,除非你有特定的需求需要这个特性。
  如果启用了这个特性(Module unloading (MODULE_UNLOAD)),Linux内核也能卸载模块,最好启用。如果内核判断你要卸载的模块不应该被卸载,那么用户则无法卸载模块。启用强制卸载也行,但是不建议(Forced module unloading (MODULE_FORCE_UNLOAD)。
  为了使用不是为你的内核开发的或者并不适用你的版本号的模块,可以启用版本支持(Module versioning support (MODVERSIONS))。最好不要混用不同版本号的模块,所以我禁用了这个特性。
  模块在它们的modinfo(模块信息)里有一个字段名为&srcverion&。这个字段允许开发者知道使用什么源码版本来编译模块。启用这个选项可以在编译模块的时候加入这个字段。这个并不必要,所以我禁用了它(Source checksum for all modules (MODULE_SRCVERSION_ALL))。如果启用了先前的选项,开发者可以将校验和加入到模块中(Source checksum for all modules (MODULE_SRCVERSION_ALL))。
  为了启用模块签名验证(Module signature verification (MODULE_SIG)),这个选项回答&yes&。因为这个并不必要,我选择了&no&,否则内核在加载模块前会检查并验证签名。
  为了启用块级支持(Enable the block layer (BLOCK)),像我一样选择&yes&。禁用这个将会使块设备无法使用并且无法启用某些文件系统。
  下面,SG支持已经默认启用(Block layer SG support v4 (BLK_DEV_BSG))(块级SG支持V4版),并且辅助库也启用了(Block layer SG support v4 helper lib (BLK_DEV_BSGLIB))。
  下面回答的问题是关于对块设备的数据完整性支持(Block layer data integrity support (BLK_DEV_INTEGRITY))。这个特性允许拥有更好的数据完整性来提供设备数据保护特性。许多设备不支持这个特性,所以我禁用了它。
  如果启用了块级bio带宽限制(Block layer bio throttling support (BLK_DEV_THROTTLING))那就可以限制设备的IO速率。
  为了启用外部分区方案的支持,这个问题就回答&yes&(Advanced partition selection (PARTITION_ADVANCED))。我禁用了这个特性。
  为了启用CSCAN(译注:循环扫描)和FIFO过期请求,那就启用最后期限IO调度器(Deadline I/O scheduler (IOSCHED_DEADLINE))。
  CFQ IO调度器在处理器之间平均地分配带宽。因此启用这个特性feature (CFQ I/O scheduler (IOSCHED_CFQ))是个好主意。
  下面,开发者可以启用或禁用CFQ组支持(CFQ Group Scheduling support (CFQ_GROUP_IOSCHED))。接下来,开发者可以选择默认的IO调度器,最好选择DEFAULT_DEADLINE。
  对于小于32位寻址的设备,下面的特性会分配16MB的寻址空间(DMA memory allocation support (ZONE_DMA))。如果你不使用这些设备,那么这个是可以禁用的,所以我禁用了它。
  对于有多个CPU的系统,最好启用SMP(Symmetric multi-processing support (SMP))。对于只有单个处理器的设备,内核会在禁用这个特性后执行得更快。我启用了这个特性。
  对于支持x2apic的CPU,启用x2apic支持support (Support x2apic (X86_X2APIC))。如果你的系统缺乏这个特性就像我一样禁用它。
  接下来我们可以启用对那些缺乏合适的ACPI支持的旧式SMP系统的MPS表(Enable MPS table (X86_MPPARSE))。一些拥有ACPI、DSDT、MADT支持的更新的系统不需要这个特性。我禁用了它。
  下面的问题允许我们启用扩展x86平台的支持(Support for extended (non-PC) x86 platforms (X86_EXTENDED_PLATFORM))。只有在你需要一个通用内核或者内核运行在某个特定的需要扩展支持的处理器上时才启用它。我禁用了这个特性。
  为了支持Intel低功耗子系统,就启用这个特性(Intel Low Power Subsystem Support (X86_INTEL_LPSS))。
  单一深度WCHAN输出(Single-depth WCHAN output (SCHED_OMIT_FRAME_POINTER))是用来计算电量(/proc//wchan),然而这会导致更多的功耗。
  下面,我们启用虚拟客户系统支持(Paravirtualized guest support (PARAVIRT_GUEST))。这允许一个Guest操作系统与主操作系统一起运行。我会禁用这个特性。
  Memtest是一个在系统启动时检测内存的软件。Memtest可以配置为每次或者有时开机运行。Memtest并不必要,所以我禁用了它。
  这里我们可以选择一个内核应该支持的处理器家族。我选择了5 – Generic-x86-64。这是一个64位的系统,x86是32系统。
  下面我们能选择也支持x86(32位)处理器 (Supported processor vendors (PROCESSOR_SELECT))。
  为了发现机器异常,我们可以启用DMI扫描(Enable DMI scanning (DMI)),这可以检测异常。
  要启用DMA访问系统上32位内存的3GB以上的内存,下一个问题(GART IOMMU support (GART_IOMMU))我们回答&yes&。
  在这个第四部分里,我们将继续配置更多的设置和特性。
  这里我们被问及关于&IBM Calgary IOMMU support (CALGARY_IOMMU)&。这个选项将会提供对IBM xSeries x366和x460的IOMMU的支持。这也将让那些32位PCI的设备工作正常——在这些系统上不支持双地址周期(DAC : Double Address Cycle)——因为该系统设置在访问超过3GB内存的时候会有问题。如果需要这些IOMMU设备可以用&iommu=off&在启动时关闭。(这些内核/模块参数会在以后的文章中讨论)
  IOMMU(input/output memory management unit)是一个内存管理单元(MMU),它连接具有DMA功能的I/O总线到主内存上。DMA(Direct Memory Access)是许多计算机支持的一种允许特定设备不借助CPU直接访问内存的特性。双地址周期(Double Address Cycle, DAC)是64位DMA;而通常的DMA使用32位。
  下面,我们被问及是否默认启用Calgary(Should Calgary be enabled by default? (CALGARY_IOMMU_ENABLED_BY_DEFAULT))。Calgary与上面提到的IOMMU是同一个概念。这两者之间的不同是IOMMU可以支持许多设备而Calgary只能支持IBM IOMMU设备。如果禁用了它,但是以后需要使用到它,可以使用内核参数(iommu=calgary)。
  这里有个问题需要小心处理(Enable Maximum number of SMP Processors and NUMA Nodes (MAXSMP))。只有在内核运行在拥有很多SMP处理器和NUMA节点的情况下才启用它,如Core i7和许多AMD CPU芯片。如果系统缺乏或者只有少量的SMP处理器和NUMA节点,内核就会变得低效。这个最好选择&No&。
  非一致性内存访问(Non-Uniform Memory Access (NUMA))是一个每块内存都需要花费更长时间访问其他部分内存的系统。一个节点就是一组内存。例如,一个NUMA系统可能有三块内存芯片。每块芯片是一个节点,在带CPU的主板上有一个节点/芯片(这是最快的节点),另外两个在不同的总线上。这两个节点需要比第一个节点花费更长的时间去访问。
  注意:ccNUMA和NUMA目前是一样的,至少是非常相似的。
  对称多处理器(Symmetric Multi-Processing (SMP))是NUMA的替代品。它的内存在同一根总线上。只有限定数量的CPU可以访问总线,所以这限制了SMP系统上处理器的数量。然而它内存的访问速度一样块。
  注意:我是在为AMD64系统在编译内核,所以我会告诉你我的选择,来帮助读者理解过程和选择。如果我没有指出我的选择,那么我用的就是默认选择。如果你在为不同的系统编译或者你有不同的需求,你需要在你的情况下做出替代的选择。
  接下来,除非配置工具已经为你做了选择,选择一个内核需要支持的最多CPU的数量。这个配置根据你给的数量优化内核。
  接着启用或禁用&SMT (Hyperthreading) scheduler support (SCHED_SMT)&(超线程调度器支持)。SMT调度器提升了在使用了超线程技术的Pentium 4处理器上的CPU决策能力。然而,这会带来额外的功耗,在一些系统上最好像我一样选择&no&。
  超线程一种专有的SMT并行微处理器(Intel 实现了它)。这是多任务/多线程(同时做许多任务)的一种特殊形式,并行多线程(Simultaneous multithreading (SMT))提升了多线程执行的效率。
  在这之后,启用或者禁用&Multi-core scheduler support (SCHED_MC)&。这样也是一种提升多核CPU决策的特性。然而这回带来额外功耗,我选择了&No&。
  在下一个选项中可以选择抢占模式。
  Preemption Model(抢占模式)
  1. No Forced Preemption (Server) (PREEMPT_NONE) (非强制抢占)
  & 2. Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY) (自愿内核抢占)
  3. Preemptible Kernel (Low-Latency Desktop) (PREEMPT) (可抢占内核)
  choice[1-3]: 2
  抢占就是暂停一个意图让它之后继续执行的中断任务的过程。抢占强制一个进程暂停,执行中的任务无法忽视抢占。
  接着,我们被询问关于&Reroute for broken boot IRQs (X86_REROUTE_FOR_BROKEN_BOOT_IRQS)&。这是一个对于假中断的简单修复。假中断是一种无用的硬件中断,这些通常是有电子干扰或者错误连接的电子产品触发。记住,中断是发送给处理器需要马上注意的信号。
  这个选项对任何机器都很重要;我怀疑任何人可能都会有禁用这个特性的理由(Machine Check / overheating reporting (X86_MCE))。内核必须意识到过热和数据损坏,不然,系统将会继续操作,这样只会导致进一步的破坏。
  下面,用户可以启用禁用&Intel MCE features (X86_MCE_INTEL)&,这是一种额外的对像热度监控的Intel MCE特性的支持。因为我是为AMD64处理器编译内核所以我选择了&no&。机器检测异常(MCE)是一种当处理器发现硬件问题时的错误输出。MCE通常会导致内核严重错误(kernel panic)(相当于Windows中的&蓝屏&)。
  这个除了是AMD设备外是同一个问题Intel MCE features (X86_MCE_INTEL)。
  下一个是我会禁用的调试特性(Machine check injector support (X86_MCE_INJECT))。这个会允许注射检查。如果你偶尔执行机器注射,那最好编译成模块而不是编译进内核。机器注射可以使设备即使实际没有错误也可以发送一个伪造的错误信息。这个用来确认内核和其他进程可以正常处理错误。比如,如果CPU过热,接着应该关机,但是开发者如何在不损坏CPU的情况下代码。注射错误是一种最好的方法,因为它只是一种告诉硬件发送错误信号的软件。
  注:模块是对可能被使用或者很少执行的特性/驱动而言的。只加入在许多使用该内核的系统中用到的特性/驱动到内核中。
  如果内核很可能用在Dell笔记本上,那么启用这个特性(Dell laptop support (I8K))。否则,如果一些用户可能在戴尔笔记本电脑上用到这个内核,将其作为一个模块加入。如果这个内核不打算支持Dell笔记本,那就像我一样忽略掉它。特别地,这个支持是一个允许Dell Inspiron 8000系列笔记本访问处理器的系统管理模式的驱动。系统管理模式的目的是得到处理器的温度和风扇状态,这对一些需要控制风扇的系统有用。
  下面,用户可以选择微码加载支持(CPU microcode loading support (MICROCODE))。这可以允许用户在支持这个特性的AMD或者Intel芯片上更新微码。
  注意:为了加载微码,你必须拥有一个为你的处理器设计的合法的二进制微代码拷贝。
  如果要加载微码补丁(修复bug或加入次要的特性)到intel芯片上(Intel microcode loading support (MICROCODE_INTEL)),这个就必须启用。这里我禁用了它。
  然后是AMD芯片的类似选项(AMD microcode loading support (MICROCODE_AMD))。
  启用这个支持(/dev/cpu/*/msr - Model-specific register support (X86_MSR))可以允许某个处理器有权限使用x86特殊模块寄存器(Model-Specific Registers (MSRs))。这些寄存器是一些字符设备,包括major 202下minor 0到31的设备((/dev/cpu/0/msr to /dev/cpu/31/msr))。这个特性用在多处理器系统上。每个虚拟字符设备都连接到一个特定的CPU。
  注意:MSRs被用来改变CPU设备、调试、性能监控和执行追踪。MSRs使用x86指令集。
  在这之后,我们有一个选项&CPU information support (X86_CPUID)&,启用这个特性允许处理器访问x86 CPUID指令,这需要通过字符设备在一个特定的CPU上执行。这些字符设备包括major 202下minor 0到31的设备(/dev/cpu/0/msr to /dev/cpu/31/msr),就像上面x86_MSR支持的这些。
  如果处理器支持,启用内核线性映射来使用1GB的内存页(Enable 1GB pages for kernel pagetables (DIRECT_GBPAGES))。启用这个可以帮助减轻TLB的压力。
  页是内存本身的基本单位(位是数据的基本单位)。页的大小是由硬件自身决定的。页码表是虚拟和物理内存间的映射。物理内存是设备上的内存。虚拟内存是到内存的地址。依赖于系统架构,硬件可以访问大于实际内存地址的地址。举例来说,一个64位系统拥有6GB内存,管理员在需要时可以加上更多的内存。这是因为还有很多虚拟内存地址。然而,在很多32位系统上,系统管理员可以增加一条8GB的内存,但是系统无法完全使用它,因为系统中没有足够的虚拟内存地址去访问大容量的内存。转换后援缓冲器(Translation Lookaside Buffer
(TLB))是一种提升虚拟内存转换速度的缓存系统。
  下面,我们看到了NUMA选项(Numa Memory Allocation and Scheduler Support (NUMA))。这可以允许内核在CPU本地内存分配器上分配CPU可使用的内存。这个支持同样可使内核更好感知到NUMA。很少的32位系统需要这个特性,但是一些通用的645位处理器使用这个特性。我选择了&no&。
  为了系统使用旧方式来检测AMD NUMA节点拓扑,启用这个特性(Old style AMD Opteron NUMA detection (AMD_NUMA))。下一个选项是一种更新的检测方式(ACPI NUMA detection (X86_64_ACPI_NUMA))。如果两个都启用,新的方式将会占支配作用。一些硬件在使用其中一种方式而不是另外一个时工作得更好。
  如果为了调试目的的NUMA仿真,可以启用下一个特性(NUMA emulation (NUMA_EMU))。
  注意:如果你不打算进行调试并且你需要一个快速、轻量级系统,那么禁用尽可能多的调试特性。
  下一个选项中,选择你的内核打算如何处理NUMA节点的最大数量。接下来选择内存模型,这里可能只有一个内存模型选择。内存模型指定了内存如何存储。
  Maximum NUMA Nodes (as a power of 2) (NODES_SHIFT) [6]
  Memory model
  & 1. Sparse Memory (SPARSEMEM_MANUAL)
  choice[1]: 1
  为了提升性能,这里有一个选项用通过虚拟内存映射(Sparse Memory virtual memmap (SPARSEMEM_VMEMMAP))来优化pfn_to_page和page_to_pfn操作。页帧号是每页被给定的号码。这两个操作用来从号码得到页或者从页得到号码。
  下一个选项是允许一个节点可以移除内存(Enable to assign a node which has only movable memory (MOVABLE_NODE))。内核页通常无法移除。当启用后,用户可以热插拔内存节点,同样可移除内存允许内存整理。作为出入内存的数据,只要有可用空间一组数据可能被划分到不同内存。
  接着前面的内存问题,我们还有更多的问题。这些可能已被配置工具预配置了。第三个选项(BALLOON_COMPACTION),当启用时可以帮助减少内存碎片。碎片内存会减慢系统速度。第四个选项(COMPACTION)允许内存压缩。下面列到的第五个选 (MIGRATION)允许页面被移动。
Allow for memory hot-add (MEMORY_HOTPLUG) (允许内存热添加)&
Allow for memory hot remove (MEMORY_HOTREMOVE) (允许内存热移除)&
Allow for balloon memory compaction/migration (BALLOON_COMPACTION) (允许泡状内存规整和合并)&
Allow for memory compaction (允许内存规整)&
Page migration (MIGRATION) (页合并)
  注意:启用可移动内存会启用以上5个特性。
  下一步,我们可以

我要回帖

更多关于 yy频道字母下划线代码 的文章

 

随机推荐