当前位置:文档之家› Linux内核定制优化配置

Linux内核定制优化配置

Linux内核定制优化配置
Linux内核定制优化配置

五、Linux内核裁减

(1)安装module-init-tools-3.0.tar.gz:

# tar -zxvf module-init-tools-3.0.tar.gz

# cd module-init-tools-3.0

# ./configure --prefix=/sbin

# make

# make install

# ./generate-modprobe.conf /etc/modprobe.conf

这个脚本程序会读取原配置文件modules.conf的内容,经过格式转化后,生成新的配置文件/etc/modprobe.conf。

不知道为什么,我用module-init-tools-3.1时make出错。如果改用3.0的就没事了。

(2)安装modutils-2.4.25-8.9.i386.rpm:

# rpm -Uvih modutils-2.4.25-8.9.i386.rpm

对modutils进行升级。

-U, --upgrade=+ upgrade package(s)

(3)安装新内核:

将新内核copy到/usr/src下,

#tar xzvf linux-2.6.38.4.tar.gz -----解压缩.

II. 将名为linux的符号链接删掉,这是旧版本内核的符号链接.

#ln -s linux-2.6.38.4 linux ------建立linux-2.6.38.4的符号链接linux.

(4)设置内核.

# cd /usr/src/linux

# make mrproper -----删除不必要的文件和目录.

#make menuconfig 生成一个.config文件

Linux 内核的裁剪与编译看上去是个挺简单的过程。只是对配置菜单的简单选择。但是内核配置菜单本身结构庞大,内容复杂。具体如何选择却难住了不少人。因此熟悉与了解该菜单的各项具体含义就显得比较重要。我们现在就对其作一些必要介绍:

Linux 内核的编译菜单有好几个版本,运行:

1)make config:进入命令行,可以一行一行的配置,这不好使用所以我们不具体介绍。2)make menuconfig:进入我们熟悉的menuconfig 菜单,相信很多人对此都不陌生。

3)make xconfig:在2.4.X 以及以前版本中xconfig 菜单是基于TCL/TK 的图形库的。

所有内核配置菜单都是通过Config.in 经由不同脚本解释器产生.config。而目前刚刚推出的2.6.X 内核用QT 图形库。由KConfig 经由脚本解释器产生。这两版本差别还挺大。从我

个人角度就是爱用新东西。2.6.X的xconfig菜单结构清晰,使用也更方便。但基于目前2.4.X 版本比较成熟,稳定,用的最多。所以这里我还是以 2.4.X 版本为基础介绍相关裁剪内容。同时因为xconfig 界面比较友好,大家容易掌握。但它却没有menuconfig 菜单稳定。有些人机器跑不起来。所以考虑最大众化角度,我们以较稳定,且不够友好的menuconfig为主进行介绍,它会用了,Xconfig 就没问题。2.4.X 版本xconfig 配置菜单,2.4.X 版本menuconfig 配置菜单,2.6.X 版本xconfig 配置菜单分别如图4.1.4,4.1.5,4.1.6 所示:

图4.1.4 2.4.menuconfig配置菜单

在选择相应的配置时,有三种选择方式,它们分别代表的含义如下:

Y--将该功能编译进内核

N--不将该功能编译进内核

M--将该功能编译成可以在需要时动态插入到内核中的模块

如果你是使用的是make xconfig,那使用鼠标就可以选择对应的选项。这里使用的是make menuconfig,所以需要使用空格键进行选取。在每一个选项前都有一个括号,有的是中括号有的是尖括号,还有圆括号。用空格键选择时可以发现,中括号里要么是空,要么是"*",而尖括号里可以是空,"*"和"M"这表示前者对应的项要么不要,要么编译到内核里;后者

则多一样选择,可以编译成模块。而圆括号的内容是要你在所提供的几个选项中选择一项。(注:其中有不少选项是目标板开发人员加的,对于陌生选项,自己不知道该选什么时建议使用默认值)

下面我们来看看具体配置菜单,进入内核所在目录,键入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

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

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% 。我目前没有此类应用场景,用到时会选择将其编译进去。

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、[ ] Configure standard kernel features (for small systems) --->

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

1.27、[ ] Embedded system

1.28、-*- Load all symbols for debugging/ksymoops

装载所有的调试符号表信息,仅供调试时选择

1.29、[ ] Include all symbols in kallsyms

在kallsyms中包含内核知道的所有符号,内核将会增大300K

1.30、[*] Do an extra kallsyms pass

除非你在kallsyms中发现了bug并需要报告这个bug才打开该选项

1.31、-*- Kernel performance events and counters // CPU 性能监听器,包括CPU 同一时间执行指令数,cache miss 数,分支预测失败次数( Branch misprediction ) 。调优其他程序时或许会用到,比如JVM

[ ] Debug: use vmalloc to back perf mmap () buffers < === 调试特性关闭

[ ] Kernel performance counters (old config option)

1.32、[*] Disable heap randomization

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

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

1.34、[*] Profiling support

不选

剖面支持,用一个工具来扫描和提供计算机的剖面图。

支持系统评测(对于大多数用户来说并不是必须的)

1.34、OProfile system profiling

OProfile评测和性能监控工具

1.35、[ ] OProfile multiplexing support (EXPERIMENTAL)

1.36、Kprobes

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

1.37、Optimize trace point call sites

1.38、GCOV-based kernel profiling

[ ] Enable gcov-based kernel profiling

2、[*] Enable loadable module support --->

[ ] Forced module loading

允许强制加载模块

[*] Module unloading

允许卸载已经加载的模块

[ ] Forced module unloading

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

如果不清楚,选N。

[*] Module versioning support

有时候,你需要编译模块。选这项会添加一些版本信息,来给编译的模块提供独立的特性,以使不同的内核在使用同一模块时区别于它原有的模块。这有时可能会有点用。

如果不清楚,选N。允许使用其他内核版本的模块(可能会出问题)

[*] Source checksum for all modules

为所有的模块校验源码,如果你不是自己编写内核模块就不需要它

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

3、-*- Enable the block layer --->

块设备支持,使用硬盘/USB/SCSI设备者必选这选项使得块设备可以从内核移

除。如果不选,那么blockdev 文件将不可用,一些文件系统比如ext3 将不可

用。这个选项会禁止SCSI 字符设备和USB 储存设备,如果它们使用不同的

块设备。选Y,除非你知道你不需要挂载硬盘和其他类似的设备。不过此项无

可选项

[*] Support for large (2TB+) block devices and files

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

-*- Block layer SG support v4

通用scsi块设备第4版支持

[ ] Block layer data integrity support

块设备数据完整性支持

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

(X) CFQ

( ) No-op

4、Processor type and features --->

4.1.1、[ ] Tickless System (Dynamic Ticks)

非固定频率系统,这项技术能让新内核运行的更有效率,并且更省电

4.1.2、[ ] High Resolution Timer Support

支持高频率时间发生器,如果硬件不兼容,则这个选项只会增大内核(大多数个人PC并没有这个)

4.1.3、[*] 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.1.4、Enable MPS table

mps多处理器规范,不选

4.15、[ ]Support for big SMP systems with more than 8 CPUs

4.16、[*] Support for extended (non-PC) x86 platforms

支持非pc,不选

4.17、[]AMD Elan

4.18、[ ] Moorestown MID platform

4.19、RDC R-321x SoC

嵌入式相关

4.20、[]Support non-standard 32-bit SMP architectures

4.21、< > Eurobraille/Iris poweroff module

4.22.、[*] Single-depth WCHAN output

跟proc 相关的最好不要关

4.23、[ ] Paravirtualized guest support --->

虚拟化客户端支持

4.24、[ ] Memtest

内存测试

4.25、Processor family (Pentium-Pro) --->

处理器系列,请按照你实际使用的CPU选择这里是处理器的类型。这里的信息主要目的是用来优化。为了让内核能够在所有X86构架的CPU上运行(虽然不是最佳速度),在这你可以选386。

内核不会运行在比你选的构架还要老的机器上。比如,你选了Pentium构架来优化内核,它将不能在486构架上运行。如果你不清楚,选386。

( ) 386

( ) 486

( ) 586/K5/5x86/6x86/6x86MX

( ) Pentium-Classic

( ) Pentium-MMX

(X) 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.26、[*] Generic x86 support不选

这一选项针对x86系列的CPU使用更多的常规优化。如果你在上面一项选的是i386、i586

之类的才选这个通用x86支持,如果你的CPU能够在上述"Processor family"中找到就别选

除了对上面你选择的X86 CPU进行优化,它还对更多类型X86 CPU的进行优化。这将会使内核在其他的X86 CPU上运行得更好。

这个选项提供了对X86系列CPU最大的兼容性,用来支持一些少见的x86构架的CPU。如果你的CPU能够在上面的列表中找到,就里就不用选了。

4.27、[*] HPET Timer Support

HPET时钟支持

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

4.28、(8) Maximum number of CPUs

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

4.29、[*] SMT (Hyperthreading) scheduler support

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

4.30、[*] Multi-core scheduler support

针对多核CPU进行调度策略优化多核调度机制支持,双核的CPU要选。

多核心调度在某些情况下将会对多核的CPU系列有较好的支持。如果你不清楚,选N

4.31、[ ] Fine granularity task level IRQ time accounting

4.32、Preemption Model (V oluntary Kernel Preemption (Desktop)) ---│>

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

( ) No Forced Preemption (Server)

适合服务器环境的禁止内核抢占

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

(X) V oluntary Kernel Preemption (Desktop)

适合普通桌面环境的自愿内核抢占

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

如果你是为桌面系统编译内核,选这项。

( ) Preemptible Kernel (Low-Latency Desktop)

适合运行实时程序的主动内核抢占

这个选项通过使所有内核代码(非致命部分)编译为“可抢先”来降低内核延迟。

这通过允许低优先级进程进行强制抢先来响应事件,即使这些进程正在进行系统调用或者未达到正常的“抢先点”。这使得应用程序运行得更加“流畅”即使系统已经是高负荷运转。代价是吞吐量降低,内核运行开销增大。

选这项如果你是为桌面或者嵌入式系统编译内核,需要非常低的延迟。

如果你要最快的响应,选第三项。我认为万物是平衡的,低延迟意味着系统运行不稳定,因为过多来响应用户的要求,所以我选第二个。

4.33、[ ] Reroute for broken boot IRQs

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

4.34、[*] Machine Check / overheating reporting

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

4.35、[*] Intel MCE features

4.36、[*] AMD MCE features

4.37、[ ] Support for old Pentium 5 / WinChip machine checks

4.38、< > Machine check injector support

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

4.39、 Toshiba Laptop support

东芝笔记本模块支持

4.40、 Dell laptop support

Dell笔记本模块支持

4.41、[ ] Enable X86 board specific fixups for reboot

修正某些旧x86主板的重起bug,这种主板基本绝种了

4.42、 /dev/cpu/microcode - microcode support

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

使用不随Linux内核发行的IA32微代码,你必需有IA32微代码二进制文件,仅对Intel的CPU 有效

4.43、[*] Intel microcode patch loading support

4.44、[ ] AMD microcode patch loading support

4.45、 /dev/cpu/*/msr - Model-specific register support

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

在多cpu系统中让特权CPU访问x86的MSR寄存器

4.46、 /dev/cpu/*/cpuid - CPU information support

是否打开记录CPU相关信息功能。这会在/dev/cpu中建立一系列的设备文件,用以让过程去访问指定的CPU。

能从/dev/cpu/x/cpuid获得CPU的唯一标识符(CPUID)

4.47、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.48、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.49、[ ] Allow for memory compaction

4.50、[ ] Enable KSM for page merging

4.51、(4096) Low address space to protect from user allocation

4.52、[ ] Enable recovery from hardware memory errors

4.53、[ ] Transparent Hugepage Support

4.54、[*] Allocate 3rd-level pagetables from highmem

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

4.55、[ ] Check for low memory corruption

低位内存脏数据检查,默认是每60 秒检查一次。一般这种脏数据是因某些Bios 处理不当引起的。资料链接。我信任我目前的虚拟bios 版本

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

4.57、[ ] Math emulation

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

4.58、-*- 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.59、[*] MTRR cleanup support

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

(0)MTRR cleanup enable value (0-1)

(1)MTRR cleanup spare reg num (0-7)

(2)

4.60、[*] EFI runtime service support

EFI启动支持

这里允许内核在EFI平台上使用储存于EFI固件中的系统设置启动。这也允许内核在运行时使用EFI的相关服务。

这个选项只在有EFI固件的系统上有用,它会使内核增加8KB。另外,你必须使用最新的ELILO 登录器才能使内核采用EFI的固件设置来启动(GRUB和LILO完全不知道EFI是什么东西)。即使你没有EFI,却选了这个选项,内核同样可以启动。

大家应该用的是GRUB,所以选上这个也没什么用。

除非你的系统支持EFI(一种可代替传统BIOS的技术)否则不选

4.61、[ ] Enable seccomp to safely compute untrusted bytecode

只有嵌入式系统可以不选

4.62、[ ] Enable -fstack-protector buffer overflow detection (EXPERIMENTAL)

4.63、Timer frequency (1000 HZ) --->

Timer frequency (1000 HZ) --->内核时钟频率桌面1000 服务器100或250 允许设置时钟频率。

这是用户定义的时钟中断频率100HZ-1000 HZ ,不过100 HZ 对服务器和NUMA系统更合适,它们不需要很快速的响应用户的要求,因为时钟中断会导致总线争用和缓冲打回。注意在SMP环境中,时钟中断由变量NR_CPUS * Hz定义在每个CPU产生。

其实和前面的抢先式进程差不多,就是多少频率来响应用户要求。我选了250HZ的。要快点的可以选1000HZ的。但是还是那句话,一切是平衡的。机器过快响应你,它自己的活就不知道做得好不好了。

( ) 100 HZ

100 HZ是传统的对服务器、SMP 和NUMA的系统选项。这些系统有比较多的处理器,可以在中断较集中的时候分担中断

( ) 250 HZ

250 HZ对服务器是一个好的折衷的选项,它同样在SMP 和NUMA 系统上体现出良好的反应速度。

( ) 300 HZ

(X) 1000 HZ

1000 HZ对于桌面和其他需要快速事件反应的系统是非常棒的。

4.64、[*] kexec system call

kexec 系统调用

kexec是一个用来关闭你当前内核,然后开启另一个内核的系统调用。它和重启很像,但是它不访问系统固件。由于和重启很像,你可以启动任何内核,不仅仅是LINUX。

kexec这个名字是从exec 系统调用来的。它只是一个进程,可以确定硬件是否正确关闭,Linus本人都没话说,估计是受害不浅。我们当然不能上当,选N!

提供kexec系统调用,可以不必重启而切换到另一个内核,如果需要就选择,对大多数用户来说并不需要

4.65、[*] kernel crash dumps

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

4.66、(0x1000000) Physical address where the kernel is loaded

4.67、[*] Build a relocatable kernel

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

4.68、(0x400000) Alignment value to which kernel should be aligned

4.69、-*- Support for hot-pluggable CPUs

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

4.70、[ ] Compat VDSO support

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

4.71、[ ] 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、[ ] Support for DMA Remapping Devices (EXPERIMENTAL)

6.4、[*] PCI Express support

6.5、 PCI Express Hotplug driver

6.6、[*] Root Port Advanced Error Reporting support

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

6.7、[*] PCI Express ECRC settings control

6.8、 PCIe AER error injector support

6.9、-*- PCI Express ASPM control

6.10、[ ] Debug PCI Express ASPM

6.11、[*] Message Signaled Interrupts (MSI and MSI-X)

6.12、[ ] PCI Debugging

6.13、<*> PCI Stub driver

6.14、[*] Interrupts on hypertransport devices

6.15、[*] PCI IOV support

6.16、[ ] ISA support

6.17、[ ] MCA support

6.18、< > NatSemi SCx200 support

6.19、[ ] One Laptop Per Child support

6.20、[ ] Support for OLPC's Open Firmware

6.21、<*> 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.22、<*> 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

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 MIGRA TE (EXPERIMENTAL)

[*] TCP/IP networking

[*] IP: multicasting

[*] IP: advanced router

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

[*] IP: equal cost multipath

[*] IP: verbose route monitoring

[ ] IP: kernel level autoconfiguration

我很少用网络引导OS ,内核级别的网络配置对我无用

IP: tunneling

< > IP: GRE demultiplexer

[*] IP: multicast routing

[ ] IP: multicast policy routing

[*] IP: PIM-SM version 1 support

[*] IP: PIM-SM version 2 support

[ ] IP: ARP daemon support

[ ] IP: TCP syncookie support

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

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 A TM

[ ] 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) --->

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

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

1、实验目的 针对Ubuntu10.04中,通过下载新的内核版本,并且修改新版本内核中的系统调用看,然后,在其系统中编译,加载新内核。 2、任务概述 2.1 下载新内核 https://www.doczj.com/doc/ff4868053.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系统的广泛应用,对系统的可靠性提出了更高的要求,尤其是涉及到生命财产等重要领域,要求系统达到安全完整性等级3级以上[1],故障率(每小时出现危险故障的可能性)为10-7以下,相当于系统的平均故障间隔时间(MTBF)至少要达到1141年以上,因此提高系统可靠性已成为一项艰巨的任务。对某公司在工业领域14 878个控制器系统的应用调查表明,从2004年初到2007年9月底,随着硬软件的不断改进,根据错误报告统计的故障率已降低到2004年的五分之一以下,但查找错误的时间却增加到原来的3倍以上。 这种解决问题所需时间呈上升的趋势固然有软件问题,但缺乏必要的手段以辅助解决问题才是主要的原因。通过对故障的统计跟踪发现,难以解决的软件错误和从发现到解决耗时较长的软件错误都集中在操作系统的核心部分,这其中又有很大比例集中在驱动程序部分[2]。因此,错误跟踪技术被看成是提高系统安全完整性等级的一个重要措施[1],大多数现代操作系统均为发展提供了操作系统内核“崩溃转储”机制,即在软件系统宕机时,将内存内容保存到磁盘[3],或者通过网络发送到故障服务器[3],或者直接启动内核调试器[4]等,以供事后分析改进。 基于Linux操作系统内核的崩溃转储机制近年来有以下几种: (1) LKCD(Linux Kernel Crash Dump)机制[3]; (2) KDUMP(Linux Kernel Dump)机制[4]; (3) KDB机制[5]; (4) KGDB机制[6]。 综合上述几种机制可以发现,这四种机制之间有以下三个共同点: (1) 适用于为运算资源丰富、存储空间充足的应用场合; (2) 发生系统崩溃后恢复时间无严格要求; (3) 主要针对较通用的硬件平台,如X86平台。 在嵌入式应用场合想要直接使用上列机制中的某一种,却遇到以下三个难点无法解决: (1) 存储空间不足 嵌入式系统一般采用Flash作为存储器,而Flash容量有限,且可能远远小于嵌入式系统中的内存容量。因此将全部内存内容保存到Flash不可行。

Linux操作系统网络配置命令

vi /etc/sysconfig/network-scripts/ifcfg-eth0 命令配置IP vi进入后,按i变成编辑模式,屏幕下方有个INSERT字样,这时跟windows 的记事本一样了,改吧。内容见下 改完后按ESC键,再输入冒号x——:x保存退出。 service network restart 你的IP就出来了。 DEVICE=eth0 BOOTPROTO=none IPADDR=192.168.0.1 GATEWAY=192.168.0.254 ONBOOT=yes TYPE=Ethernet 1、ifconfig 可以使用ifconfig命令来配置并查看网络接口的配置情况。 例如: (1)配置eth0的IP地址,同时激活该设备。 #ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up (2)配置eth0别名设备eth0:1的IP地址,并添加路由。 #ifconfig eth0 192.168.1.3 #route add –host 192.168.1.3 dev eth0:1 (3)激活设备。 #ifconfig eth0 up (4)禁用设备。 #ifconfig eth0 down (5)查看指定的网络接口的配置。 #ifconfig eth0 (6)查看所有的网络接口配置。

#ifconfig 2、route 可以使用route命令来配置并查看内核路由表的配置情况。 例如: (1)添加到主机的路由。 #route add –host 192.168.1.2 dev eth0:0 #route add –host 10.20.30.148 gw 10.20.30.40 (2)添加到网络的路由。 #route add –net 10.20.30.40 netmask 255.255.255.248 eth0 #route add –net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41 #route add –net 192.168.1.0/24 eth1 (3)添加默认网关。 #route add default gw 192.168.1.1 (4)查看内核路由表的配置。 #route (5)删除路由。 #route del –host 192.168.1.2 dev eth0:0 #route del –host 10.20.30.148 gw 10.20.30.40 #route del –net 10.20.30.40 netmask 255.255.255.248 eth0 #route del –net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41 #route del –net 192.168.1.0/24 eth1

(整理)嵌入式系统的以太网接口设计及linux内核网络设备驱动.

嵌入式系统的以太网接口设计及linux驱动 1 以太网概述 以太网(Ethernet)是当今局域网采用的最通用的通信协议标准。在以太网中,所有计算机被连接在一条电缆上,采用带冲突检测的载波侦听多路访问(CSMA/CD)方法,采用竞争机制和总线拓扑结构。基本上,以太网由共享传输媒体,如双绞线电缆或同轴电缆、多端口集线器、网桥或交换机构成。 按照OSI(Open System Interconnection Reference Model,开放式系统互联参考模型)7层参考模型,以太网定义的是物理层(PHY)和数据链路层(对应以太网的MAC层)的标准。 2 嵌入式处理器上扩展以太网接口 以太网接口控制器主要包括MAC乘PHY两部分,如图1所示为嵌入式处理器集成MAC层控制器。 MAC层控制器和PHY的连接是通过MII、RMII等接口实现的。在IEEE802的标准系列中,数据链路层包括LLC和MAC两个子层。其中MAC负责完成数据帧的封装、解封、发送和接受功能。PHY层的结构随着传输速率的不同而有一定的差异。对于1OBaseT等网络,从以太网PHY芯片输出的就是传输所需的差分信号。但是还需要一个网络隔离变压器组成图2的结构。网络隔离变压器可起到抑制共模干扰、隔离线路以及阻抗匹配等作用。 本文介绍一种新款网络接口芯片DM9000A,它可以很方便的实现与嵌入式CPU的接口,实现扩展以太网口的功能。DM9000A是中国台湾DAVICOM公司推出的一款高速以太网接口芯片,其基本特征是:集成10/100M物理层接口;内部带有16K字节SRAM用作接收发送的FIFO缓存;支持8/16bit两种主机工作模式:

linux内核的网络配置

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

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”可以使文

pc104 linux定制

基于PC/104平台嵌入式Linux系统核心定制方法 2007-10-26 嵌入式在线收藏| 打印 基于PC/104平台的嵌入式Linux技术在海洋自动观测系统中具有广泛的应用前景,Linux核心定制方法的研究是嵌入式Linux系统研制的关键工作。本文结合PC/104平台嵌入式Linux系统的研制,详细论述了Linux内核和文件系统的定制方法。 本文就如何对Linux系统的核心实现定制进行论述,主要内容包括Linux内核部分和文件系统,系统定制的硬件平台是PC/104单片机。之所以将Linux内核定制、文件系统定制单独讨论,是因为在基于任何平台的Linux系统定制过程中,其内核和文件系统的定制工作都具有相似的特征和相似的过程。 在基于PC/104平台的嵌入式Linux研制过程中,进行核心定制的主要目的是从需求出发使系统最大程度地满足应用的需要、最大程度地适应系统硬件平台、最优化地支持系统外围设备和应用程序,并且尽量减少对系统资源的占用、减少系统功耗,增强系统的安全性、稳定性、可靠性,另外使系统真正地实现产权自主化。 内核定制 一般操作系统的内核从体系结构角度可以划分为两种:微内核体系结构、单内核体系结构。微内核体系结构只在内核中包括了一些基本的内核功能,其它部分在用户内存空间运行,这种结构需要在各层之间进行调用,因此会有一定的消耗,使执行效率不如单内核体系结构。Linux采用单内核体系结构,内核的所有部分都集中在一起,这样能使系统的各部分直接沟通,有效地缩短任务之间的切换时间,提高了系统的响应速度,实时性好并提高了CPU的利用率,但在系统比较大的时候体积也比较大,与嵌入式系统容量小、资源有限的特点不符合,因此需要进行非常精细的定制以适应嵌入式系统的需要。 内核版本 Linux的源程序是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发布给他人使用。Linux的开发采用的是双树系统。一个树是稳定树(stable tree),另一个树是非稳定树(unstable tree)或称开发树(development tree)。一些新特性、实验性改进等都将首先在开发树中进行,如果在开发树中所做的改进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同的改进。 一旦开发树经过了足够的发展,开发树就会成为新的稳定树。开发树就体现在源程序的版本号中;源程序版本号的形式为x.y.z,对于稳定树来说,y是偶数;对于开发树来说,y 比相应的稳定树大一(是奇数)。到目前为止,稳定树的最高版本是2.4.21,开发树的最新版

实验六 Linux软件包管理与基本网络配置

实验六Linux软件包管理与基本网络配置 一. 一.实验目的: 1.1.学会find命令的使用方法; 2.2.学习利用rpm和tar命令实现软件包的管理; 3.3.掌握如何在Linux下的TCP/IP网络的设置; 4.4.学会使用命令检测网络配置; 5.5.学会启用和禁用系统服务。 二. 二.实验内容: 1.1.利用find命令查找满足条件的文件; 2.2.利用rpm和tar命令管理软件包; 3.3.使用ifconfig命令配置网络接口; 4.4.使用route命令加默认网关; 5.5.使用hostname命令设置主机名; 6.6.修改/etc/hosts实现Linux的静态地址解析; 7.7.修改/etc/resolv.conf配置Linux的DNS客户端; 8.8.使用ping、netstat命令检测配置; 9.9.设置系统启动时自动配置网络参数; 10.10.用service命令和ntsysv命令控制守护进程。 三. 三.实验练习: 任务一 rpm软件包的管理 本部分实验内容按照课本P171-P178页的各个小的实验内容进行练习。 任务二 find命令的使用 1.1.在/var/lib目录下查找所有文件其所有者是games用户的文件。 $ find /var/lib –user games 2> /dev/null 2.2.在/var目录下查找所有文件其所有者是root用户的文件。 $ find /var –user root –group mail 2>/dev/mull 3.3.查找所有文件其所有者不是root,bin和student用户并用长格式显示(如ls –l 的显示结果)。$ find / -not –user root –not –user bin –not –user student –ls 2> /dev/null or $find / ! –user root ! –user bin ! –user student –exec ls –ld {} \; 2> /dev/null 4.4.查找/usr/bin目录下所有大小超过一百万byte的文件并用长格式显示(如ls –l 的显示结果)。$ find /usr/bin –size +1000000c –ls 2> /dev/null 5.5.对/etc/mail目录下的所有文件使用file命令。 $find /etc/maill –exec file {} \; 2 > /dev/null

史上最全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内核技术

一、教学目的 SMP、多核系统、高性能浮点处理器和新型总线等创新技术,带动操作系统不断发展。本课程使硕士生了解linux的基本原理和结构特征,提高应用现代操作系统的水平、能开发特定的内核功能、设备驱动程序和复杂应用软件的能力。 二、教学内容与要求 1掌握处理器在进程地址空间上的三种运行位置,了解内核编程不能使用C库函数和FPU,以及可能产生内存故障、核心栈溢出和四种内核竞争情形的原因。(2学时)2熟悉进程描述符的组织,进程上下文和进程状态转换,和fork,exec,wait,exit,clone,linux线程和内核线程的实现原理和应用。了解COW和避免出现孤儿进程技术。 (4小时) 3介绍支持SMP的O(1)调度,用户和内核抢占和进程上下文切换,了解优先级复算,睡眠和唤醒机制,SMP的负载均衡。(4小时) 4掌握在x86体系结构上系统调用的具体实现原理,接口参数传递,用户地址空间和核心地址空间之间的数据传输,和增加新的系统功能的方法。(2小时)5熟悉在x86体系结构上Linux中断和异常的处理原理,中断注册、共享、控制,和中断上下文的意义,中断和设备驱动程序的关系,以及设备驱动程序结构和用户接口。 (4小时) 6中断处理程序被分解为top half和bottom half的原因,介绍linux的softirq,tasklet,ksoftirqd和work queue,分析进程与top half,bottom half的竞争情形和同步。(4小时)7掌握内核同步原理和方法:原子操作,自旋锁,(读—写)信号量,完成变量,bkl,seqlock和延迟内核抢占。了解指令“路障”。(4小时) 8介绍系统时钟和硬件定时器,单处理器和多处理器上的linux计时体系结构,定时的时间插补原理,单处理器和多处理器上的时钟中断处理,动态定时器的数据结构和算法原理,定时器竞争情形,延迟函数。Time,gettimeofday,adjtimex,setitimer,alarm 的实现原理和应用。(4小时) 9熟悉进程地址空间的区和页,分配和释放物理页,物理地址与逻辑地址、虚地址之间的映射,slub分配原理和方法,高端物理内存的映射。(4小时) 10介绍VFS原理,超级块,inode结构和方法,dentry结构和方法,file结构和方法,以及进程打开文件表,linux中的文件系统。(2小时) 11讲解块设备缓冲,bio结构,I/O请求队列,和有最终期限的块I/O调度算法。(2小时) 12熟悉进程地址空间的分区,mm_struct结构,vm_area_struct结构和操作,,进程的页表文件映射接口mmap原理和方法。(2小时) 13熟悉页cache和radix_tree,缓冲区cache,和pdflush内核线程原理。(2小时) 三、教学方式 教学方式:课堂讲授 考试方式:堂上考试、考查都采用笔试。

Linux kernel内核升级全过程,教你一次成功

序言 由于开发环境需要在linux-2.6内核上进行,于是准备对我的虚拟机上的Linux系统升级。没想到这一弄就花了两天时间( 反复装系统,辛苦啊~~),总算把Linux系统从2.4.20-8内核成功升级到了2.6.18内核。 网上虽然有很多介绍Linux内核升级的文章,不过要么过时,下载链接失效;要么表达不清,不知所云;更可气的是很多 文章在转载过程中命令行都有错误。刚开始我就是在这些“攻略”的指点下来升级的,以致于浪费了很多时间。 现在,费尽周折,升级成功,心情很爽,趁性也来写个“升级攻略”吧!于是特意又在虚拟机上重新安装一个Linux系统 ,再来一次完美的升级,边升级边记录这些步骤,写成一篇Linux内核升级记实录(可不是回忆录啊!),和大家一起分享 ~~! 一、准备工作 首先说明,下面带#号的行都是要输入的命令行,且本文提到的所有命令行都在终端里输入。 启动Linux系统,并用根用户登录,进入终端模式下。 1、查看Linux内核版本 # uname -a 如果屏幕显示的是2.6.x,说明你的已经是2.6的内核,也用不着看下文了,该干什么干什么去吧!~~~如果显示的是 2.4.x,那恭喜你,闯关通过,赶快进行下一步。 2、下载2.6内核源码 下载地址:https://www.doczj.com/doc/ff4868053.html,/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2 3、下载内核升级工具 (1)下载module-init-tools-3.2.tar.bz2 https://www.doczj.com/doc/ff4868053.html,/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.2.tar.bz2 (2)下载mkinitrd-4.1.18-2.i386.rpm https://www.doczj.com/doc/ff4868053.html,/fedora/linux/3/i386/RPMS.core/mkinitrd-4.1.18-2.i386.rpm (3)下载lvm2-2.00.25-1.01.i386.rpm https://www.doczj.com/doc/ff4868053.html,/fedora/linux/3/i386/RPMS.core/lvm2-2.00.25-1.01.i386.rpm (4)下载device-mapper-1.00.19-2.i386.rpm https://www.doczj.com/doc/ff4868053.html,/fedora/linux/3/i386/RPMS.core/device-mapper-1.00.19-2.i386.rpm (2.6.18内核和这4个升级工具我都有备份,如果以上下载地址失效,请到https://www.doczj.com/doc/ff4868053.html,/guestbook留下你的邮箱,我给你发过去)

linux的网络接口以及详细配置讲解

Linux 网络接口2012-06-21 10:29:45 分类:LINUX 在 Linux 中,所有的网络通讯都发生在软件接口与物理网络设备之间。与网络接口配置相关的文件,以及控制网络接口状态的脚本文件,全都位于 /etc/sysconfig/netwrok-scripts/ 目录下。虽然在不同的系统之间,这些文件的类型和数量并不一定相同,但大致来讲,都包含以下几类与网络相关的配置文件: 1.网络接口配置文件 2.网络接口控制脚本 3.与网络相关的函数库文件(function files) 各种的网络设备都需要用到这些文件保证设备的正常动作 本章将深入探讨这些文件的用途,以及使用它们的方式。 Linux 网络接口 网络接口配置文件 在 Linux 中,网络接口配置文件用于控制系统中的软件网络接口,并通过接口实现对网络设备的控制。当系统启动时,系统通过这些接口配置文件决定启动哪些接口,以及如此对这些接口进行配置。 在 Linux 中,网络接口配置文件用于控制系统中的软件网络接口,并通过这些接口实现对网络设备的控制。当系统启动时,系统通过这些接口配置文件决定启动哪些接口,以及如何对这些接口进行配置。接口配置文件的名称通常类似于 ifcfg-,其中 与配置文件所控制的设备的名称相关。 在所有的网络接口中,我们日常中最常用到的接口类型就是以太网接口。

以太网接口 在所有的网络配置文件中,最常用的就是 ifcfg-eth0,因为它是系统中第一块网卡的配置文件。如果系统中有多块网卡,ifcfg-eth 后面的数字就会依次递增。正因为每个设备都有对应的一个配置文件,因此管理员也能够单独地控制每一个设备。 以下是一个 ifcfg-eth0 配置文件的示例,在配置中已经为网卡设置好了 IP 地址。 DEVICE=eth0 BOOTPROTO=none ONBOOT=yes NETWORK=10.0.1.0 NETMASK=255.255.255.0 IPADDR=10.0.1.27 USERCTL=no // 是否允许非root用户控制网卡 在接口配置文件中,选项之间存在着一些关联,如果不像上例中那样使用固定 IP,使用 DHCP 获取 IP 地址的配置文件又会不一样。以下就是将网卡配置成通过 DHCP 获取 IP 地址的配置: DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes 使用网络管理工具(system-config-network) 对网络接口文件进行更改是比较方便的一种方式,但通过学习手动更改配置文件,能够更好的在各种 Linux 发行版中执行网络配置的工作。 有关网络管理工具的使用方法,可以参考下一章翻译文档 - 《Fedora/Linux 网络配置工具》 下面是以太网接口配置文件中常用的一些选项:

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内核中的Kconfig用法与说明

Linux内核中的Kconfig文件 本节不对内核的Kconfig文件进行深入展开,更多Kconfig语法和说明请阅读 。 内核源码树每个目录下都还包含一个Kconfig文件,用于描述所在目录源代码相关的内核配置菜单,各个目录的Kconfig文件构成了一个分布式的内核配置数据库。通过make menuconfig(make xconfig或者make gconfig)命令配置内核的时候,从Kconfig文件读取菜单,配置完毕保存到文件名为.config的内核配置文件中,供Makefile文件在编译内核时使用。 1.1.1 Kconfig基本语法 如程序清单0.1所示代码摘自文件,是一个比较典型的Kconfig 文件片段,包含了Kconfig的基本语法。 程序清单0.1drivers/char/Kconfig片段 menu "Character devices" source "drivers/tty/Kconfig" config DEVKMEM bool "/dev/kmem virtual device support" default y help Say Y here if you want to support the /dev/kmem device. The /dev/kmem device is rarely used, but can be used for certain kind of kernel debugging operations. When in doubt, say "N". …… endmenu 1.子菜单 通过menu和endmenu来定义一个子菜单,程序清单0.1所示代码定义了一个“Character devices”子菜单,子菜单在界面中用“--->”表示,如图0.1所示。 图0.1menu定义的子菜单 子菜单的菜单项则由config来定义,随后的“bool”、“default”、“help”等都是该菜单 项的属性:

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