当前位置:文档之家› linux内核配置make menuconfig菜单详解

linux内核配置make menuconfig菜单详解

linux内核配置make menuconfig菜单详解
linux内核配置make menuconfig菜单详解

LINUX内核配置MAKE MENUCONFIG菜单详解

我们在linux内核裁剪过程中,进入内核所在目录,键入 make menuconfig 就会看到一堆的配置菜单,它们具体代表什么含义呢?我们该如何取舍呢?这里把近期收集到的一些信息做一个总结。

1、General setup

代码成熟度选项,它又有子项:

1.1、prompt for development and/or incomplete code/drivers

该选项是对那些还在测试阶段的代码,驱动模块等的支持。一般应该选这个选项,除非你只是想使用 LINUX 中已经完全稳定的东西。但这样有时对系统性能影响挺大。

1.2、Cross-compiler tool prefix

交叉编译工具前缀,例如:Cross-compiler tool prefix值为: (arm-linux-)

1.3、Local version - append to kernel release

内核显示的版本信息,填入 64字符以内的字符串,你在这里填上的字符口串可以用uname -a 命令看到。

1.4、 Automatically append version information to the version string

自动在版本字符串后面添加版本信息,编译时需要有perl以及git仓库支持

1.5、Kernel compression mode (Gzip) --->

有四个选项,这个选项是说内核镜像要用的压缩模式,回车一下,可以看到gzip,bzip2,lzma,lxo,一般可以按默认的gzip,如果要用bzip2,lzma,lxo要先装上支持

1.6、Support for paging of anonymous memory (swap)

使用交换分区或交换文件来做为虚拟内存,一定要选上。

1.7、System V IPC

表示系统的进程间通信Inter Process Communication,它用于处理器在程序之间同步和交换信息,如果不选这项,很多程序运行不起来,必选。

1.8、POSIX Message Queues

POSIX标准的消息队列,它同样是一种IPC。建议你最好将它选上

1.9、BSD Process Accounting

用户进程访问内核时将进程信息写入文件中。通常主要包括进程的创建时间/创建者/内存占用等信息。建议最好选上。

1.10、BSD Process Accounting version 3 file format

使用新的第三版文件格式,可以包含每个进程的PID和其父进程的PID,但是不兼容老版本的

文件格式。

1.11、Export task/process statistics through netlink (EXPERIMENTAL)

通过netlink接口向用户空间导出任务/进程的统计信息,与BSD Process Accounting的不同之处在于这些统计信息在整个任务/进程生存期都是可用的

Enable per-task delay accounting (EXPERIMENTAL)

在统计信息中包含进程等候系统资源(cpu,IO同步,内存交换等)所花费的时间

Enable extended accounting over taskstats (EXPERIMENTAL)

在统计信息中包含扩展进程所花费的时间

1.12、Auditing support

审记支持,用于和内核的某些子模块同时工作,例如Security Enhanced Linux。只有选择此项及它的子项,才能调用有关审记的系统调用。

1.13、Enable system-call auditing support

支持对系统调用的审计

1.14、IRQ subsystem --->

中断子系统

Support sparse irq numbering

<=== 支持稀有的中断编号,关闭

1.15、RCU Subsystem --->

非对称读写锁系统是一种高性能的kernel 锁机制,适用于读多写少环境

RCU Implementation (Tree-based hierarchical RCU) --->

RCU 实现机制 Tree(X) Tree-based hierarchical RCU 基本数按等级划分

Enable tracing for RCU

激活跟踪

(32) Tree-based hierarchical RCU fanout value

基本数按等级划分分列值

Disable tree-based hierarchical RCU auto-balancing

1.16、< > Kernel .config support

这个选项允许.config文件(即编译LINUX时的配置文件)保存在内核当中

1.17、(17) Kernel log buffer size (16 => 64KB, 17 => 128KB)

1.18、[ ] Control Group support --->

cgroups 支持,文档资料,cgroups 主要作用是给进程分组,并可以动态调控进程组的CPU 占用率。比如A 进程分到apple 组,给予20%CPU 占用率,E 进程分easy 组,给予50%CPU 占用率,最高100% 。我目前没有此类应用场景,用到时会选择将其编译进去。 CPU bandwidth provisioning for FAIR_GROUP_SCHED

此选项允许用户定义的CPU带宽速率(限制)在公平的组调度运行的任务。组没有限制设置被认为是无约束和运行没有限制。

Group scheduling for SCHED_RR/FIFO

此功能可以让您显式地分配真实的CPU带宽任务组。

1.19、-*- Namespaces support --->

命名空间支持,允许服务器为不同的用户信息提供不同的用户名空间服务

[*] UTS namespace

通用终端系统的命名空间。它允许容器,比如Vservers利用UTS命名空间来为不同的服务器提供不同的UTS。如果不清楚,选N。

[*] IPC namespace

IPC命名空间,不确定可以不选

[*] User namespace (EXPERIMENTAL)

User命名空间,不确定可以不选

[*] PID Namespaces

PID命名空间,不确定可以不选

[*] Network namespace

1.20、Automatic process group scheduling 自动进程组调度

1.21、[ ] enable deprecated sysfs features to support old userspace tools

1.22、-*- Kernel->user space relay support (formerly relayfs)

在某些文件系统上( 比如debugfs ) 提供从内核空间向用户空间传递大量数据的接口,我目前没有此类应用场景

1.23、 [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support 用于在真正内核装载前,做一些操作(俗称两阶段启动),比如加载module ,mount 一些非root 分区,提供灾难恢复shell 环境等,资料,我是期望直接从kernel image 直接启动,所以没选它

?1.24、Initramfs source file(s)

initrd已经被initramfs取代,如果你不明白这是什么意思,请保持空白

1.25、Optimize for size

这个选项将在GCC 命令后用“-Os ” 代替“-O2 ″参数,这样可以得到更小的内核。没必要选。选上了有时会产生错误的二进制代码。

1.26、Enable full-sized data structures for core:在内核中使用全尺寸的数据结构.禁用它将使得某些内核的数据结构减小以节约内存,但是将会降低性能。

1.27、Enable futex support:快速用户空间互斥体可以使线程串行化以避免竞态条件,也提高了响应速度.禁用它将导致内核不能正确的运行基于glibc的程序。

1.28、Enable eventpoll support:支持事件轮循的系统调用。

1.29、Use full shmem filesystem:除非你在很少的内存且不使用交换内存时,才不要选择这项。后面的这四项都是在编译时内存中的对齐方式,0 表示

编译器的默认方式。使用内存对齐能提高程序的运行速度,但是会增加程序对内存的使用量。内核也是一组程序呀。

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

[*] Disable heap randomization

禁用随机heap(heap堆是一个应用层的概念,即堆对CPU是不可见的,它的实现方式有多种,可以由OS实现,也可以由运行库实现,如果你愿意,你也可以在一个栈中来实现一个堆)

1.30、Choose SLAB allocator (SLAB) --->

选择内存分配管理器(强烈推荐使用SLUB)

1.31、[ ] Configure standard kernel features (for small systems) --->

这个选项可以让内核的基本选项和设置无效或者扭曲。这是用于特定环境中的,它允许“非标准”内核。你要是选它,你一定要明白自己在干什么。这是为了编译某些特殊用途的内核使用的,例如引导盘系统。配置标准的内核特性(为小型系统)

Enable 16-bit UID system calls:允许对UID系统调用进行过时的16-bit包装。

Sysctl syscall support 几乎使用不到这一选项,不选它可以轻微使内核变小

Include all symbols in kallsyms:在kallsyms中包含内核知道的所有符号,内核将会增大300K。

Enable support for printk:允许内核向终端打印字符信息,在需要诊断内核为什么不能运行时选择。

BUG() support:显示故障和失败条件(BUG 和WARN),禁用它将可能导致隐含的错误被忽略。

Enable ELF core dumps:内存转储支持,可以帮助调试ELF格式的程序。

1.32、[*] Profiling support

不选剖面支持,用一个工具来扫描和提供计算机的剖面图。支持系统评测(对于大多数用户来说并不是必须的)

1.33、OProfile system profiling

OProfile评测和性能监控工具

1.35、[ ] OProfile multiplexing support (EXPERIMENTAL)

1.34、Kprobes

调试内核除非开发人员,否则不选

?1.35、Optimize trace point call sites

1.36、GCOV-based kernel profiling

[ ] Enable gcov-based kernel profiling 不选

2、Enable loadable module support

2.1 Forced module loading

允许强制加载模块

2.2 Module unloading

允许卸载已经加载的模块

2.3 Forced module unloading

允许强制卸载正在使用中的模块(比较危险)这个选项允许你强行卸除模块,即使内核认为这不安全。内核将会立即移除模块,而不管是否有人在使用它(用 rmmod -f 命令)。这主要是针对开发者和冲动的用户提供的功能。如果不清楚,选N。

2.4 Module versioning support

有时候,你需要编译模块。选这项会添加一些版本信息,来给编译的模块提供独立的特性,以使不同的内核在使用同一模块时区别于它原有的模块。这有时可能会有点用。如果不清楚,选N。允许使用其他内核版本的模块(可能会出问题)

2.5 Source checksum for all modules

为所有的模块校验源码,如果你不是自己编写内核模块就不需要它这个功能是为了防止你在编译模块时不小心更改了内核模块的源代码但忘记更改版本号而造成版本冲突。如果不清楚,选N。

3、Enable the block layer

块设备支持,使用硬盘/USB/SCSI设备者必选这选项使得块设备可以从内核移除。如果不选,那么 blockdev 文件将不可用,一些文件系统比如 ext3 将不可用。这个选项会禁止SCSI 字符设备和 USB 储存设备,如果它们使用不同的块设备。选Y,除非你知道你不需要挂载硬盘和其他类似的设备。不过此项无可选项

3.1 Support for large (2TB+) block devices and files

仅在使用大于2TB的块设备时需要

3.2 Block layer SG support v4

通用scsi块设备第4版支持

3.3 Block layer data integrity support

块设备数据完整性支持

?3.4 Block layer bio throttling support

可用于限制设备的IO速度

3.5 Partition Types

Advanced partition selection

如果你想要在linux上使用一个在其他的介质上运行着操作系统的硬盘时,选择Y,如果你不确定时可以选N

3.6 IO Schedulers

IO调度器I/O是输入输出带宽控制,主要针对硬盘,是核心的必须的东西。这里提供了三个IO调度器。

Deadline I/O scheduler

使用轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库)Deadline I/O调度器简单而又紧密,在性能上和抢先式调度器不相上下,在一些数据调入时工作得更好。至于在单进程I/O磁盘调度上,它的工作方式几乎和抢先式调度器相同,因此也是一个好的选择。

CFQ I/O scheduler

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

Default I/O scheduler (CFQ)

默认IO调度器我这样理解上面三个IO调度器:

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

( *) Deadline

( ) CFQ

( ) No-op

4、Processor type and features (处理器类型及特点)

?4.1 DMA memory allocation support

该选项允许小于32位地址的设备使用前16MB的地址空间,如果不缺定的话,选Y

4.2 Symmetric multi-processing support

对称多处理器支持,如果你有多个CPU或者使用的是多核CPU就选上.此时"Enhanced Real Time Clock Support"选项必须开启,"Advanced Power Management"选项必须关闭如果你选N,内核将会在单个或者多个CPU的机器上运行,但是只会使用一个CPU。如果你选Y,内核可以在很多(但不是所有)单CPU的机器上运行,在这样的机器,你选N会使内核运行得更快。注意如果你选Y,然后在Processor family选项中选择“586〃or “Pentium” ,内核将不能运行在486构架的机器上。同样的,多CPU的运行于PPro构架上的内核也无法在 Pentium 系列的板上运行。

4.3 Enable MPS table

MPS多处理器规范,不选

4.4 Support for big SMP systems with more than 8 CPUs

默认情况下为不选

4.5 Support for extended (non-PC) x86 platforms

如果选的话,你将可以选择支持如下32位X86的平台。

AMD Elan,NUMAQ (IBM/Sequent),RDC R-321x SoC,SGI 320/540 (Visual Workstation),STA2X11-based (e.g. Northville),Summit/EXA (IBM x440),Unisys ES7000 IA32 series Moorestown MID devices如果你有这样的系统,或者你想要构建一个这样的通用的分布式,选择Y,否则选择N

?4.6 intel MID platform support

Medfield MID platform

4.7 RDC R-321x SoC

嵌入式相关,不选

4.8 Support non-standard 32-bit SMP architectures

非标准的32位SMP结构支持,不选

4.9 Eurobraille/Iris poweroff module

来自urobraille的iris机器不支持APM和ACPI来适时关闭自己,此模块在内核中起到这一作用。这是用于urobraille的iris机子,不确定的话,不选。

4.10 Single-depth WCHAN output

跟 proc 相关的最好不要关,选Y

?4.11 paravirt-ops debugging

4.12 Memtest

这一选项使内核增加一个“memtest”(内核测试)的参数,这将允许设置memtest。如果你不知道如何回答这个问题,选择N

4.13 Processor family (Pentium-Pro)处理器系列,请按照你实际使用的CPU选择这里是处理器的类型。这里的信息主要目的是用来优化。为了让内核能够在所有X86构架的CPU上运行(虽然不是最佳速度),在这你可以选386。内核不会运行在比你选的构架还要老的机器上。比如,你选了Pentium构架来优化内核,它将不能在486构架上运行。如果你不清楚,选386。( ) 386 ( ) 486( ) 586/K5/5x86/6x86/6x86MX ( ) Pentium-Classic( ) Pentium-MMX(系统默认选项) Pentium-Pro ( ) Pentium-II/Celeron(pre-Coppermine)( ) Pentium-III/Celeron(Coppermine)/Pentium-III Xeon ( ) Pentium M( ) Pentium-4/Celeron(P4-based)/Pentium-4 M/older Xeon ( ) K6/K6-II/K6-III( ) Athlon/Duron/K7( ) Opteron/Athlon64/Hammer/K8( ) Crusoe( ) Efficeon( ) Winchip-C6( ) Winchip-2/Winchip-2A/Winchip-3( ) GeodeGX1( ) Geode GX/LX( ) CyrixIII/VIA-C3( ) VIA C3-2 (Nehemiah)( ) VIA C7 ( ) Core 2/newer Xeon( ) Intel Atom

?4.14 Generic x86 support 这一选项针对x86系列的CPU使用更多的常规优化。如果你在上面一项选的是i386、i586之类的才选这个通用x86支持,如果你的CPU能够在上述"Processor family"中找到就别选除了对上面你选择的X86 CPU进行优化,它还对更多类型X86 CPU的进行优化。这将会使内核在其他的X86 CPU上运行得更好。这个选项提供了对X86系列CPU最大的兼容性,用来支持一些少见的x86构架的CPU。如果你的CPU能够在上面的列表中找到,就里就不用选了。

4.15 PentiumPro memory ordering errata workaround

旧的PentiumPro多处理器系统有勘误能力,可能会导致在少数的情况下,违反x86的排序标准内存操作。启用此选项将尝试解决一些(但不是全部)此类问题,但将以spinlock 和内存为代价。

4.16 HPET Timer Support(HPET时钟支持)

允许内核使用HPET。HPET是替代8254芯片的新一代定时器,i686及以上级别的主板都支持,可以安全的选上。但是,HEPT只会在支持它的平台和BIOS上运行。如果不支持,8254将会激活。选N,将继续使用8254时钟。

4.17 Enable DMI scanning

选择Y除非你已经证明当进入DMI时不影响你的配置。PNP BIOS代码需要这一项的支持。

4.18 (8) Maximum number of CPUs

支持的最大CPU数,每增加一个内核将增加8K体积

4.19 SMT (Hyperthreading) scheduler support

支持Intel的超线程(HT)技术超线程调度器在某些情况下将会对 Intel Pentium 4 HT系列有较好的支持。如果你不清楚,选N

4.20 Multi-core scheduler support

针对多核CPU进行调度策略优化多核调度机制支持,双核的CPU要选。多核心调度在某些情况下将会对多核的CPU系列有较好的支持。如果你不清楚,选N

4.21 Fine granularity task level IRQ time accounting

如果不确定的话,选N,默认为不选。

4.22 Preemption Model (Voluntary Kernel Preemption (Desktop)) 内核抢占模式一些优先级很高的程序可以先让一些低优先级的程序执行,即使这些程序是在核心态下执行。从而减少内核潜伏期,提高系统的响应。当然在一些特殊的点的内核是不可抢先的,比如内核中的调度程序自身在执行时就是不可被抢先的。这个特性可以提高桌面系统、实时系统的性能。

No Forced Preemption (Server)

适合服务器环境的禁止内核抢占这是传统的LINUX抢先式模型,针对于高吞吐量设计。它同样在很多时候会提供很好的响应,但是也可能会有较长的延迟。如果你是建立服务器或者用于科学运算,选这项,或者你想要最大化内核的原始运算能力,而不理会调度上的延迟。

(默认选项) Voluntary Kernel Preemption (Desktop)

适合普通桌面环境的自愿内核抢占这个选项通过向内核添加更多的“清晰抢先点”来减少内核延迟。这些新的抢先点以降低吞吐量的代价,来降低内核的最大延迟,提供更快的应用程序响应。这通过允许低优先级的进程自动抢先来响应事件,即使进程在内核中进行系统调用。这使得应用程序运行得更“流畅”,即使系统已经是高负荷运转。如果你是为桌面系统编译内核,选这项。

Preemptible Kernel (Low-Latency Desktop)

适合运行实时程序的主动内核抢占这个选项通过使所有内核代码(非致命部分)编译为“可抢先”来降低内核延迟。这通过允许低优先级进程进行强制抢先来响应事件,即使这些进程正在进行系统调用或者未达到正常的“抢先点”。这使得应用程序运行得更加“流畅”即使系统已经是高负荷运转。代价是吞吐量降低,内核运行开销增大。选这项如果你是为桌面或者嵌入式系统编译内核,需要非常低的延迟。如果你要最快的响应,选第三项。我认为万物是平衡的,低延迟意味着系统运行不稳定,因为过多来响应用户的要求,所以我选第二个。

4.23 Reroute for broken boot IRQs

防止同时收到多个boot IRQ ( 中断 ) 时,系统混乱

?4.24 Machine Check / overheating reporting

让CPU 检测到系统故障时通知内核, 以便内核采取相应的措施( 如过热关机等)

Intel MCE features

AMD MCE features

Support for old Pentium 5 / WinChip machine checks

4.25 Machine check injector support

让CPU检测到系统故障时通知内核,以便内核采取相应的措施(如过热关机等)(不明白此项与上一项的区别,原来的配置中是做为模块加入内核的)

?4.26 Enable VM86 support

这一选项用于支持在像DOSEMU一样的程序在x86的处理器上运行16位的legacy代码。也可能像XFree86这样的软件通过BIOS初始化声卡的时候会用到。

4.27 Toshiba Laptop support

东芝笔记本模块支持,不选

4.28 Dell laptop support

Dell笔记本模块支持,不选

4.29 Enable X86 board specific fixups for reboot

修正某些旧x86主板的重起bug,这种主板基本绝种了,我认为可以不选择这一项

4.30 dev/cpu/microcode - microcode support

是否支持Intel IA32架构的CPU。这个选项将让你可以更新Intel IA32系列处理器的微代码,显然你需要到网上去下载最新的代码,LINUX不提供这些代码。当然你还必须在文件系统选项中选择/dev file system support才能正常的使用它。如果你把它译为模块 ,它将是 microcode。 IA32主要用于高于4GB的内存。详见下面的“高内存选项”。使用不随Linux内核发行的IA32微代码,你必需有IA32微代码二进制文件,仅对Intel的CPU 有效。

Intel microcode patch loading support

AMD microcode patch loading support

4.31 /dev/cpu/*/msr - Model-specific register support

是否打开CPU特殊功能寄存器的功能。这个选项桌面用户一般用不到,它主要用在Intel 的嵌入式CPU中的,这个寄存器的作用也依赖与不同的CPU类型而有所不同,一般可以用来改变一些CPU原有物理结构的用途,但不同的CPU用途差别也很大。在多cpu系统中让特权CPU访问x86的MSR寄存器。

4.32 /dev/cpu/*/cpuid - CPU information support

是否打开记录CPU相关信息功能。这会在/dev/cpu中建立一系列的设备文件,用以让过程去访问指定的CPU。能从/dev/cpu/x/cpuid获得CPU的唯一标识符(CPUID)。

4.33 High Memory Support (4GB)

LINUX能够在X86系统中使用64GB的物理内存。但是,32位地址的X86处理器只能支持到4GB大小的内存。这意味着,如果你有大于4GB的物理内存,并非都能被内核“永久映射”。这些非永久映射内存就称为“高阶内存”。如果你编译的内核永远都不会运行在高于1G内存的机器上,选OFF(默认选项,适合大多数人)。这将会产生一个“3GB/1GB”的内存空间划分,3GB 虚拟内存被内核映射以便每个处理器能够“看到”3GB的虚拟内存空间,这样仍然能够保持4GB的虚拟内存空间被内核使用,更多的物理内存能够被永久映射。如果你有1GB-4GB之间的物理内存,选4GB选项。如果超过4GB,那么选择64GB。这将打开 Intel 的物理地址延伸模式(PAE)。PAE将在IA32处理器上执行3个层次的内存页面。PAE是被LINUX完全支持的,现在的Intel处理器 (Pentium Pro 和更高级的)都能运行PAE模式。注意:如果你选64GB,那么在不支持PAE的CPU上内核将无法启动。你

机器上的内存能够被自动探测到,或者你可以用类似于“mem=256M”的参数强制给内核指定内存大小。 4GB 选这项如果你用的是32位的处理器,内存在1-4GB之间。 64GB 选这项如果你用的是32位的处理器,内存大于4GB。

( ) off (X) 4GB ( ) 64GB

4.34 Memory model (Flat Memory)

一般选"Flat Memory",其他选项涉及内存热插拔(X) Flat Memory (平坦内存模式)这个选项允许你改变内核在内部管理内存的一些方式。大多数用户在这只会有一个选项:Flat Memory。这是普遍的和正确的选项。一些用户的机器有更高级的特性,比如 NUMA 和内存热拔插,那将会有不同的选项。Discontiguous Memory(非接触式内存模式)是一个更成熟、更好的测试系统。但是对于内存热拔插系统不太合适,会被“Sparse Memory”代替。如果你不清楚“Sparse Memory”和“Discontiguous Memory”的区别,选后者。如果不清楚,就选Flat Memory。

Sparse Memory(稀疏内存模式)

这对某些系统是唯一选项,包括内存热拔插系统。这正常。对于其他系统,这将会被Discontiguous Memory选项代替。这个选项提供潜在的更好的特性,可以降低代码复杂度,但是它是新的模式,需要更多的测试。如果不清楚,选择“Discontiguous Memory” 或“Flat Memory”。

4.35 Allow for memory compaction

4.36 Page migration (选择Y)

Enable KSM for page merging

(4096) Low address space to protect from user allocation

4.37 Enable recovery from hardware memory errors

选择Y

4.38 Transparent Hugepage Support

Transparent Hugepage Support sysfs defaults

1.always

2.madvise(默认选项)

4.39 Cross Memory Support

4.40 Enable cleancache driver to cache clean pages if tmem is present

4.41 Enable frontswap to cache swap pages if tmem is present(这三部分不太了解)

4.42 Allocate 3rd-level pagetables from highmem

在内存很多 ( 大于 4G) 的机器上将用户空间的页表放到高位内存区 , 以节约宝贵的低端内存。

4.43 Check for low memory corruption

低位内存脏数据检查,默认是每60 秒检查一次。一般这种脏数据是因某些Bios 处理不当引起的。

4.44 (64) Amount of low memory, in kilobytes, to reserve for the BIOS

4.45 Math emulation

数学协处理器仿真,486DX以上的cpu就不要选它了

4.46 MTRR (Memory Type Range Register) support(内存类型区域寄存器)

在 Intel P6 系列处理器(Pentium Pro, Pentium II 和更新的)上,MTRR将会用来规定和控制处理器访问某段内存区域的策略。如果你在PCI或者AGP总线上有VGA卡,这将非常有用。可以提升图像的传送速度2.5倍以上。选Y,会生成文件/proc/mtrr,它可以用来操纵你的处理器的MTRR。典型地,X server 会用到。这段代码有着通用的接口,其他CPU 的寄存器同样能够使用该功能。Cyrix 6×86, 6×86MX和 M II处理器有ARR ,它和 MTRR 有着类似的功能。AMD K6-2/ K6-3有两个MTRR, Centaur C6有8个MCR允许复合写入。所有这些处理器都支持这段代码,你可以选Y如果你有以上处理器。选Y同样可以修正SMP BIOS的问题,它仅为第一个CPU提供MTRR,而不为其他的提供。这会导致各种各样的问题,所以选Y是明智的。你可以安全地选Y,即使你的机器没有MTRR。这会给内核增加9KB。打开它可以提升PCI/AGP总线上的显卡2倍以上的速度,并且可以修正某些BIOS错误。

4.47 MTRR cleanup support

MTRR清理(2.6.27内核新增功能,不确定可以不选)

MTRR cleanup enable value (0-1)

MTRR cleanup spare reg num (0-7)

x86 PAT support

x86 architectural random number generator

4.48 EFI runtime service support(EFI启动支持)

这里允许内核在EFI平台上使用储存于EFI固件中的系统设置启动。这也允许内核在运行时使用EFI的相关服务。这个选项只在有EFI固件的系统上有用,它会使内核增加8KB。另外,你必须使用最新的ELILO 登录器才能使内核采用EFI的固件设置来启动(GRUB和LILO 完全不知道EFI是什么东西)。即使你没有EFI,却选了这个选项,内核同样可以启动。大家应该用的是GRUB,所以选上这个也没什么用。除非你的系统支持EFI(一种可代替传统BIOS的技术)否则不选。

4.49 Enable seccomp to safely compute untrusted bytecode

只有嵌入式系统可以不选

4.50 Enable -fstack-protector buffer overflow detection (EXPERIMENTAL)

4.51 Timer frequency (1000 HZ)

内核时钟频率桌面1000服务器100或250,允许设置时钟频率。这是用户定义的时钟中断频率 100HZ-1000 HZ ,不过 100 HZ 对服务器和NUMA系统更合适,它们不需要很快速的响应用户的要求,因为时钟中断会导致总线争用和缓冲打回。注意在SMP环境中,时钟中断由变量 NR_CPUS * Hz定义在每个CPU产生。其实和前面的抢先式进程差不多,就是多少频率来响应用户要求。我选了250HZ的。要快点的可以选1000HZ的。但是还是那句话,一切是平衡的。机器过快响应你,它自己的活就不知道做得好不好了。( ) 100 HZ100 HZ

是传统的对服务器、SMP 和 NUMA的系统选项。这些系统有比较多的处理器,可以在中断较集中的时候分担中断( ) 250 HZ250 HZ对服务器是一个好的折衷的选项,它同样在SMP 和NUMA 系统上体现出良好的反应速度。( ) 300 HZ(X) 1000 HZ1000 HZ对于桌面和其他需要快速事件反应的系统是非常棒的。

4.52 kexec system call(kexec 系统调用)

kexec是一个用来关闭你当前内核,然后开启另一个内核的系统调用。它和重启很像,但是它不访问系统固件。由于和重启很像,你可以启动任何内核,不仅仅是LINUX。 kexec 这个名字是从 exec 系统调用来的。它只是一个进程,可以确定硬件是否正确关闭,Linus 本人都没话说,估计是受害不浅。我们当然不能上当,选N!提供kexec系统调用,可以不必重启而切换到另一个内核,如果需要就选择,对大多数用户来说并不需要.

4.53 kernel crash dumps

内核崩溃时,dump 运行时信息。就算 crash 了,我也不会去调试内核的core dump

4.54 (0x1000000) Physical address where the kernel is loaded

4.55 Build a relocatable kernel

官方说明(建立一个移动的内核,并增加10% 的内核尺寸,运行时会被丢弃),我认为没实质性的作用

4.56 (0x100000) Alignment value to which kernel should be aligned

4.57 Support for hot-pluggable CPUs

对SMP休眠和热插拔CPU提供支持

4.58 Compat VDSO support

如果Glibc版本大于等于2.3.3就不选,否则就选上,目前的版本基本上都大于2.3.3如果你运行的是最新的glibc(GNU C函数库)版本( 2.3.3 或更新),选N,这样可以移除高阶的VDSO 映射,使用随机的 VDSO。

4.59 Built-in kernel command line (不选)

5、 Power management and ACPI options

5.1、Power Management support

5.2、Power Management Debug Support

不想调试ACPI

这个你现在可以勾掉,不勾也没事,稍侯会在kernel-hacking这一节勾掉调试,这里也就没

5.3、Suspend to RAM and standby

待机

5.4、Hibernation (aka 'suspend to disk')

休眠

5.5、Run-time PM core functionality

5.6、ACPI (Advanced Configuration and Power Interface) Support --->

见附1

5.7、SFI (Simple Firmware Interface) Support --->

5.8、APM (Advanced Power Management) BIOS support --->

选acpi就不用apm,一般你也只用acpi&

5.9、CPU Frequency scaling --->

[*] CPU Frequency scaling

[ ] Enable CPUfreq debugging <=== 我不需要调试 CPUfreq

< > CPU frequency translation statistics

Default CPUFreq governor (performance) ---> <=== 默认用 performance 高性能的CPU 调频方式

-*- 'performance' governor

< > 'powersave ' governor

<> 'userspace ' governor for userspace frequency scaling

<> 'ondemand ' cpufreq policy governor <=== " 周期性的考察CPU 负载并自动的动态调整cpu 频率" ,我只用 performance

<> 'conservative' cpufreq governor

*** CPUFreq processor drivers ***

< > Processor Clocking P-stat driver

<*> ACPI Processor P-States driver

< > AMD Mobile K6-2/K6-3 PowerNow !

< > AMD Mobile Athlon/Duron PowerNow !

< > AMD Opteron/Athlon64 PowerNow !

< > Cyrix MediaGX /NatSemi Geode Suspend Modulation

< > Intel Enhanced SpeedStep (deprecated)

< > Intel Speedstep on ICH-M chipsets (ioport interface)

< > Intel Pentium 4 clock modulation

< > Transmeta LongRun

< > VIA Cyrix III Longhaul

5.10、CPU idle PM support

5.11、Cpuidle Driver for Intel Processors

6、Bus options(PCI etc.)

6.1、PCI support(这个必须选)

6.2、PCI access mode (Any)

( ) BIOS

( ) MMConfig

( ) Direct

(X) Any

6.3、Read CNB20LE Host Bridge Windows

没有公共规范的芯片组,此功能已知是不完整的。如果你不知道需不需要它,请选择N

6.4、PCI Express support

如果你的主板支持PCI Express,请选择Y

6.5、PCI Express Hotplug driver 选Y

6.6、Root Port Advanced Error Reporting support

硬件驱动会负责发送错误信息

6.7、PCI Express ECRC settings control

如果怀疑,请选择N

6.8、PCIe AER error injector support 同上,选 N

6.9、PCI Express ASPM control

这使得OS控制的PCI Express ASPM(活动状态电源管理)和时钟电源管理。 ASPM支持状态L0/L0s/L1,选Y

6.10、Debug PCI Express ASPM 选N

Default ASPM policy

(X)BIOS default

( )powersave

( )performance

6.11、Message Signaled Interrupts (MSI and MSI-X)

这使得设备驱动能够使用MIS(消息信号中断)选Y

6.12、PCI Debugging

我认为这里没有必要选

?6.13、Enable PCI resource re-allocation detection

当PCI资源重新分配时,如果你需要PCI核心来检测的话,选择Y,同时你可以用pci=realloc=on和pci=realloc=off来覆盖它,如果你不确定的话,选择N

6.14、PCI Stub driver

选择Y或者M,如果你想要:当一个设备去注册其他的客户操作系统时需要保留该PCI设备

6.15、 Interrupts on hypertransport devices

这将允许高速传输设备使用中断,如果不明确的话,选择Y

?6.16、 PCI IOV support

I / O虚拟化是由一些设备支持的PCI功能,这使得他们能够创建虚拟设备共享其物理资源。如果不确定的话,选择N

?6.17、PCI PRI support

RIP就是PCI页面请求接口,如果不确定的话,选择N

6.18、PCI PASID support 不确定的话选择N

6.19、PCI IO-APIC hotplug support 选Y

6.20、ISA support(以及之后的EISA)

查看你的主板上是否有ISA插槽。ISA是总线系统的名称,它是一个老的系统,现已被PCI 取代。新的主板已经不支持它,如果你还有,选择Y,否则,选择N

6.21、NatSemi SCx200 support 选择编译为模块

6.22、One Laptop Per Child support 不选

6.23、PCEngines ALIX System Support (LED setup)

6.24、Soekris Engineering net5501 System Support(LEDS, GPIO, etc)

6.25、Traverse Technologies GEOS System Support (LEDS, GPIO, etc)

?6.26、RapidIO support

RapidIO主要应用于嵌入式系统内部互连。如果你选择Y,内核中将包含支持RapidIO 设备连接的驱动和设施

?6.27、PCCard (PCMCIA/CardBus) support

一般笔记本电脑会配备PCCard 接口( 无线网卡之类的) ,看你的硬件和使用场景吧。虽然我也是NB ,但我从来不用PCMCIA

16-bit PCMCIA support

Load CIS updates from userspace (EXPERIMENTAL)

32-bit CardBus support

*** PC-card bridges ***

CardBus yenta-compatible bridge support

Cirrus PD6729 compatible bridge support

i82092 compatible bridge support

6.28、 Support for PCI Hotplug

支持热拔插PCI 设备

Fake PCI Hotplug driver

Compaq PCI Hotplug driver

Save configuration into NVRAM on Compaq servers

IBM PCI Hotplug driver

ACPI PCI Hotplug driver

ACPI PCI Hotplug driver IBM extensions

CompactPCI Hotplug driver

SHPC PCI Hotplug driver

7、Executable file formats / Emulations

7.1、Kernel support for ELF binaries 选择Y

7.2、Write ELF core dumps with partial segments 不选

7.3、Kernel support for a.out and ECOFF binaries 编译成模块

7.4、Kernel support for MISC binaries 编译成模块

8、Networking support

8.1、Networking options

Packet socket

Unix domain sockets

Transformation user configuration interface

[ ] Transformation sub policy support (EXPERIMENTAL)

[ ] Transformation migrate database (EXPERIMENTAL)

[ ] Transformation statistics (EXPERIMENTAL)

PF_KEY sockets

[ ] PF_KEY MIGRATE (EXPERIMENTAL)

[Y] TCP/IP networking

[Y] IP: multicasting

[Y] IP: advanced router

Choose IP: FIB lookup algorithm (choose FIB_HASH if unsure) (FIB_HASH)│ [Y] IP: policy routing

[Y] IP: equal cost multipath

[Y] IP: verbose route monitoring

[ ] IP: kernel level autoconfiguration

IP: tunneling

< M> IP: GRE demultiplexer

[Y] IP: multicast routing

[ ] IP: multicast policy routing

[Y] IP: PIM-SM version 1 support

[Y] IP: PIM-SM version 2 support

[ ] IP: ARP daemon support

[ Y] IP: TCP syncookie support

抵抗SYN flood 攻击,我是开发机,暂不考虑安全特性

IP: AH transformation

IP: ESP transformation

IP: IPComp transformation

IP: IPsec transport mode

IP: IPsec tunnel mode

<*> IP: IPsec BEET mode

{*} Large Receive Offload (ipv4/tcp)

INET: socket monitoring interface

[*] TCP: advanced congestion control --->

高级拥塞控制, 如果没有特殊需求( 比如无线网络) 就别选了

[ ] TCP: MD5 Signature Option support (RFC2385) (EXPERIMENTAL)

< > The IPv6 protocol --->

我暂时没有要支持IPV6 的需求

[ ] NetLabel subsystem support

NetLabel 子系统, 为诸如CIPSO 与RIPSO 之类能够在分组信息上添加标签的协议提供支持,我用不到

-*- Security Marking

对网络包进行安全标记, 类似于nfmark , 但主要是为安全目的而设计 , 安全特性,我暂时不考虑

[ ] Timestamping in PHY devices

[ ] Network packet filtering framework (Netfilter) --->

我不打算使用防火墙,要用到时再编译进去

The DCCP Protocol (EXPERIMENTAL) --->

-M- The SCTP Protocol (EXPERIMENTAL) --->

The RDS Protocol (EXPERIMENTAL)

< > RDS over Infiniband and iWARP

< > RDS over TCP

[ ] RDS debugging messages

The TIPC Protocol (EXPERIMENTAL) --->

Asynchronous Transfer Mode (ATM)

Classical IP over ATM

[ ] Do NOT send ICMP if no neighbour

LAN Emulation (LANE) support

< > Multi-Protocol Over ATM (MPOA) support

RFC1483/2684 Bridged protocols

[ ] Per-VC IP filter kludge

< > Layer Two Tunneling Protocol (L2TP) --->

802.1d Ethernet Bridging

[*] IGMP/MLD snooping

[ ] Distributed Switch Architecture support --->

802.1Q VLAN Support

[ ] GVRP (GARP VLAN Registration Protocol) support

< > DECnet Support

< > ANSI/IEEE 802.2 LLC type 2 Support

< > The IPX protocol

< > Appletalk protocol support

< > CCITT X.25 Packet Layer (EXPERIMENTAL)

< > LAPB Data Link Driver (EXPERIMENTAL)

< > Acorn Econet/AUN protocols (EXPERIMENTAL)

< > WAN router

< > Phonet protocols family

< > IEEE Std 802.15.4 Low-Rate Wireless Personal Area Networks support (EXPERI │

[ ] QoS and/or fair queueing --->

通过IPRoute 切换网络设备上的Qos 策略,我不打算使用IP 路由

[ ] Data Center Bridging support

-*- DNS Resolver support

< > B.A.T.M.A.N. Advanced Meshing Protocol

Network testing --->

8.2、[ ] Amateur Radio support --->

我没有无线电

8.3、< > CAN bus subsystem support --->

8.4、< > IrDA (infrared) subsystem support --->

8.5、 Bluetooth subsystem support --->

8.6、< > RxRPC session sockets

8.7、- - Wireless --->

我没有使用无线网卡

8.8、< > WiMAX Wireless Broadband support --->

8.9、< > RF switch subsystem support --->

我没有RF 切换设备

8.10、< > Plan 9 Resource Sharing Support (9P2000) (Experimental) --->

8.11、< > CAIF support --->

8.12、< > Ceph core library (EXPERIMENTAL)

9、Device Drivers --->

9.1、Generic Driver Options --->

9.1.1、() path to uevent helper

9.1.2、[ ] Maintain a devtmpfs filesystem to mount at /dev

9.1.3、[*] Select only drivers that don't need compile-time external firmware 9.1.4、[*] Prevent firmware from being built

9.1.5、-*- Userspace firmware loading support

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

9.1.7、() External firmware blobs to build into the kernel binary

9.1.8、[ ] Driver Core verbose debug messages

9.1.9、[ ] Managed device resources verbose debug messages

管理设备资源的冗长调试信息,我不需要

9.2、<*> Connector - unified userspace <-> kernelspace linker --->

内核空间与用户空间的信道

9.2.1、[*] Report process events to userspace

报告处理时间给用户空间

9.3、< > Memory Technology Device (MTD) support --->

9.4、< > Parallel port support --->

9.5、-*- Plug and Play support --->

[ ] PNP debugging messages

调试信息,老规矩

9.6、[ ] Block devices --->

我没有想要支持的块设备,比如ramdisk , 磁盘阵列,CD/DVD 刻录等,详见内部选项

9.7、[ ] Misc devices --->

没有需要支持的杂项设备

9.8、< > ATA/ATAPI/MFM/RLL support (DEPRECATED) --->

9.9、SCSI device support --->

< > RAID Transport Class

-*- SCSI device support

[] legacy /proc /scsi / support <=== 我没有SCSI 设备

*** SCSI support type (disk, tape, CD-ROM) ***

<*> SCSI disk support // 就算你用SATA ,此选项也必选

< > SCSI tape support

< > SCSI OnStream SC-x0 tape support

<> SCSI CDROM support <=== 我没有SCSI 设备

<> SCSI generic support <=== 我没有SCSI 设备

< > SCSI media changer support

[ ] Probe all LUNs on each SCSI device

[] Verbose SCSI error reporting (kernel size +=12K) <=== 我没有SCSI 设备

[ ] SCSI logging facility

[ ] Asynchronous SCSI scanning

Linux内核修改与编译图文教程

Linux 内核修改与编译图文教程 1

1、实验目的 针对Ubuntu10.04中,通过下载新的内核版本,并且修改新版本内核中的系统调用看,然后,在其系统中编译,加载新内核。 2、任务概述 2.1 下载新内核 https://www.doczj.com/doc/df14035010.html,/ 2.2 修改新内核系统调用 添加新的系统调用函数,用来判断输入数据的奇偶性。 2.3 进行新内核编译 通过修改新版内核后,进行加载编译。最后通过编写测试程序进行测试 3、实验步骤 3.1 准备工作 查看系统先前内核版本: (终端下)使用命令:uname -r 2

3.2 下载最新内核 我这里使用的内核版本是 3.3 解压新版内核 将新版内核复制到“/usr/src”目录下 在终端下用命令:cd /usr/src进入到该文件目录 解压内核:linux-2.6.36.tar.bz2,在终端进入cd /usr/src目录输入一下命令: bzip2 -d linux-2.6.36.tar.bz2 tar -xvf linux-2.6.36.tar 文件将解压到/usr/src/linux目录中 3

使用命令: ln -s linux-2.6.36 linux 在终端下输入一下命令: sudo apt-get install build-essential kernel-package libncurses5-dev fakeroot sudo aptitude install libqt3-headers libqt3-mt-dev libqt3-compat-headers libqt3-mt 4

linux 内核参数修改

linux 内核参数修改 配置 Linux 内核参数(2种方法),修改后不用重启动更新: /sbin/sysctl -p 第一种:打开/etc/sysctl.conf 复制如下内容 kernel.shmall = 2097152 kernel.shmmax = 2147483648 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 fs.file-max = 65536 net.ipv4.ip_local_port_range = 1024 65000 net.core.rmem_default=262144 net.core.wmem_default=262144 net.core.rmem_max=262144 net.core.wmem_max=262144 第二种:打开终端 cat >> /etc/sysctl.conf< kernel.shmall = 2097152 kernel.shmmax = 2147483648 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 fs.file-max = 65536 net.ipv4.ip_local_port_range = 1024 65000 net.core.rmem_default=262144 net.core.wmem_default=262144 net.core.rmem_max=262144 net.core.wmem_max=262144 EOF 这里,对每个参数值做个简要的解释和说明。 (1)shmmax:该参数定义了共享内存段的最大尺寸(以字节为单位)。缺省为32M,对于oracle来说,该缺省值太低了,通常将其设置为2G。(2)shmmni:这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096 。通常不需要更改。 (3)shmall:该参数表示系统一次可以使用的共享内存总量(以页为单位)。缺省值就是2097152,通常不需要修改。(共享内存段的数量,以页为主,每个页是4K) (4)sem:该参数表示设置的信号量。一般大于maxproc的一点就行了。 (5)file-max:该参数表示文件句柄的最大数量。文件句柄设置表示在linux系统中可以打开的文件数量。 修改好内核以后,执行下面的命令使新的配置生效。 [root @linux1 /root]# /sbin/sysctl -p 以 root 用户身份运行以下命令来验证您的设置: /sbin/sysctl -a | grep shm /sbin/sysctl -a | grep sem /sbin/sysctl -a | grep file-max /sbin/sysctl -a | grep ip_local_port_range 例如: # /sbin/sysctl -a | grep shm kernel.shmmni = 4096 kernel.shmall = 2097152 kernel.shmmax = 2147483648

探究linux内核,超详细解析子系统

探究linux内核,超详细解析子系统 Perface 前面已经写过一篇《嵌入式linux内核的五个子系统》,概括性比较强,也比较简略,现在对其进行补充说明。 仅留此笔记,待日后查看及补充!Linux内核的子系统 内核是操作系统的核心。Linux内核提供很多基本功能,如虚拟内存、多任务、共享库、需求加载、共享写时拷贝(Copy-On-Write)以及网络功能等。增加各种不同功能导致内核代码不断增加。 Linux内核把不同功能分成不同的子系统的方法,通过一种整体的结构把各种功能集合在一起,提高了工作效率。同时还提供动态加载模块的方式,为动态修改内核功能提供了灵活性。系统调用接口用户程序通过软件中断后,调用系统内核提供的功能,这个在用户空间和内核提供的服务之间的接口称为系统调用。系统调用是Linux内核提供的,用户空间无法直接使用系统调用。在用户进程使用系统调用必须跨越应用程序和内核的界限。Linux内核向用户提供了统一的系统调用接口,但是在不同处理器上系统调用的方法

各不相同。Linux内核提供了大量的系统调用,现在从系统 调用的基本原理出发探究Linux系统调用的方法。这是在一个用户进程中通过GNU C库进行的系统调用示意图,系 统调用通过同一个入口点传入内核。以i386体系结构为例,约定使用EAX寄存器标记系统调用。 当加载了系统C库调用的索引和参数时,就会调用0x80软件中断,它将执行system_call函数,这个函数按照EAX 寄存器内容的标示处理所有的系统调用。经过几个单元测试,会使用EAX寄存器的内容的索引查system_call_table表得到系统调用的入口,然后执行系统调用。从系统调用返回后,最终执行system_exit,并调用resume_userspace函数返回用户空间。 linux内核系统调用的核心是系统多路分解表。最终通过EAX寄存器的系统调用标识和索引值从对应的系统调用表 中查出对应系统调用的入口地址,然后执行系统调用。 linux系统调用并不单层的调用关系,有的系统调用会由

linux内核的网络配置

文章来源 https://www.doczj.com/doc/df14035010.html,/p/2088592067 第9节, Networking support 关于网络支持 上图 讲解; RF switch subsystem support 这个一般是要的,因为有些无线和蓝牙放在一张卡上 选m,wireless(无线)里面的一些选项随之会自动选m,上图 注意: cfg80211 wireless extensions compatibility 这个兼容选项要选择,3.7默认是没有选择

如果没有选择,iwconfig会报告没有扩展 Bluetooth subsystem support 蓝牙,可以自己选择,如果有m就行 还有子选项自己看下 如果还有红外线,无线电,对应选择,这个设备应该是很少networking option最上面的,全局网络选项,上图

Packet socket和Unix domain sockets 备必,而且不能成模块,不然udev会报一段信息给你 Transformation user configuration interface 选m,其实也很少用,像ipsec,下面的ipsec也可以选成模块 TCP/IP networking 要的,要的,子选项大部分不用,你也可以选上 IP: multicasting 多播 IP: advanced router 高级路由 你需要选上 IP: TCP syncookie support ~~sync flooding,同时还必须。。。个人没什么意义Large Receive Offload提高网络的东西,这个Y,如果你觉得现在不用,先m TCP: advanced congestion control这个你也可以Y The IPv6 protocol 很多要用到,虽然在兲现在没用,像systemd就要了 Security Marking和Network packet filtering framework (Netfilter) 个人没什么意义,你可以试下

Linux设置内核参数的方法

Linux设置内核参数的方法 1内核参数的查看方法 使用“sysctl -a”命令可以查看所有正在使用的内核参数。内核参数比较多(一般多达500项),按照前缀主要分为以下几大类:net.ipv4、net.ipv6、net.core、vm、fs、dev.parport、dev.cdrom 、dev.raid、kernel等等。相同的linux,安装的组件和使用的方式不一样,正在使用的内核参数是不一样的。 所有的内核参数的说明文档是放到/usr/src/linux/Documentation/sysctl中的,如果想知道对内核参数的说明,可以到该目录下查看相应的说明文档。 2内核参数的的设置方法 由于Linux的内核参数信息都存在内存中,因此可以通过命令直接修改,并且修改后直接生效。也可以通过文件的方式进行设置。下面就介绍这两种修改方法。 2.1命令设置的方式 可以用两种方法实现。 1、使用“sysctl -w 参数名=值”的方式 假设我们把net.ipv4.ip_forward的值修改为1,使用命令“sysctl -w net.ipv4.ip_forward=1”。 2、修改内核参数对应的proc文件 内核参数位于/proc/sys/之下,参数名称是以文件所在的路径,并将“/”以“.”来取代。举例来说,/proc/sys/net/ip_forward的参数名称为net.ipv4.ip_forward。 同样把net.ipv4.ip_forward的值修改为1,使用命令“echo “1”> /proc/sys/net/ipv4/ip_forward”。 注意,这里proc文件跟普通的文件不一样。一般一个文件用echo写入内容之后,会变成一个文本文件,但echo修改proc文件之后还是个空文件。 2.2文件设置的方式 更改的内核参数默认保存在/etc/sysctl.conf文件中。修改的时候可以直接用vi编辑sysctl.conf文件,增加要修改的内核参数内容,修改的格式为:参数名=值。例如,把net.ipv4.ip_forward的值修改为1,在sysctl.conf中增加下面这行内容:net.ipv4.ip_forward=1 文件修改好后,进行保存。然后使用“sysctl -p 配置文件名”来使配置生效,如果配置文件是默认的,可以不用输配置文件名,即使用“sysctl -p”。 通过文件设置的方式修改的内核参数是在系统重启后将失效(我之前认为修改后的内核参数放在文件中,系统启动的时候会读这个文件,重启后设置应该不会失效。但经过验证,一般会失效,但如果把将默认的boot.sysctl服务打开,所以系统启动时就会执行这个文件的设置)。把我们修改参数的命令写入启动执行脚本文件里/etc/rc.local,这样系统重启后配置就不会失效。 文件方式的好处是内核参数设置的值可以用文件保留下来,调用“sysctl -p”可以使文

linux内核IMQ源码实现分析

本文档的Copyleft归wwwlkk所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。 E-mail: wwwlkk@https://www.doczj.com/doc/df14035010.html, 来源: https://www.doczj.com/doc/df14035010.html,/?business&aid=6&un=wwwlkk#7 linux2.6.35内核IMQ源码实现分析 (1)数据包截留并重新注入协议栈技术 (1) (2)及时处理数据包技术 (2) (3)IMQ设备数据包重新注入协议栈流程 (4) (4)IMQ截留数据包流程 (4) (5)IMQ在软中断中及时将数据包重新注入协议栈 (7) (6)结束语 (9) 前言:IMQ用于入口流量整形和全局的流量控制,IMQ的配置是很简单的,但很少人分析过IMQ的内核实现,网络上也没有IMQ的源码分析文档,为了搞清楚IMQ的性能,稳定性,以及借鉴IMQ的技术,本文分析了IMQ的内核实现机制。 首先揭示IMQ的核心技术: 1.如何从协议栈中截留数据包,并能把数据包重新注入协议栈。 2.如何做到及时的将数据包重新注入协议栈。 实际上linux的标准内核已经解决了以上2个技术难点,第1个技术可以在NF_QUEUE机制中看到,第二个技术可以在发包软中断中看到。下面先介绍这2个技术。 (1)数据包截留并重新注入协议栈技术

(2)及时处理数据包技术 QoS有个技术难点:将数据包入队,然后发送队列中合适的数据包,那么如何做到队列中的数

激活状态的队列是否能保证队列中的数据包被及时的发送吗?接下来看一下,激活状态的队列的 证了数据包会被及时的发送。 这是linux内核发送软中断的机制,IMQ就是利用了这个机制,不同点在于:正常的发送队列是将数据包发送给网卡驱动,而IMQ队列是将数据包发送给okfn函数。

如何安装Linux内核源代码

如何获取Linux内核源代码 下载Linux内核当然要去官方网站了,网站提供了两种文件下载,一种是完整的Linux 内核,另一种是内核增量补丁,它们都是tar归档压缩包。除非你有特别的原因需要使用旧版本的Linux内核,否则你应该总是升级到最新版本。 使用Git 由Linus领头的内核开发队伍从几年前就开始使用Git版本控制系统管理Linux内核了(参考阅读:什么是Git?),而Git项目本身也是由Linus创建的,它和传统的CVS不一样,Git是分布式的,因此它的用法和工作流程很多开发人员可能会感到很陌生,但我强烈建议使用Git下载和管理Linux内核源代码。 你可以使用下面的Git命令获取Linus内核代码树的最新“推送”版本: $ git clone git://https://www.doczj.com/doc/df14035010.html,/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 然后使用下面的命令将你的代码树与Linus的代码树最新状态同步: $ git pull 安装内核源代码 内核包有GNU zip(gzip)和bzip2格式。Bzip2是默认和首选格式,因为它的压缩比通常比gzip更好,bzip2格式的Linux内核包一般采用linux-x.y.z.tar.bz2形式的文件名,这里的x.y.z是内核源代码的具体版本号,下载到源代码包后,解压和抽取就很简单了,如果你下载的是bzip2包,运行: $ tar xvjf linux-x.y.z.tar.bz2 如果你下载的是gzip包,则运行: $ tar xvzf linux-x.y.z.tar.gz 无论执行上面哪一个命令,最后都会将源代码解压和抽取到linux-x.y.z目录下,如果你使用Git下载和管理内核源代码,你不需要下载tar包,只需要运行git clone命令,它就会自动下载和解压。 内核源代码通常都会安装到/usr/src/linux下,但在开发的时候最好不要使用这个源代码树,因为针对你的C库编译的内核版本通常也链接到这里的。 应用补丁

史上最全linux内核配置详解

对于每一个配置选项,用户可以回答"y"、"m"或"n"。其中"y"表示将相应特性的支持或设备驱动程序编译进内核;"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;"n"表示内核不提供相应特性或驱动程序的支持。只有<>才能选择M 1. General setup(通用选项) [*]Prompt for development and/or incomplete code/drivers,设置界面中显示还在开发或者还没有完成的代码与驱动,最好选上,许多设备都需要它才能配置。 [ ]Cross-compiler tool prefix,交叉编译工具前缀,如果你要使用交叉编译工具的话输入相关前缀。默认不使用。嵌入式linux更不需要。 [ ]Local version - append to kernel release,自定义版本,也就是uname -r可以看到的版本,可以自行修改,没多大意义。 [ ]Automatically append version information to the version string,自动生成版本信息。这个选项会自动探测你的内核并且生成相应的版本,使之不会和原先的重复。这需要Perl的支持。由于在编译的命令make-kpkg 中我们会加入- –append-to-version 选项来生成自定义版本,所以这里选N。 Kernel compression mode (LZMA),选择压缩方式。 [ ]Support for paging of anonymous memory (swap),交换分区支持,也就是虚拟内存支持,嵌入式不需要。 [*]System V IPC,为进程提供通信机制,这将使系统中各进程间有交换信息与保持同步的能力。有些程序只有在选Y的情况下才能运行,所以不用考虑,这里一定要选。 [*]POSIX Message Queues,这是POSIX的消息队列,它同样是一种IPC(进程间通讯)。建议你最好将它选上。 [*]BSD Process Accounting,允许进程访问内核,将账户信息写入文件中,主要包括进程的创建时间/创建者/内存占用等信息。可以选上,无所谓。 [*]BSD Process Accounting version 3 file format,选用的话统计信息将会以新的格式(V3)写入,注意这个格式和以前的v0/v1/v2 格式不兼容,选不选无所谓。 [ ]Export task/process statistics through netlink (EXPERIMENTAL),通过通用的网络输出工作/进程的相应数据,和BSD不同的是,这些数据在进程运行的时候就可以通过相关命令访问。和BSD类似,数据将在进程结束时送入用户空间。如果不清楚,选N(实验阶段功能,下同)。 [ ]Auditing support,审计功能,某些内核模块需要它(SELINUX),如果不知道,不用选。 [ ]RCU Subsystem,一个高性能的锁机制RCU 子系统,不懂不了解,按默认就行。 [ ]Kernel .config support,将.config配置信息保存在内核中,选上它及它的子项使得其它用户能从/proc/ config.gz中得到内核的配置,选上,重新配置内核时可以利用已有配置Enable access to .config through /proc/config.gz,上一项的子项,可以通过/proc/ config.gz访问.config配置,上一个选的话,建议选上。 (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。 [ ]Control Group support(有子项),使用默认即可,不清楚可以不选。 Example debug cgroup subsystem,cgroup子系统调试例子 Namespace cgroup subsystem,cgroup子系统命名空间 Device controller for cgroups,cgroups设备控制器

Linux内核结构详解教程

Linux内核结构详解教程 ─────Linux内核教程 linux内核就像人的心脏,灵魂,指挥中心。 内核是一个操作系统的核心,它负责管理系统的进程,内存,设备驱动程序,文件和网络系统,决定着系统的性能和稳定性。内核以独占的方式执行最底层任务,保证系统正常运行。协调多个并发进程,管理进程使用的内存,使它们相互之间不产生冲突,满足进程访问磁盘的请求等等. 严格说Linux并不能称做一个完整的操作系统.我们安装时通常所说的Linux,是有很多集合组成的.应称为GNU/Linux. 一个Linux内核很少1.2M左右,一张软盘就能放下. 内容基础,语言简短简洁 红联Linux论坛是致力于Linux技术讨论的站点,目前网站收录的文章及教程基本能满足不同水平的朋友学习。 红联Linux门户: https://www.doczj.com/doc/df14035010.html, 红联Linux论坛: https://www.doczj.com/doc/df14035010.html,/bbs 红联Linux 论坛大全,所有致力点都体现在这 https://www.doczj.com/doc/df14035010.html,/bbs/rf/linux/07.htm

目录 Linux内核结构详解 Linux内核主要五个子系统详解 各个子系统之间的依赖关系 系统数据结构 Linux的具体结构 Linux内核源代码 Linux 内核源代码的结构 从何处开始阅读源代码 海量Linux技术文章

Linux内核结构详解 发布时间:2006-11-16 19:05:29 Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。

Linux内核主要五个子系统详解 发布时间:2006-11-16 19:05:54 1.进程调度(SCHED):控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。 2.内存管理(MM)允许多个进程安全的共享主内存区域。Linux的内存管理支持虚拟内存,即在计算机中运行的程序,其代码,数据,堆栈的总量可以超过实际内存的大小,操作系统只是把当前使用的程序块保留在内存中,其余的程序块则保留在磁盘中。必要时,操作系统负责在磁盘和内存间交换程序块。内存管理从逻辑上分为硬件无关部分和硬件有关部分。硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。 3.虚拟文件系统(VirtualFileSystem,VFS)隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。 4.网络接口(NET)提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。 5.进程间通讯(IPC) 支持进程间各种通信机制。 处于中心位置的进程调度,所有其它的子系统都依赖它,因为每个子系统都需要挂起或恢复进程。一般情况下,当一个进程等待硬件操作完成时,它被挂起;当操作真正完成时,进程被恢复执行。例如,当一个进程通过网络发送一条消息时,网络接口需要挂起发送进程,直到硬件成功地完成消息的发送,当消息被成功的发送出去以后,网络接口给进程返回一个代码,表示操作的成功或失败。其他子系统以相似的理由依赖于进程调度。

Linux内核配置编译与文件系统构建要点

Linux内核配置编译与文件系统构建 南京大学 黄开成101180046 2012.11.11 一:实验目的 1.了解嵌入式系统的开发环境,内核与文件系统的下载和启动; 2.了解Linux内核源代码的目录结构及各自目录的相关内容,了解Linux内核各配置选项内容和作用,掌握Linux内核的编译过程; 3.了解嵌入式操作系统中文件系统的类型和应用、了解JFFS2文件系统的优点及其在嵌入式系统中的作用、掌握利用Busybox软件制作嵌入式文件系统的方法,并且掌握嵌入式Linux文件系统的挂载过程。二:实验环境说明 1.PC机使用openSUSE 14 Enterprise 系统。 2.开发板使用深圳市武耀博德信息技术有限公司生产的基于Inter 的PXA270处理器的多功能嵌入式开发平台EELIOD。 3.PC机通过RS-232串口与开发板相连,在PC机终端上运行minicom 程序构造一个开发板上的终端,用于对开发板的控制。 4.PC机与开发板通过ethernet网络相连接,并可在开发板上通过加载网络文件系统(NFS)与PC机通信。 5.Bootloader可以通过tftp协议从PC机上下载内核镜像和根文件系统镜像。下载目录为/tftpboot 。 6.用于开发板的Linux内核源码为linux-2.4.21-51Board_EDR,

busybox版本为busybox-1.00-pre5。 7.交叉编译器的路径为/usr/local/arm-linux/bin/arm-linux。 三:实验操作过程和分析记录 1.嵌入式系统的开发环境和开发流程: 1.1启动minicom和开发板 在PC机上打开一个终端,输入: >minicom 按Ctrl+A-o进入minicom的configuration界面。对串行通信接口进行配置,串口设置为:/dev/ttyS0(串口线接在PC机的串口1上)、bps=115200、8位数据、无校验、无流控制。 然后打开开发板电源,看到屏幕有反应之后,按任意键进入配置界面,如果长时间没有按下任何键,bootloader将会自动从flash中读取内核和根文件系统并启动开发板上的Linux系统。 分析:嵌入式系统中,通常并没有像PC机中BIOS 那样的固件程序,因此整个系统的加载启动任务完全由bootloader来完成。bootloader的主要作用是:初始化硬件设备;建立内存空间的映射图;完成内核的加载,为内核设置启动参数。 按0进入命令行模式,出现51board>,可以设置开发板和PC机的IP 地址: 51board> set myipaddr 192.168.208.133(设置开发板的IP地址) 51board> set destipaddr 192.168.208.33(设置PC机的IP地址)注意IP地址的设置:使其处于同一网段,并且避免和其他系统的

linux内核启动 Android系统启动过程详解

linux内核启动+Android系统启动过程详解 第一部分:汇编部分 Linux启动之 linux-rk3288-tchip/kernel/arch/arm/boot/compressed/ head.S分析这段代码是linux boot后执行的第一个程序,完成的主要工作是解压内核,然后跳转到相关执行地址。这部分代码在做驱动开发时不需要改动,但分析其执行流程对是理解android的第一步 开头有一段宏定义这是gnu arm汇编的宏定义。关于GUN 的汇编和其他编译器,在指令语法上有很大差别,具体可查询相关GUN汇编语法了解 另外此段代码必须不能包括重定位部分。因为这时一开始必须要立即运行的。所谓重定位,比如当编译时某个文件用到外部符号是用动态链接库的方式,那么该文件生成的目标文件将包含重定位信息,在加载时需要重定位该符号,否则执行时将因找不到地址而出错 #ifdef DEBUG//开始是调试用,主要是一些打印输出函数,不用关心 #if defined(CONFIG_DEBUG_ICEDCC)

……具体代码略 #endif 宏定义结束之后定义了一个段, .section ".start", #alloc, #execinstr 这个段的段名是 .start,#alloc表示Section contains allocated data, #execinstr表示Section contains executable instructions. 生成最终映像时,这段代码会放在最开头 .align start: .type start,#function /*.type指定start这个符号是函数类型*/ .rept 8 mov r0, r0 //将此命令重复8次,相当于nop,这里是为中断向量保存空间 .endr b 1f .word 0x016f2818 @ Magic numbers to help the loader

Linux内核分析-网络[五]:网桥

看完了路由表,重新回到netif_receive_skb ()函数,在提交给上层协议处理前,会执行下面一句,这就是网桥的相关操作,也是这篇要讲解的容。 view plaincopy to clipboardprint? 1. s kb = handle_bridge(skb, &pt_prev, &ret, orig_dev); 网桥可以简单理解为交换机,以下图为例,一台linux机器可以看作网桥和路由的结合,网桥将物理上的两个局域网LAN1、LAN2当作一个局域网处理,路由连接了两个子网1.0和2.0。从eth0和eth1网卡收到的报文在Bridge模块中会被处理成是由Bridge收到的,因此Bridge也相当于一个虚拟网卡。 STP五种状态 DISABLED BLOCKING LISTENING LEARNING FORWARDING 创建新的网桥br_add_bridge [net\bridge\br_if.c] 当使用SIOCBRADDBR调用ioctl时,会创建新的网桥br_add_bridge。 首先是创建新的网桥: view plaincopy to clipboardprint?

1. d ev = new_bridge_dev(net, name); 然后设置dev->dev.type为br_type,而br_type是个全局变量,只初始化了一个名字变量 view plaincopy to clipboardprint? 1. S ET_NETDEV_DEVTYPE(dev, &br_type); 2. s tatic struct device_type br_type = { 3. .name = "bridge", 4. }; 然后注册新创建的设备dev,网桥就相当一个虚拟网卡设备,注册过的设备用ifconfig 就可查看到: view plaincopy to clipboardprint? 1. r et = register_netdevice(dev); 最后在sysfs文件系统中也创建相应项,便于查看和管理: view plaincopy to clipboardprint? 1. r et = br_sysfs_addbr(dev); 将端口加入网桥br_add_if() [net\bridge\br_if.c] 当使用SIOCBRADDIF调用ioctl时,会向网卡加入新的端口br_add_if。 创建新的net_bridge_port p,会从br->port_list中分配一个未用的port_no,p->br会指向br,p->state设为BR_STATE_DISABLED。这里的p实际代表的就是网卡设备。 view plaincopy to clipboardprint? 1. p = new_nbp(br, dev); 将新创建的p加入CAM表中,CAM表是用来记录mac地址与物理端口的对应关系;而刚刚创建了p,因此也要加入CAM表中,并且该表项应是local的[关系如下图],可以看到,CAM表在实现中作为net_bridge的hash表,以addr作为hash值,链入 net_bridge_fdb_entry,再由它的dst指向net_bridge_port。

配置和编译Linux内核

配置和编译Linux内核 对内核进行正确配置后,才能进行编译。配置不当的内核,很有可能编译出错,或者不能正确运行。 1.1.1 快速配置内核 进入Linux内核源码数顶层目录,输入make menuconfig命令,可进入如图0.1所示的基于Ncurses的Linux内核配置主界面(注意:主机须安装ncurses相关库才能正确运行该命令并出现配置界面)。如果没有在Makefile中指定ARCH,则须在命令行中指定: $ make ARCH=arm menuconfig 图0.1基于Ncurses的Linux内核配置主界面 基于Ncurses的Linux内核配置界面不支持鼠标操作,必须用键盘操作。基本操作方法: ?通过键盘的方向键移动光标,选中的子菜单或者菜单项高亮; ?按TAB键实现光标在菜单区和功能区切换; ?子菜单或者选项高亮,将光标移功能区选中回车: ◆如果是子菜单,按回车进入子菜单; ◆如果是菜单选项,按空格可以改变选项的值: ●对于bool型选项,[*]表示选中,[ ]表示未选中; ●对于tristate型选项,<*>表示静态编译,表示编译为模块,<>表示未 选中。 ◆对于int、hex和string类型选项,按回车进入编辑菜单。 ?连按两次ESC或者选中回车,将退回到上一级菜单; ?按斜线(/)可启用搜索功能,填入关键字后可搜索全部菜单内容。

配置完毕,将光标移动到配置界面末尾,选中“Save an Alternate Configuration File”后回车,保存当前内核配置,默认配置文件名为.config,如图错误!文档中没有指定样式的文字。.2所示。 图错误!文档中没有指定样式的文字。.2保存内核配置为.config文件 保存完毕,选择退出内核配置界面,回到终端命令行。 当然,也可以将配置文件命名为其它文件名,如config-bak等,但该配置不会被Makefile 文件使用,Makefile默认使用文件名为.config的配置文件,所以重新命名配置文件通常在保留或者备份内核配置信息时使用。 也可以不用“Save an Alternate Configuration File”操作,连按ESC或选择退出内核配置界面,将会出现如图错误!文档中没有指定样式的文字。.3所示的保存配置提示信息,选择后回车,内核配置将会被保存为.config文件。 图错误!文档中没有指定样式的文字。.3保存内核配置提示信息 备份内核配置,在命令行下将.config文件复制为其它文件名来得更简单快捷: $ cp .config config-bak 装载某个配置文件,可在配置界面选中“Load an Alternate Configuration File”,然后填入已存在的配置文件名称。也可在命令行下将配置文件复制为.config: $ cp config-bak.config 在目录下有很多*_defconfig文件,这些都是内核的预设配置文件,分别对应各种不同的参考板。如果要使用其中的配置文件作为内核编译配置,可用“make xxx_defconfig”命令来完成。对于已经设定好的内核配置,也可以命名为某个文件名,放到目录下,在以后直接用make来调用该配置即可。例如将当前配置命名为m3352_defconfig并放到目录下,后续只需执行下列命令即可使用当前配置: $ make m3352_defconfig或者 $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-m3352_defconfig

实例解析linux内核I2C体系结构(2)

实例解析linux内核I2C体系结构(2) 华清远见刘洪涛四、在内核里写i2c设备驱动的两种方式 前文介绍了利用/dev/i2c-0在应用层完成对i2c设备的操作,但很多时候我们还是习惯为i2c设备在内核层编写驱动程序。目前内核支持两种编写i2c驱动程序的方式。下面分别介绍这两种方式的实现。这里分别称这两种方式为“Adapter方式(LEGACY)”和“Probe方式(new style)”。 (1)Adapter方式(LEGACY) (下面的实例代码是在2.6.27内核的pca953x.c基础上修改的,原始代码采用的是本文将要讨论的第2种方式,即Probe方式) ●构建i2c_driver static struct i2c_driver pca953x_driver = { .driver = { .name= "pca953x", //名称 }, .id= ID_PCA9555,//id号 .attach_adapter= pca953x_attach_adapter, //调用适配器连接设备 .detach_client= pca953x_detach_client,//让设备脱离适配器 }; ●注册i2c_driver static int __init pca953x_init(void) { return i2c_add_driver(&pca953x_driver); } module_init(pca953x_init); ●attach_adapter动作 执行i2c_add_driver(&pca953x_driver)后会,如果内核中已经注册了i2c适配器,则顺序调用这些适配器来连接我们的i2c设备。此过程是通过调用i2c_driver中的attach_adapter方法完成的。具体实现形式如下: static int pca953x_attach_adapter(struct i2c_adapter *adapter) { return i2c_probe(adapter, &addr_data, pca953x_detect); /* adapter:适配器 addr_data:地址信息 pca953x_detect:探测到设备后调用的函数 */ } 地址信息addr_data是由下面代码指定的。 /* Addresses to scan */ static unsigned short normal_i2c[] = {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,I2C_CLIENT_END}; I2C_CLIENT_INSMOD;

相关主题
文本预览
相关文档 最新文档