Linux-2.6.31内核优化指南

Linux-2.6.31内核优化指南
Linux-2.6.31内核优化指南

Linux 2.6.31内核优化指南

作者:Ken Wu

Email: ken.wug@https://www.360docs.net/doc/221297857.html,

介绍

本文档是一篇关于Linux Kernel 2.6.31的最简优化指南。作者旨在编译一份性

能最佳且适合普通Application/Server开发用的内核。(非生产环境)

本文提及的内核调优,主要是通过选择最佳编译选项,删除无用驱动,减少内核尺寸,关闭部分安全特性等方式来进行的。

优化后的效果,主要体现在OS启动时间,启动后的内存占用以及应用程序运行性能。

由于作者水平有限,如果描述错误,还请不吝指教。

运行环境

虚拟机Virtualbox 3.1.4

CPU Core 2 Duo P9500 2.53G双核开启vt-x, APIC

磁盘

虚拟10G的SATA磁盘

内存

分了1G物理内存

网卡

虚拟AMD PCNet32 100M

其他USB,串口,显卡,声卡全关

作者是在虚拟机中编译的内核,如果你与作者的运行环境不同,则本文档中的部分描述可能会与你的实际情况有一定出入。

不过,相信大部分用户在看到选项释义时,能做出适合自己的选择。

说明

下列选项中,通过"// "注释的行,代表金国步写的内核选项简介中未提及的选项释义。

通过红色"<==="注释的行,代表内核默认开启,本文档推荐关闭的选项,释

义部分会给出关闭的理由。

参考资料

金国步写的内核选项简介

Linux Kernel Database

Linuxsir BBS

优化前后性能对比

项目优化前优化后

内核尺寸 4.1M 1.6M

启动时间(含dhcp+默认init service)22s14s

启动后的内存占用25M22M

APP SPEC测试成绩待测待测

General setup --->

[ ] Prompt for development and/or incomplete code/drivers <===显示尚在开发中或尚未完成的代码和驱动.我不是内核或驱动开发人员。

() Local version - append to kernel release

[ ] Automatically append version information to the version string Kernel compression mode (Bzip2) ---> <===对比默认的Gzip,Bzip2拥有更高的压缩比

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

[*] System V IPC

[*] BSD Process Accounting

[ ] BSD Process Accounting version 3 file format

[ ] Export task/process statistics through netlink (EXPERIMENTAL) <===体验类选项一律关

[ ] Auditing support <===给SELinux提供支持。我的使用场景主要是开发应用程序,不需要那么高的安全性,另外安全总是以牺牲性能为代价RCU Subsystem ---> // 非对称读写锁系统是一种新的kernel锁机制,适用于读多写少环境

RCU Implementation (Classic RCU) ---> <===选择标准的RCU系统,tree-base是给拥有大规模CPU集群的SMP系统用的< > Kernel .config support

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

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

[] Kernel->user space relay support (formerly relayfs) <===在某些文件系统上(比如debugfs)提供从内核空间向用户空间传递大量数据的接口,我目前没有此类应用场景

-*- Namespaces support

[] UTS namespace <===我没有已安装的应用程序要用到UTS ns

[] IPC namespace <===我没有已安装的应用程序要用到IPC ns

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

[*] Optimize for size

[ ] Configure standard kernel features (for small systems) ---> -*- Load all symbols for debugging/ksymoops

[ ] Do an extra kallsyms pass <===除非你在kallsyms中发现了bug并需要报告这个bug才打开该选项

Performance Counters --->

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

[ ] Strip assembler-generated symbols during link

[ ] Disable heap randomization

Choose SLAB allocator (SLUB (Unqueued Allocator)) --->

[ ] Profiling support (EXPERIMENTAL) <===我不是内核开发人员,不需要profile内核

[] Activate markers <===一种运行时状态分析诊断工具,类似instrumentation,资料,我用不到

[ ] Kprobes <===我不是内核开发人员,不需要调试内核

GCOV-based kernel profiling --->

[ ] Enable gcov-based kernel profiling

[*] Enable loadable module support ---> //我很少使用dynamic module loading,所以,下面的选项只留一个unloading即可(默认)--- Enable loadable module support

[ ] Forced module loading

[*] Module unloading

[ ] Module versioning support

[ ] Source checksum for all modules

-*- Enable the block layer --->

--- Enable the block layer

[*] Support for large (2TB+) block devices and files //大硬盘支持,SATA设备如果不选,会发生kernel panic,具体原因未知

[ ] Block layer SG support v4 <===支持通用scsi块设备第4版,我用的是SATA

[ ] Block layer data integrity support

IO Schedulers ---> // IO调度器支持,不同程序可以会选用不同的调度策略,这里我们不要动他

<*> Anticipatory I/O scheduler

<*> Deadline I/O scheduler

<*> CFQ I/O scheduler

Default I/O scheduler (CFQ) --->

Processor type and features --->

[*] Tickless System (Dynamic Ticks) // CPU节能,动态时间片意思是当CPU处于空闲时,降低内核定时器的轮询频率

[*] High Resolution Timer Support //我有的时候要测试Real Time JVM,希望内核能支持这种高响应速度的内核定时器,一般用户可关闭

[*] Symmetric multi-processing support

[ ] Support sparse irq numbering <===如果你想支持大量CPU,又想使用较低的内核内存占用,请启用它。我只有单块CPU

[*] Enable MPS table//让多核/多CPU系统支持ACPI

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

[ ] Support for extended (non-PC) x86 platforms <===我是X86平台,不需要再支持其他平台

[*] Single-depth WCHAN output //跟proc相关的最好不要关

[ ] Paravirtualized guest support --->

--- Paravirtualized guest support

[ ] Memtest

Processor family (Core 2/newer Xeon) ---> <===这里请选择对应的CPU,我是core 2 duo

[ ] Generic x86 support <===通用x86支持,如果你的CPU能够在上述"Processor family"中找到就别选了

[*] HPET Timer Support

(4) Maximum number of CPUs <===我的CPU是双核,算上超线程

HT最多虚拟4颗逻辑CPU,所以我选4,默认是8

[*] SMT (Hyperthreading) scheduler support

[*] Multi-core scheduler support

Preemption Model (Voluntary Kernel Preemption (Server)) ---> <===这里我选择了Server,它最贴近我的使用场景

[*] Reroute for broken boot IRQs //防止同时收到多个boot IRQ(中断)时,系统混乱

[*] Machine Check Exception

[ ] Use legacy machine check code (will go away)

[*] Intel MCE features

[ ] AMD MCE features <===我是intel CPU

[ ] Support for old Pentium 5 / WinChip machine checks

< > Machine check injector support

< > Toshiba Laptop support

< > Dell laptop support

[ ] Enable X86 board specific fixups for reboot <===修正某些旧x86主板的重起bug,这种主板基本绝种了

<*> /dev/cpu/microcode - microcode support

[*] Intel microcode patch loading support

[ ] AMD microcode patch loading support <===我是intel CPU

<*> /dev/cpu/*/msr - Model-specific register support

<*> /dev/cpu/*/cpuid - CPU information support

< > /sys/kernel/debug/x86/cpu/* - CPU Debug support

High Memory Support (4GB) --->

(4096) Low address space to protect from user allocation

[*] Allocate 3rd-level pagetables from highmem<===在内存很多(大于4G)的机器上将用户空间的页表放到高位内存区,以节约宝贵的低端内存,我只虚拟了1G

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

[] Reserve low 64K of RAM on AMI/Phoenix BIOSen<===我不是AMI/Phoenix BIOS

[ ] Math emulation

[ ] MTRR (Memory Type Range Register) support <===我没用X windows

[ ] MTRR cleanup support

[ ] x86 PAT support <===我没用X windows

[ ] EFI runtime service support <===我机器是BIOS引导的,用不到EFI(Extensible Firmware Interface),如果你有兴趣体验EFI,可以在Virtualbox中开启

[] Enable seccomp to safely compute untrusted bytecode<===只有嵌入式系统可以不选

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

Timer frequency (300 HZ) ---> <=== Server场景建议设为300hz,减少内核事件响应速度,提高程序吞吐量,桌面场景可以保持不变[ ] kexec system call <===我没有运行时替换内核的需求

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

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

(0x1000000) Physical address where the kernel is loaded

[] Support for hot-pluggable CPUs <===热拔插CPU,我用不到

[ ] Compat VDSO support

[ ] Built-in kernel command line

Power management and ACPI options --->

[*] Power Management support

[ ] Power Management Debug Support <===不想调试ACPI

[ ] Verbose Power Management debugging

[ ] Suspend to RAM and standby <===我是用来跑server,一般不需要待机

[ ] Hibernation (aka 'suspend to disk') <===我是用来跑server,一般不需要休眠

[*] ACPI (Advanced Configuration and Power Interface) Support --->

[*] Deprecated /proc/acpi files

[*] Deprecated power /proc/acpi directories

[*] Future power /sys interface

[*] Deprecated /proc/acpi/event support

< > AC Adapter <===我不需要从AC与Battery之间做切换

< > Battery <===没有电池

< > Button <===没有Fn快捷键

-*- Video

<*> Fan

<*> Processor

<*> Thermal Zone

(0) Disable ACPI for systems before Jan 1st this year [ ] Debug Statements

< > PCI slot detection driver

< > Smart Battery System

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 <===既允许手动调整cpu频率,也允许用户空间的程序动态的调整cpu 频率(需要额外的调频软件,比如cpufreqd) 我只用performance <> 'ondemand' cpufreq policy governor <=== "周期性的考

察CPU负载并自动的动态调整cpu频率",我只用performance

<> 'conservative' cpufreq governor

*** CPUFreq processor drivers ***

<*> 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

Bus options (PCI etc.) --->

[*] PCI support

PCI access mode (Any) --->

[*] PCI Express support

[*] Root Port Advanced Error Reporting support//硬件驱动

会负责发送错误信息

[ ] PCI Express ECRC settings control

< > PCIE AER error injector support

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

[ ] Enable deprecated pci_find_* API

[ ] PCI Debugging

< > PCI Stub driver

[*] Interrupts on hypertransport devices

[ ] PCI IOV support

[ ] ISA support

[ ] MCA support

< > NatSemi SCx200 support

[ ] One Laptop Per Child support

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

< > Support for PCI Hotplug ---> <===我没有要热拔插PCI设备的需求

Executable file formats / Emulations --->

[*] Kernel support for ELF binaries

[*] Write ELF core dumps with partial segments

< > Kernel support for a.out and ECOFF binaries

<*> Kernel support for MISC binaries

[*] Networking support --->

Networking options --->

<*> Packet socket

[*] Packet socket: mmapped IO

<*> Unix domain sockets

<*> Transformation user configuration interface

< > PF_KEY sockets

[*] 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: DHCP support

[ ] IP: BOOTP support

[ ] IP: RARP support

< > IP: tunneling

< > IP: GRE tunnels over IP

[*] IP: multicast routing

[*] IP: PIM-SM version 1 support

[*] IP: PIM-SM version 2 support

[ ] IP: ARP daemon support

[ ] IP: TCP syncookie support (disabled per default) <===抵抗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 ---> <===高级拥塞控制,如果没有特殊需求(比如无线网络)就别选了

< > The IPv6 protocol ---> <===我暂时没有要支持IPV6的需求

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

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

[ ] Network packet filtering framework (Netfilter) ---> <===我不打算使用防火墙,要用到时再编译进去

< > Asynchronous Transfer Mode (ATM)

< > 802.1d Ethernet Bridging

< > 802.1Q VLAN Support

< > DECnet Support

< > ANSI/IEEE 802.2 LLC type 2 Support

< > The IPX protocol

< > Appletalk protocol support

< > Phonet protocols family

[ ] QoS and/or fair queueing ---> <===通过IPRoute切换网

络设备上的Qos策略,我不打算使用IP路由

[ ] Data Center Bridging support

Network testing --->

[ ] Amateur Radio support ---> <===我没有无线电

< > CAN bus subsystem support --->

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

< > Bluetooth subsystem support --->

[ ] Wireless ---> <===我没有使用无线网卡

< > RF switch subsystem support ---> <===我没有RF切换设备

Device Drivers --->

Generic Driver Options --->

(/sbin/hotplug) path to uevent helper

[*] Prevent firmware from being built

-*- Userspace firmware loading support

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

() External firmware blobs to build into the kernel binary

[ ] Driver Core verbose debug messages

[ ] Managed device resources verbose debug messages <===管理设备资源的冗长调试信息,我不需要

<*> Connector - unified userspace <-> kernelspace linker --->//内核空间与用户空间的信道

[*] Report process events to userspace//报告处理时间给用户空间

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

< > Parallel port support --->

-*- Plug and Play support --->

[ ] PNP debugging messages <===调试信息,老规矩[ ] Block devices ---> <===我没有想要支持的块设备,比如ramdisk,磁盘阵列,CD/DVD刻录等,详见内部选项

[ ] Misc devices ---> <===没有需要支持的杂项设备

< > ATA/ATAPI/MFM/RLL support --->

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

SCSI Transports --->

<> Parallel SCSI (SPI) Transport Attributes <===我没有

SCSI设备

< > FiberChannel Transport Attributes

< > iSCSI Transport Attributes

< > SAS Domain Transport Attributes

< > SRP Transport Attributes

[ ] SCSI low-level drivers --->

< > SCSI Device Handlers --->

< > OSD-Initiator library

Serial ATA (prod) and Parallel ATA (experimental) drivers ---> [*] ATA ACPI Support

[ ] SATA Port Multiplier support <===我只有一枚SATA设备,没有使用多路SATA/SATA Hub的需求。Port Multiplier是南桥芯片提供的一种支持多块SATA设备,并共享总带宽的技术。

<*> AHCI SATA support

< > Silicon Image 3124/3132 SATA support

[*] ATA SFF support

< > ServerWorks Frodo / Apple K2 SATA support

<*> Intel ESB, ICH, PIIX3, PIIX4 PATA/SATA support // Intel ICH,G系列chipset driver

< > Marvell SATA support

< > NVIDIA SATA support

< > Pacific Digital ADMA support

< > Pacific Digital SATA QStor support

< > Promise SATA TX2/TX4 support

< > Silicon Image SATA support

< > SiS 964/965/966/180 SATA support

< > ULi Electronics SATA support

< > VIA SATA support

< > VITESSE VSC-7174 / INTEL 31244 SATA support

< > Initio 162x SATA support

< > ACPI firmware driver for PATA

< > ALi PATA support

< > AMD/NVidia PATA support <===我用的是SATA,取消PATA支持

< > ARTOP 6210/6260 PATA support

< > ATI PATA support

< > CMD64x PATA support

< > CS5510/5520 PATA support

< > CS5530 PATA support

< > CS5536 PATA support

< > EFAR SLC90E66 support

< > Generic ATA support

< > HPT 366/368 PATA support

< > HPT 343/363 PATA support

< > IT8211/2 PATA support

< > JMicron PATA support

< > Compaq Triflex PATA support

< > Marvell PATA support via legacy mode

<> Intel PATA MPIIX support <===我用的是SATA,取消PATA支持

< > Intel PATA old PIIX support <===我用的是SATA,取消PATA支持

< > NETCELL Revolution RAID support

< > Nat Semi NS87410 PATA support

< > Nat Semi NS87415 PATA support

< > Older Promise PATA controller support

< > PC Tech RZ1000 PATA support

< > SC1200 PATA support

< > SERVERWORKS OSB4/CSB5/CSB6/HT1000 PATA support

< > Promise PATA 2027x support

< > CMD / Silicon Image 680 PATA support

< > SiS PATA support

< > VIA PATA support

< > Winbond SL82C105 PATA support

< > Intel SCH PATA support <===我用的是SATA,取消PATA支持

[ ] Multiple devices driver support (RAID and LVM) ---> <===暂时没有要使用Raid(磁盘阵列)和LVM(逻辑卷管理器,添加,删除逻辑分区)的需求

[ ] Fusion MPT device support --->

IEEE 1394 (FireWire) support --->

< > I2O device support --->

[ ] Macintosh device drivers ---> <=== Mac系统硬件设备驱动,没什么好说的,关

[*] Network device support --->

< > Dummy net driver support

< > Bonding driver support

< > EQL (serial line load balancing) support

< > Universal TUN/TAP device driver support

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 内核参数修改

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

Linux之TCPIP内核参数优化 /proc/sys/net目录 所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sys/net目录下内容的修改都是临时的,任何修改在系统重启后都会丢失),例如下面这些重要的参数: 参数(路径+文件) 描述 默认值 优化值 /proc/sys/net/core/rmem_default 默认的TCP数据接收窗口大小(字节)。 229376 256960 /proc/sys/net/core/rmem_max 最大的TCP数据接收窗口(字节)。 131071 513920 /proc/sys/net/core/wmem_default 默认的TCP数据发送窗口大小(字节)。

229376 256960 /proc/sys/net/core/wmem_max 最大的TCP数据发送窗口(字节)。 131071 513920 /proc/sys/net/core/netdev_max_backlog 在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。 1000 2000 /proc/sys/net/core/somaxconn 定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。 128 2048 /proc/sys/net/core/optmem_max 表示每个套接字所允许的最大缓冲区的大小。

20480 81920 /proc/sys/net/ipv4/tcp_mem 确定TCP栈应该如何反映内存使用,每个值的单位都是内存页(通常是4KB)。第一个值是内存使用的下限;第二个值是内存压力模式开始对缓冲区使用应用压力的上限;第三个值是内存使用的上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的BDP 可以增大这些值(注意,其单位是内存页而不是字节)。 94011 125351 188022 131072 262144 524288 /proc/sys/net/ipv4/tcp_rmem 为自动调优定义socket使用的内存。第一个值是为socket接收缓冲区分配的最少字节数;第二个值是默认值(该值会被rmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是接收缓冲区空间的最大字节数(该值会被rmem_max覆盖)。 4096 87380 4011232 8760 256960 4088000 /proc/sys/net/ipv4/tcp_wmem 为自动调优定义socket使用的内存。第一个值是为socket发送缓冲区分配的最少字节数;第二个值是默认值(该值会被wmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是发送缓冲区空间的最大字节数(该值会被wmem_max覆盖)。 4096 16384 4011232

关于Linux 内核中五个主要子系统的介绍

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

LINUX内核源文件介绍以及头文件介绍

LINUX 内核源文件介绍以及头文件介绍 LINUX 内核源文件介绍以及头文件介绍.txt两人之间的感情就像织毛衣,建立的时候一针一线,小心而漫长,拆除的时候只要轻轻一拉。。。。*******************LINUX 内核(0.11)源文件介绍****************** 1、内核源文件放置目录: | |————boot 系统引导汇编程序目录 | |————fs 文件系统目录 | |————include 头文件目录 | |————init 内核初始化程序目录 | |————kernel 内存进程调度、信号处理、系统调用等程序的目录 | |————lib 内核库函数目录 | |————mm 内存管理程序目录 | |————tools 生成内核Image文件的工具程序目录 | |————Makefile文件 | 2、引导启动程序目录boot 包含3个汇编语言文件,是内核源文件中最先被编译的程序。 功能:当计算机家电时引导内核启动,将内核代码加载到内存中,并完成系统初始化工作。 boot | |————bootsect.s 磁盘引导块程序,编译后会驻留在磁盘的第一个扇区中| |————setup.s 读取机器的硬件配置参数,并把内核模式system移动到适当的内存位置处 |

|————head.s 会被编译连接在system模块的最前部分,主要进行硬件设备的探测配置和内存管理页面的配置工作 | 3、文件系统目录fs 包含17个C语言程序 fs | |——buffer.c 管理高速缓冲区 | |——file_table.c 在0.11仅定义了一个文件句柄(描述符)结构数组 | |——ioctl.c 将引用kernel/chr_dev/tty.c中的函数,实现字符设备的IO 控制功能 | |——exec.c 主要包含一个执行程序函数do_execve() | |——fcntl.c 实现文件I/O控制的系统调用函数 | |——read_write.c 实现文件读/写和定位的三个系统调用函数 | |——stat.c 实现了两个获取文件状态的系统调用函数 | |——open.c 主要包含实现修改文件属性和创建与关闭文件的系统调用函数 | |——char_dev.c 主要包含字符设备读写函数rw_char() | |——pipe.c 包含管道读写函数和创建管道的系统调用函数 | |——file_dev.c 包含基于i节点和描述符结构的文件读写函数。 | |——namei.c 主要包括文件系统中目录名和文件名的操作函数和系统调用函数 | |——block_dev.c 包含块数据读和写函数 | |——inode.c 包含针对文件系统i节点操作的函数 | |——truncate.c 用于在删除文件时释放文件所占用的设备数据空间 | |——bitmap.c 用于处理文件系统中i节点和逻辑数据块的位图 |

(完整版)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.360docs.net/doc/221297857.html,/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2 3、下载内核升级工具 (1)下载module-init-tools-3.2.tar.bz2 https://www.360docs.net/doc/221297857.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.360docs.net/doc/221297857.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.360docs.net/doc/221297857.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.360docs.net/doc/221297857.html,/fedora/linux/3/i386/RPMS.core/device-mapper-1.00.19-2.i386.rpm (2.6.18内核和这4个升级工具我都有备份,如果以上下载地址失效,请到https://www.360docs.net/doc/221297857.html,/guestbook留下你的邮箱,我给你发过去)

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内核是什么意思

千锋教育https://www.360docs.net/doc/221297857.html, 精品课程 全程面授 千锋教育-中国IT 职业教育领先品牌 linux 培训学院哪家好 Linux 是常常用来形容整个基于Linux 内核,并且使用工程各种工具和数据库的操作系统。 很受欢迎,使用非常广泛。到了云时代,Linux 炙手可热,掌握。 知识和技能,能找到非常有前景的工作。 既然要学习,最重要的是找到一家好的培训机构。师资,费用,教学质量,这些都要考虑。 2017年5月26日上午,“千锋Linux 云计算运维及开发课程2017版”新品发布会在千锋互联科技有限公司总部北京隆重举行 届时,千锋教育总部的各位领导、千锋教育分校区的校长及网络咨询部、网络运营部代表等各界人士一起出席了“千锋Linux 云计算运维及开发课程2017版”新品发布会。 千锋Linux 云计算课程总监(中国第29位红帽认证架构师,以下简称:杨老师)向各位出席此次发布会的代表详细介绍了“千锋Linux 云计算运维及开发课程2017版”的课程设置体系内容及本年度首期开班招生计划要求。 职业教育领先品牌 千锋教育 linux 培训学院哪家好 ?千锋Linux 云计算培训课程,全方位培养运维工程师 Linux 与微软的“战争”持续已久,谁也不能抢占各自的用户。不过,全球200万名Linux 工程师终于等到了这一天,是时候对微软说“不”了,因为“云计算”时代即将来临,以及廉价的、超小型笔记本电脑正在快速普及。Linux 工程师等待已久了的“云计算”时代。 日前,百资信息科技公司创办人及执行人林政道和香港Linux 商会会长简锦源在广州信息产业周上指出,由于手机、超小型笔记本等移动互联网终端的出现,这种移动终端设备采用Linux 平台作为操作系统已经成为IT 业界的一种发展趋势。因为中国是全球的PC 制造基地和最大的消费市场,其已成为全球推动Linux 发展的最重要的力量之一。 在云计算的初级阶段,我们一定要把握先机,好好学习云计算的相关知识。为此,千锋推出Linux 云计算培训。千锋Linux 云计算培训课程实行免费试学两周,不花一分钱,满意后再报名的政策,全心全意为学员提供服务。讲师方面,千锋Linux 讲师均是拥有多年经验的老师,并特聘一线名企作为技术顾问;课程体系方面,千锋Linux 课程体系是最贴合企业需求的面授课程,并有名企技术顾问定期进行调整;学员福利方面,千锋Linux 为首期报名学员减免1000元学费,并赠送5个月阿里云ECS 云主机。2017年7月17日,千锋Linux 云计算培训等你来战

linux常见技术面试题目

一.填空题: 1. 在Linux系统中,以文件方式访问设备。 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统。 3. Linux文件系统中每个文件用 i节点来标识。 4. 全部磁盘块由四个部分组成,分别为引导块、专用块、 i节点表块和数据存储块。 5. 链接分为:硬链接和符号链接。 6. 超级块包含了i节点表和空闲块表等重要的文件系统信息。 7. 某文件的权限为:drw-r--r--,用数值形式表示该权限,则该八进制数为: 644 ,该文件属性是目录。 8. 前台起动的进程使用 Ctrl+c 终止。 9. 静态路由设定后,若网络拓扑结构发生变化,需由系统管理员修改路由的设置。 10. 网络管理的重要任务是:控制和监控。 11. 安装Linux系统对硬盘分区时,必须有两种分区类型:文件系统分区和交换分区。 13. 编写的Shell程序运行前必须赋予该脚本文件执行权限。 14. 系统管理的任务之一是能够在分布式环境中实现对程序和数据的安全保护、备份、恢复和更新。 15. 系统交换分区是作为系统虚拟存储器的一块区域。 16. 内核分为进程管理系统、内存管理系统、 I/O管理系统和文件管理系统等四个子系统。 17. 内核配置是系统管理员在改变系统配置硬件时要进行的重要操作。 18. 在安装Linux系统中,使用netconfig程序对网络进行配置,该安装程序会一步步提示用户输入主机名、域名、域名服务器、IP地址、网关地址和子网掩码等必要信息。 19. 唯一标识每一个用户的是用户 ID 和用户名。 20 . RIP 协议是最为普遍的一种内部协议,一般称为动态路由选择协议。 21. 在Linux系统中所有内容都被表示为文件,组织文件的各种方法称为文件系统。 22. DHCP可以实现动态 IP 地址分配。 23. 系统网络管理员的管理对象是服务器、用户和服务器的进程以及系统的各种资源。 24. 网络管理通常由监测、传输和管理三部分组成,其中管理部分是整个网络管理的中心。 25. 当想删除本系统用不上的设备驱动程序时必须编译内核,当内核不支持系统上的设备驱动程序时,必须对内核升级。 26 Ping命令可以测试网络中本机系统是否能到达一台远程主机,所以常常用于测试网络的连通性。 27. vi编辑器具有两种工作模式:命令模式和输入模式。 28. 可以用ls –al命令来观察文件的权限,每个文件的权限都用10位表示,并分为四段,

史上最全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内核中的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”等都是该菜单 项的属性:

Linux内核驱动模块编写概览-ioctl,class_create,device_create

如果你对内核驱动模块一无所知,请先学习内核驱动模块的基础知识。 如果你已经入门了内核驱动模块,但是仍感觉有些模糊,不能从整体来了解一个内核驱动模块的结构,请赏读一下这篇拙文。 如果你已经从事内核模块编程N年,并且道行高深,也请不吝赐教一下文中的疏漏错误。 本文中我将实现一个简单的Linux字符设备,旨在大致勾勒出linux内核模块的编写方法的轮廓。其中重点介绍ioctl的用途。 我把这个简单的Linux字符设备模块命名为hello_mod. 设备类型名为hello_cl ass 设备名为hello 该设备是一个虚拟设备,模块加载时会在/sys/class/中创建名为hello_class 的逻辑设备,在/dev/中创建hello的物理设备文件。模块名为hello_mod,可接受输入字符串数据(长度小于128),处理该输入字符串之后可向外输出字符串。并且可以接受ioctl()函数控制内部处理字符串的方式。 例如: a.通过write函数写入“Tom”,通过ioctl函数设置langtype=chinese,通过read函数读出的数据将会是“你好!Tom/n” b.通过write函数写入“Tom”,通过ioctl函数设置langtype=english,通过read函数读出的数据将会是“hello!Tom/n” c.通过write函数写入“Tom”,通过ioctl函数设置langtype=pinyin,通过read函数读出的数据将会是“ni hao!Tom/n” 一般的内核模块中不会负责设备类别和节点的创建,我们在编译完之后会得到.o或者.k o文件,然后insmod之后需要mk nod来创建相应文件,这个简单的例子 中我们让驱动模块加载时负责自动创建设备类别和设备文件。这个功能有两个步骤, 1)创建设备类别文件class_cr eate(); 2)创建设备文件dev ice_create(); 关于这两个函数的使用方法请参阅其他资料。 linux设备驱动的编写相对wi ndows编程来说更容易理解一点因为不需要处理IR P,应用层函数和内核函数的关联方式浅显易懂。 比如当应曾函数对我的设备调用了open()函数,而最终这个应用层函数会调用我的设备中的自定义open()函数,这个函数要怎么写呢, 我在我的设备中定义的函数名是hello_mod_open,注意函数名是可以随意定义,但是函数签名是要符合内核要求的,具体的定义是怎么样请看 static int hello_mod_open(struct inode *, struct file *); 这样就定义了内核中的open函数,这只是定义还需要与我们自己的模块关联起来,这就要用到一个结构 struct file_operations 这个结构里面的成员是对应于设备操作的各种函数的指针。 我在设备中用到了这些函数所以就如下定义,注意下面的写法不是标准ANSI C的语法,而是GNU扩展语法。 struct file_operations hello_mod_fops = { .owner = THIS_MODULE, .open = hello_mod_open,

Linux内核的配置与编译

Computer Knowledge and Technology 电脑知识 与技术第5卷第3期(2009年1月)Linux 内核的配置与编译 胡庆烈 (佛山职业技术学院电子信息工程系,广东佛山528000) 摘要:Linux 是一种实用性很强的现代操作系统,它开放源代码,并允许用户升级其内核。在Redhat 7.2环境中,详细分析了Linux 2.4.18版本的内核配置、编译及新内核切换等操作过程。 关键词:Linux ;内核;配置;编译 中图分类号:TP316文献标识码:A 文章编号:1009-3044(2009)03-0730-02 Configuration and Compiling of Linux Kernel HU Qing-lie (Department of Electonics &Information,Foshan Polytechnic College,Foshan 528000,China) Abstract:Linux is a very practical modern operating system,which opens source coding and allows the user to upgrade its kernel.In the environment of Redhat 7.2,the paper analysis the Linux 2.4.18version of kernel configuration,compiling and new kernel process switch -ing,and so on. Key words:Linux;kernel;configuration;compile 1引言 Linux 是一个自由的多任务操作系统,它以开放源码、对硬件的配置要求低并兼具现代操作系统的优点而得到了迅猛的发展。操作系统的内核是操作系统的核心,它有很多基本的功能,如虚拟内存、多任务、共享库、需求加载、共享的写时拷贝(copy-on-write)、可执行程序和TCP/IP 网络功能等。 用户编译配置Linux 的内核,主要有以下三个原因:1)从现有内核中去除一些不需要的功能,使自定制的内核运行速度更快、更稳定,且具有更少的代码;2)使系统拥有更多的内存,内核部分将不会被交换到虚拟内存中;3)为了提高速度,将某种功能编译到内核中。 2Linux 内核升级的准备 2.1安装一个Linux 操作系统 在编译一个新的Linux 内核之前,首先应在微机中安装一个Linux 操作系统,以便利用该Linux 环境进行新内核的配置和安装。这里是以Redhat 7.2为例,在安装Redhat 7.2的过程中,有两个问题需要注意: 1)硬盘的分区:由于每个硬盘只能拥有4个主分区(Primary Partition ),故用户需要扩展分区,则至少需要腾出一个主分区来划分逻辑分区。在安装Linux 操作系统时,至少需要两个分区,其中本机分区(Linux Native )是供Linux 存放系统文件,而置换分区(Linux Swap )是用作虚拟内存的存取空间。此外,为了和Windows 系统进行文件的复制转换,还应创建一个FAT32类型的分区。 2)安装LILO 启动程序:LILO 是Linux 的核心加载程序,它提供了从DOS 环境启动Linux 的功能,并支持多重启动菜单,让用户选择启动哪一个分区的操作系统。 2.2获取新的Linux 内核源代码 安装了Linux 操作系统后,接下来的工作是寻找新内核的源代码。目前,在Internet 上提供Linux 源代码的站点有很多,如https://www.360docs.net/doc/221297857.html, 就是Linux 内核版本发布的官方网站,用户可以从该站点上获得最新版本的Linux 内核源代码,这里是以linux- 2.4.18版本为例。 2.3对新的Linux 内核源代码包进行解压 由于大部分开放性操作系统的程序都是以压缩文件(tgz 、zip 、gz 与bz2)的形式进行发布,所以从网络上取得这些压缩文件后,都先要解压缩之后才能安装使用。具体过程如下: 1)执行“GNOME Terminal ”,把X Windows System 图形用户界面切换至文件操作模式; 2)执行“#cp /root/linux-2.4.18.tar.gz /usr/src ”,把从网络下载的压缩包复制至/usr/src 处; 3)执行“#tar -zxvf linux-2.4.18.tar.gz ”,对压缩包进行解压,解压文件存放在/usr/src/linux-2.4.18目录中。 2.4清除不正确文件及其它从属文件 为了确保源代码目录中没有不正确的文件和其它从属文件,一般需要运行mrproper 命令进行清理,具体操作如下: #cd /usr/src/linux-2.4.18 #make mrproper 如果是使用刚下载的完整的源程序包进行编译,则可以省略mrproper 操作。但若已反复多次使用这些源程序来进行内核编译的,则应要先运行一下这个命令。 收稿日期:2008-12-11 作者简介:胡庆烈(1969-),男,揭阳惠来人,电子助理工程师,主要从事电子技术的教研工作。 ISSN 1009-3044Computer Knowledge and Technology 电脑知识与技术Vol.5,No.3,January 2009,pp.730-731,735E-mail:kfyj@https://www.360docs.net/doc/221297857.html, https://www.360docs.net/doc/221297857.html, Tel:+86-551-56909635690964

相关文档
最新文档