标签 内核 下的文章

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)
  1. SLUB (Unqueued Allocator) (SLUB)
  1. 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"。


via: http://www.linux.org/threads/the-linux-kernel-configuring-the-kernel-part-3.4369/

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

这一部分我们讲配置内核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用时统计)

  1. Simple tick based cputime accounting (TICK\_CPU\_ACCOUNTING) (简单基于滴答的用时统计)
  2. Full dynticks CPU time accounting (VIRT\_CPU\_ACCOUNTING\_GEN) (NEW) (全动态滴答的用时统计)
  3. 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监视进程并注意资源访问的延迟。比如,TASKDELAY*ACCT可以看到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回调)。(译注:此处作者没做解释。前一个能够节省电力,但是降低了性能;后一个用于调试。)

下一个问题非常重要(Kernel .config support (IKCONFIG))(内核的.config支持)。开发人员可以选择保存由这个配置工具生成的设置到一个文件中。这个文件可以放在内核中,也可在一个模块中,或者完全不保存。这个文件可以被想要编译一个完全跟某人相同内核的开发者使用。这个文件还可以帮助开发人员使用一个更新的编译器重新编译一个内核。举例来说,开发人员配置并编译了一个内核,然而编译器有一些bug,但开发人员仍然需要一个使用这些设置的内核。而值得庆幸的是,开发人员可以升级他们的编译器,并使用设置文件来节省他们重新配置内核的时间。开发人员也可以在另一台计算机上保存源代码和配置文件并编译内核。至于另一个目的,开发人员可以加载该文件,并根据需要调整设置。我选择保存配置文件在一个模块中,这个问题 "Enable access to .config through /proc/config.gz (IKCONFIG\_PROC)"(启用通过/proc/config.gz来访问.config的功能)是询问这个文件是否是可以通过这次方式访问的,我选择了"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-container group (cgroup) monitoring (CGROUP\_PERF))(启用每个CPU、每个容器组的pref\_event监控)允许开发者扩展每个CPU的模式,使它可以只监控运行在特定CPU上的一个特别的cgroup组的线程。

下一章节是"Group CPU Scheduler"(CPU分组调度器)。前两个已经回答的问题包括:

Group CPU scheduler (CGROUPSCHED)(CPU分组调度器) Group scheduling for SCHEDOTHER (FAIR*GROUP*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信息。这会减小内核的体积。


via: http://www.linux.org/threads/the-linux-kernel-configuring-the-kernel-part-2.4318/

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,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’的意思不同,作者也作出了解释:http://www.linux.org/threads/the-linux-kernel-configuring-the-kernel-part-1.4274/#post-13307)。&%2312290);

贴士:最好使用“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的修订号会被添加到版本号后面。这个例子中我们没有使用git,所以我回答"no"。不然git修订号将会追加到版本号中。还记得vmlinuz和几个类似的文件么?好了,下一个问题就是问使用哪一种格式压缩内核。开发人员可以从五个选项中选择一个。它们是

  1. Gzip (KERNEL\_GZIP)
  2. Bzip2 (KERNEL\_BZIP2)
  3. LZMA (KERNEL\_LZMA)
  4. XZ (KERNEL\_XZ)
  5. 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"配置时,无论用户按任何键都无法改变选项。开发者不需要去改变这些选项,因为之前的选择决定了另外一个问题的选择。

via: http://www.linux.org/threads/the-linux-kernel-configuring-the-kernel-part-1.4274/

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

译者按:

本文作者戴文.科利尔.约翰逊(Devyn Collier Johnson)今年才19岁,但是他在Linux内核、人工智能、编程语言方面拥有丰富的经验,本文是其在linux.org上连载的一系列关于内核的文章。文章写的深入浅出,本站不揣浅陋,由LCTT成员geekpi进行了系列翻译,以分享给广大Linux爱好者。

在1991年,一个叫林纳斯·本纳第克特·托瓦兹的芬兰学生制作了一个现在非常流行的操作系统的内核。他于1991年9月发布了Linux 0.01,并且于1992年以GPL许可证的方式授权了该内核。GNU通用许可证(GPL)允许人们使用、拥有、修改,以及合法和免费的分发源代码。这使得内核变得非常流行,因为任何人都可以免费地下载。现在任何人都可以生成他们自己的内核,这有助于人们学习如何获取、编辑、配置、编译并安装Linux内核。

内核是操作系统的核心。操作系统是一系列的管理硬件并允许用户在电脑上运行应用的程序。内核控制着硬件和应用。应用并不直接和硬件打交道,而是首先和内核交互。总之,软件运行在内核上,而内核操作着硬件。没有内核,电脑就是一个没用的物件。

用户制作他们自己的内核有各种各样的原因。许多用户也许想要一个只包含他们需要的代码的系统内核。比如说我的内核包含了火线设备驱动,但是我的电脑缺乏这些端口。当系统启动时,时间和内存就会浪费在那些我系统上并没有安装的设备上。如果我想要简化我的内核,我会制作自己不包含火线驱动的内核。至于另外一个理由,某个用户可能拥有一台有特殊硬件的设备,但是最新的Ubuntu版本中的内核缺乏所需的驱动。这个用户可以下载最新的内核(比当前Ununtu的Linux内核要新),并制作他们自己的有相应驱动的内核。不管怎样,这两个原因是用户想要制作自己的Linux内核的普遍原因。

在下载内核前,我们应该讨论一些重要的术语和事实。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.”,但根据上下文,此处语境不对,所以做了相应补充。据“食梦-”的提示,原文也有人对此提出了质疑,作者做了如下解释:http://www.linux.org/threads/%EF%BB%BFthe-linux-kernel-introduction.4203/#post-12623

Linux内核是可移植的。可移植性是Linux流行的一个最重要的原因。可移植性使得内核可以工作在各种处理器和系统上。一些内核支持的处理器的型号包括:Alpha、AMD、ARM、C6X、Intel、x86、Microblaze、MIPS、PowerPC、SPARC、UltraSPARC等,这还不是全部的列表。

在引导文件夹(/boot),用户会看到诸如“vmlinux”或者“vmlinuz”的文件。这两者都是已编译的Linux内核。以“z”结尾的是已压缩的。“vm”代表虚拟内存。在SPARC处理器的系统上,用户可以看见一个zImage文件。一小部分用户可以发现一个bzImage文件,这也是一个已压缩的Linux内核。无论用户有哪个文件,这些引导文件都是不能更改的,除非用户知道他们正在做什么。否则系统会变成无法引导,也就是说系统启动不了了。

内核源代码就是程序编码。有了源代码,程序员可以修改内核并能观察到内核是如何工作的。

下载内核:

现在我们想更多地了解了内核,就要下载内核源代码了。进入kernel.org并点击那个巨大的下载按钮。下载完成后,解压下载的文件。

对于本文,我使用的源代码是Linux kernel 3.9.4.这个文章系列的所有指导对于所有的内核版本是相同的(或者非常相似的)

via: http://www.linux.org/threads/%EF%BB%BFthe-linux-kernel-introduction.4203/

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Linux内核是所有Linux系统的核心。如果有任何恶意代码控制或破害了内核的任何一部分,那么系统会严重受损,文件可能被删除或损坏,私人信息可能被盗等等。很明显,保持内核安全涉及到用户的最大利益。值得庆幸的是,由于Linux内核极其安全,Linux是一个非常安全的系统。在用户比例上,Linux病毒比Windows病毒更少,并且Linux用户比Windows用户个人更少感染病毒。(这就是为什么许多公司使用Linux来管理他们的服务器的一个原因。) 然而,我们仍然没有借口去忽视内核的安全。Linux有几个安全特性和程序,但本文只讨论Linux安全模块(LSM)及其它的内核安全特性。

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系统将会变成一个不安全的操作系统。

via: http://www.linux.org/threads/the-linux-kernel-security.4223/

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

驱动程序是使内核能够沟通和操作硬件或协议(规则和标准)的小程序。没有驱动程序,内核不知道如何与硬件沟通或者处理协议(内核实际上先发送指令给BIOS,然后BIOS传给硬件)。 Linux的内核代码在驱动程序文件夹中以源代码的形式包含了许多驱动程序。驱动文件夹中的每个文件夹会在下面说明。在配置和 编译内核时,这样有助于你了解驱动程序。否则,用户可能会在编译时加入不必要的或者漏掉重要的驱动。驱动代码通常会包含一个单行注释来指出驱动的目的。 比如,tc的驱动代码,有一行的注释说是用于TURBOchannel总线。由于这些文档,用户应该看驱动前几行的注释来了解它们的用途。

有几个术语你应该已经知道,所以下面的信息应该是明白的。一个I/O设备指的是输入/输出设备。例如调制解调器和网卡,他们发送和接收数据。监视器是一个输出设备 - 只有信息出来。键盘、鼠标和游戏杆是数据输入系统。存储设备用于存储数据,例如SD卡、硬盘、光盘、存储卡等。CPU(处理器)是计算机的“大脑”或“心脏” ,如果没有它,电脑就无法运作。主板则是一块连接板上不同组件的印刷线路板。主板及各个组件是计算机的运行的基础。许多计算机用户说主板是电脑的心脏(主板上有CPU)。主板包含了用于连接外设的端口,外设包括输入、输出和存储设备。总线是主板的电路,它连接着外设。网络设备用于两台或多台计算机之间的连接。端口则是用户可以插入另外一台设备或一根电缆的设备,例如,用户可以将插入一根火线记忆棒插入一个火线端口;将以太网电缆插入一个以太网端口。光碟的读取是利用激光,从可以散射或反射的激光的反射面上读出数据,一个常见的 光盘是DVD。许多系统说自己是32位或者64位,这指的是寄存器、地址总线或数据总线的位数。例如,在一块64位的主板上,数据总线(组件之间的银线)有64根并排到目的的线。存储器地址以位(0和1)的形式在存储器中编址,因此,一个32位存储地址包含32个0和1来表示存储器上的某处地址。

许多驱动程序是通用驱动程序,这意味着一个通用键盘驱动可以使内核可以处理几乎所有的键盘。然而,有些驱动是专用驱动,像苹果和Commodore就分别为苹果电脑和Amiga系统制造了专门的硬件。Linux内核中已经包含了许多诸如智能手机、苹果、Amiga系统、PS3、Android平板,和许多其他设备的驱动程序。

注意有些设备的驱动不在本目录中。比如,射频驱动在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 - 这个驱动用于从驱动到用户空间进程(运行在用户态下的应用)评测整个系统。这帮助开发人员找到性能问题

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)。这些总线提供消息传递设施,促进客户端驱动程序编写自己的连接协议消息。

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保持较低温度。

tty - tty驱动用于管理物理终端连接。

uio - 该驱动允许用户编译运行在用户空间而不是内核空间的驱动。这使用户驱动不会导致内核崩溃。

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总线支持。

via: http://www.linux.org/threads/the-linux-kernel-drivers.4205/

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出