Linux2.6.31内核优化选项

Linux2.6.31内核优化选项
Linux2.6.31内核优化选项

Linux 2.6.31内核优化指南

作者:Ken Wu

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

转载本文档请注明原文链接https://www.360docs.net/doc/c79309918.html,/docs/linux-kernel-2-6-31-optimization.htm!

介绍

本文档是一篇关于Linux Kernel 2.6.31的最简优化指南。作者旨在编译一份性能最佳且适合普通Application/Server开发用的内核。(非生产环境)

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

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

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

运行环境

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

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

说明

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

通过红色 "<===" 注释的行,代表内核默认开启,本文档推荐关闭的选项,释义部分会给出关闭的理由。

参考资料

金国步写的内核选项简介

Linux Kernel Database

Linuxsir BBS

优化前后性能对比

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

< > Virtual ethernet pair device

< > General Instruments Surfboard 1000

< > ARCnet support --->

<> PHY Device support and infrastructure ---> <=== PHY (物理层控制芯片) ,里面没有我对应的硬件[*] Ethernet (10 or 100Mbit) --->

-*- Generic Media Independent Interface device support

< > Sun Happy Meal 10/100baseT support

< > Sun GEM support

< > Sun Cassini support

[ ] 3COM cards <=== 我不是3COM网卡

[] "Tulip" family network device support ---> <=== 不是 Tulip 系列

< > HP 10/100VG PCLAN (ISA, EISA, PCI) support

[*] EISA, VLB, PCI and on board controllers

<*> AMD PCnet32 PCI support // 这是我的网卡驱动

< > AMD 8111 (new PCI lance) support

< > Adaptec Starfire/DuraLAN support

< > Broadcom 440x/47xx ethernet support

< > nForce Ethernet support <=== 不是 nForce 网卡

< > Intel(R) PRO/100+ support <=== 不是 Intel 网卡

< > Myson MTD-8xx PCI Ethernet support

< > National Semiconductor DP8381x series PCI Ethernet support

<> PCI NE2000 and clones support (see help) <=== 与NE2000无关

<> RealTek RTL-8129/8130/8139 PCI Fast Ethernet Adapter support <=== 不是 RealTek 网卡

[ ] Use PIO instead of MMIO

[ ] Support for uncommon RTL-8139 rev. K (automatic channel equalization)

[ ] Support for older RTL-8129/8130 boards

[ ] Use older RX-reset method

< > RDC R6040 Fast Ethernet Adapter support

< > SiS 900/7016 PCI Fast Ethernet Adapter support

< > SMC EtherPower II

< > SMSC LAN9420 PCI ethernet adapter support

< > Sundance Alta support

< > TI ThunderLAN support

< > Micrel KSZ8842

< > VIA Rhine support

< > Atheros L2 Fast Ethernet support

[] Ethernet (1000 Mbit) ---> <=== 如果你是千M卡,请自行选择

[] Ethernet (10000 Mbit) ---> <=== 如果你是万M卡,请自行选择

<> Token Ring driver support ---> <=== IBM的令牌环网,用以太网的忽略

Wireless LAN --->

*** Enable WiMAX (Networking options) to see the WiMAX drivers ***

USB Network Adapters --->

[ ] Wan interfaces support --->

<> FDDI driver support <=== 光纤卡驱动,相信没几个人能用上这玩意

< > PPP (point-to-point protocol) support

< > SLIP (serial line) support

[ ] Fibre Channel driver support

[ ] ISDN support --->

< > Telephony support --->

Input device support --->

-*- Generic input layer (needed for keyboard, mouse, ...)

-*- Support for memoryless force-feedback devices

<> Polled input device skeleton <=== 一种周期性轮询硬件状态的驱动,去掉后没什么副作用*** Userland interfaces ***

-*- Mouse interface

[ ] Provide legacy /dev/psaux device

(1024) Horizontal screen resolution

(768) Vertical screen resolution

< > Joystick interface

<> Event interface <=== 将输入设备的事件存储到/dev/input/eventX供应用程序读取,没相关需求

< > Event debugging

*** Input Device Drivers ***

-*- Keyboards --->

[] Mice ---> <=== 我是用纯字符终端,如果你想用X window,请自行选择

[] Joysticks/Gamepads ---> <=== 游戏设备

[] Tablets ---> <=== 平板PC

[] Touchscreens ---> <=== 触摸屏

[] Miscellaneous devices ---> <=== 杂七杂八的驱动,扬声器,笔记本扩展按键等

Hardware I/O ports --->

Character devices --->

-*- Virtual terminal

[] Support for binding and unbinding console drivers // 在某些系统上可以使用多个控制台驱动程序(如framebuffer控制台驱动程序),该选项使得你可以选择其中之一,我一般只用默认的虚拟终端

[] /dev/kmem virtual device support <=== 支持/dev/kmem设备,很少用

[] Non-standard serial port support <=== 我没有非标准的串口设备

Serial drivers --->

< > 8250/16550 and compatible serial support <=== 兼容一些老式的串口设备,我一般不用

*** Non-8250 serial port support ***

< > Digi International NEO PCI Support

-*- Unix98 PTY support

[ ] Support multiple instances of devpts

[ ] Legacy (BSD) PTY support

< > IPMI top-level message handler --->

<*> Hardware Random Number Generator Core support

< > Timer IOMEM HW Random Number Generator support

<*> Intel HW Random Number Generator support

<> AMD HW Random Number Generator support <=== 我是intel主板

< > AMD Geode HW Random Number Generator support <=== 我是intel主板

<> VIA HW Random Number Generator support <=== 我是intel主板

<> /dev/nvram support <=== 直接存取CMOS,太危险,关

< > Siemens R3964 line discipline

< > Applicom intelligent fieldbus card support

< > ACP Modem (Mwave) support

< > NatSemi PC8736x GPIO Support

< > NatSemi Base GPIO Support

< > AMD CS5535/CS5536 GPIO (Geode Companion Device)

< > RAW driver (/dev/raw/rawN)

[*] HPET - High Precision Event Timer

[ ] Allow mmap of HPET

< > Hangcheck timer

-*- I2C support ---> // 感知硬件状态,比如温度,风扇转速

[ ] SPI support --->

PPS support --->

[ ] GPIO Support --->

< > Dallas's 1-wire support --->

-*- Power supply class support --->

<*> Hardware Monitoring support --->

-*- Generic Thermal sysfs driver --->

[*] Watchdog Timer Support --->

Sonics Silicon Backplane --->

Multifunction device drivers --->

[ ] Voltage and Current Regulator Support --->

< > Multimedia support --->

Graphics support --->

<> /dev/agpgart (AGP Support) ---> <=== 用字符终端的忽略

<> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) ---> <=== 用字符终端的忽略

<> Lowlevel video output switch controls <=== 用字符终端的忽略

<> Support for frame buffer devices ---> <=== 用字符终端的忽略

[] Backlight & LCD device support ---> <=== 用字符终端的忽略

Display device support --->

Console display driver support --->

[*] Enable Scrollback Buffer in System RAM

(64) Scrollback Buffer Size (in KB)

<> Sound card support ---> <=== 用不到声卡

[] HID Devices ---> <=== 用不到人力工程学设备

[] USB support ---> <=== 这个选项,对于跑物理机建议开启,因为有可能你的键盘是USB的,我是跑虚拟机的,所以关了

< > MMC/SD/SDIO card support --->

< > Sony MemoryStick card support (EXPERIMENTAL) --->

[] LED Support ---> <=== 发光二级管,应该是跟显示器相关的驱动,由于我运行的是虚拟机,所以我选择关闭

[ ] Accessibility support --->

< > InfiniBand support --->

[*] EDAC (Error Detection And Correction) reporting ---> // 硬件故障repoting

<*> Real Time Clock --->

[*] DMA Engine support --->

[ ] Auxiliary Display support --->

< > Userspace I/O drivers --->

TI VLYNQ --->

[ ] Staging drivers --->

[] X86 Platform Specific Device Drivers ---> <=== 一些笔记本的驱动,我没有相关设备

Firmware Drivers --->

< > BIOS Enhanced Disk Drive calls determine boot disk

< > BIOS update support for DELL systems via sysfs

< > Dell Systems Management Base Driver

[*] Export DMI identification via sysfs to userspace // 将BIOS里的DMI区信息导出到用户空间,部分系统管理工具可能会用到[ ] iSCSI Boot Firmware Table Attributes

File systems --->

< > Second extended fs support

<> Ext3 journalling file system support <=== 我使用的是ext4 FS

<*> The Extended 4 (ext4) filesystem

[ ] Enable ext4dev compatibility

[*] Ext4 extended attributes

[*] Ext4 POSIX Access Control Lists

[] Ext4 Security Labels <=== 取消 SELinux 支持

[ ] JBD (ext3) debugging support

[ ] JBD2 (ext4) debugging support

< > Reiserfs support

< > JFS filesystem support

< > XFS filesystem support

< > OCFS2 file system support

[*] Dnotify support

[*] Inotify file change notification support

[*] Inotify support for userspace

[] Quota support <=== 磁盘配额支持,限制某个用户或者某组用户的磁盘占用空间,暂时没这个需求,你可以把它编译成模块

< > Kernel automounter support

<*> Kernel automounter version 4 support (also supports v3) <=== 我没有要挂载远程文件系统的需求

< > FUSE (Filesystem in Userspace) support

Caches --->

CD-ROM/DVD Filesystems --->

<> ISO 9660 CDROM file system support <=== 在虚拟机内,我不用CDROM

< > UDF file system support

DOS/FAT/NT Filesystems --->

< > MSDOS fs support <=== 我没有微软fs的设备

< > VFAT (Windows-95) fs support <=== 我没有微软fs的设备

< > NTFS file system support

Pseudo filesystems --->

[] Miscellaneous filesystems ---> <=== 如果你没有其他FS的支持需求,关

[] Network File Systems ---> <=== 如果你没有其他NFS的支持需求,关

Partition Types --->

[ ] Advanced partition selection <=== 如果不是和其他系统共存,可以不选

-*- Native language support ---> // 选上Chinese

Kernel hacking --->

[] Show timing information on printks <=== 在printk的输出中包含时间信息,可以用来分析内核启动过程各步骤所用时间 , 我不需要debug内核

[ ] Enable __deprecated logic

[*] Enable __must_check logic

(2048) Warn for stack frames larger than (needs gcc 4.4)

[] Magic SysRq key <=== 一种通过快捷键控制系统方式,除非你非常清楚这个选项,官方不推荐选择

[ ] Enable unused/obsolete exported symbols

-*- Debug Filesystem

[ ] Run 'make headers_check' when building vmlinux

[] Kernel debugging <=== 内核调试,关

[ ] Enable SLUB performance statistics

[] Compile the kernel with frame pointers <=== 还是跟内核开发有关

[ ] Delay each boot printk message by N milliseconds

< > torture tests for RCU

[ ] Check for stalled CPUs delaying RCU grace periods

< > Self test for the backtrace code

[ ] Force extended block device numbers and spread them

[ ] Fault-injection framework

[ ] Latency measuring infrastructure

[*] Sysctl checks

[] Tracers ---> <=== 内核跟踪分析器

[] Remote debugging over FireWire early on boot <=== 启动过程中,允许远程调试内核

[ ] Enable dynamic printk() support

[ ] Enable debugging of DMA-API usage

[ ] Sample kernel code --->

[ ] Filter access to /dev/mem

[] Enable verbose x86 bootup info messages <=== 在内核镜像解压缩阶段输出启动信息,关闭后相当于无声启动(Slient Bootup) -*- Early printk

[] Early printk via EHCI debug port <=== 允许printk通过EHCI调试端口输出内核日志,调试的一律关

[ ] Use 4Kb for kernel stacks instead of 8Kb

[ ] Enable IOMMU stress-test mode

IO delay type (port 0x80 based port-IO delay [recommended]) --->

[*] Allow gcc to uninline functions marked 'inline'

Security options ---> <=== 安全特性,我选择全关,当然,这些选项不会影响你的日常开发,办公

[] Enable access key retention support <=== 关闭

[] Enable different security models <=== 关闭

[ ] Enable the securityfs filesystem

[] File POSIX Capabilities <=== 关闭

[ ] Integrity Measurement Architecture(IMA)

<*> Cryptographic API ---> // 加密API,这部分选项会根据此前的优化自动调整,默认即可

[] Virtualization ---> <=== 我的系统已经运行在虚拟机中,不需要再支持虚拟化

Library routines ---> // 库子程序,这部分选项会根据此前的优化自动调整,默认即可

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

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

1、实验目的 针对Ubuntu10.04中,通过下载新的内核版本,并且修改新版本内核中的系统调用看,然后,在其系统中编译,加载新内核。 2、任务概述 2.1 下载新内核 https://www.360docs.net/doc/c79309918.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内核,超详细解析子系统

探究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.360docs.net/doc/c79309918.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.360docs.net/doc/c79309918.html, 红联Linux论坛: https://www.360docs.net/doc/c79309918.html,/bbs 红联Linux 论坛大全,所有致力点都体现在这 https://www.360docs.net/doc/c79309918.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内核IMQ源码实现分析

本文档的Copyleft归wwwlkk所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。 E-mail: wwwlkk@https://www.360docs.net/doc/c79309918.html, 来源: https://www.360docs.net/doc/c79309918.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.360docs.net/doc/c79309918.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”可以使文

简析linux内核的内核执行流程图

简析linux核的执行流程 ----从bootsect.s到main.c(核版本0.11)Linux启动的第一阶段(从开机到main.c) 3个任务: A、启动BIOS,准备实模式下的中断向量表和中断服务程序。 B、从启动盘加载操作系统程序到存。 C、为执行32的main函数做过渡准备。 存变化如下: ①、0xFE000到0xFFFFF是BIOS启动块,其中上电后第一条指令在0xFFFF0。 ②、而后0x00000到0x003FF总共1KB存放中断向量表,而接下去的地址到0x004FF共256B存放BIOS数据,从0x0E05B 开始的约8KB的存中存放中断服务程序。 ③、利用BIOS中断0x19h把硬盘的第一扇区bootsect.s的代码加载到存中,即0x07c00处,后转到该处执行。 ④、将bootsect.s的代码复制到0x90000处。 ⑤、利用中断0x13h将setup.s程序加载到存0x90200处。 ⑥、再将剩余的约240个扇区的容加载到0x10000~0x2EFFF 处。 ⑦、开始转到setup.s处执行,第一件事就利用BIOS提供的中断服务程序从设备上获取核运行的所需系统数据并存在0x90000的地址处,这时将原来bootsect.s的代码覆盖得只剩2Byte的空间。

⑧、关中断并将系统代码复制到0x00000处,将原来放在这里的中断向量表与BIOS数据区覆盖掉,地址围是 0x00000~0x1EFFF。同时制作两表与两寄存器。 ⑨开地址线A20,寻址空间达到4GB,后对8259重新编程,改变中断号。 ⑩、转到head.s(大小是25K+184B)执行,执行该程序完后是这样的: 0x00000~0x04FFF:页目录与4个页表,每一项是4KB,共20KB;0x05000~0x05400:共1KB的空间是软盘缓冲区; 0x05401~0x054b8:共184B没用; 0x054b9~0x05cb8:共2KB的空间存中断描述符表; 0x05cb9~0x064b8:共2KB的空间存全局描述符表; 之后就是main函数的代码了! 第二阶段、从main.c函数到系统准备完毕阶段。 第一步:创建进程0,并让进程0具备在32位保护模式下载主机中的运算能力。流程是: 复制根设备和硬盘参数表(main.c中的102、110、111行) 物理存规划格局(main.c的112行~126行,其中有 rd_init函数定义在kernel/ramdisk.c中,此函数用于虚拟盘初始化;而mem_init函数是用于存管理结构初始化,定义在mem/memory.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内核技术

一、教学目的 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内核启动 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 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/c79309918.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/c79309918.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/c79309918.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/c79309918.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/c79309918.html,/fedora/linux/3/i386/RPMS.core/device-mapper-1.00.19-2.i386.rpm (2.6.18内核和这4个升级工具我都有备份,如果以上下载地址失效,请到https://www.360docs.net/doc/c79309918.html,/guestbook留下你的邮箱,我给你发过去)

《边学边干-Linux内核指导》学习笔记一

写在前面的话:刚毕业,找的工作是嵌入式开发,在学校自学了几年Windows平台下的C/C++开发,可现在工作是在Linux平台下,所以一切都要从头开始(当然语言基础还是有用的)。从操作系统应用开始学,再到开发,经过几个月的学习,现在基本能胜任工作。在这个几个月之中,自己感觉大学里面荒废了太多时间。在学校时,总是认为学的东西没用(我想大概现在很多在校的学生还是这么认为吧),到现在才感觉自己基本功不够扎实。所以,决定好好研究一下linux内核,一方面是为了对操作系统有更深层次的理解,另一方面在研究内核的同时,学习linux底层编程。我用的教材是浙江大学出版社《Linux内核情景分析》上下册还有就是现在看的这本。希望有相同兴趣的朋友多多交流。 第一章了解Linux内核 这一章是对Linux内核的总体概括,我把我学会以及自己在实践过程中的理解并且觉得比较容易用的到东西分别叙述如下: 一、重新编译内核 1. 首先要确认你系统里面是否有linux的源代码,在Linux安装的时候有选项是否安装源代码。如果你在安装时没有选,不用担心,你可以到https://www.360docs.net/doc/c79309918.html,/pub/linux/kernel 去下载你的系统对应的内核源代码。 2. 下载以后当然是将源代码包解压到你所要放的目录下,书上用的是下面两个命令: #mv linux-2.4…. your directory #tar zxvf linux-2.4… 3.配置内核 配置内核的过程可以分为以下几步: a.清除目录下所有配置文件和先前生成核心时产生的中间文件,在你的源代码目录执行如下命令: #make mrproper 注意:Kernel HOWTO对上面这个命令是这样解释的: `make mrproper' 将会做更广泛的`清除' 工作.这个动作有时候是必须的,所以你可能会希望在每次修补的时候执行它.`make mrproper' 还会将你的配置文件杀掉,所以如果你认为它重要的话应该先做一备份(在.config). b.对内核进行配置,有以下几种方法可供选择: #make config(基于文本的传统界面) #make menuconfig(基于文本的选单式配置界面,书中推荐的方式) #make xconfig(基于图形的配置界面) #make oldconfig(用于在原来配置的基础上作些小的修改) 注:我在我的机器上(redhat 9)执行make oldconfig这个命令的时候,系统根本没有让我配置内核,而是自动执行了配置,那我要怎么样用这个命令来配置内核呢,希望知道的朋友可以告诉我。在Kernel Howto中对这个命令的解释是: make oldconfig' 会尝试由一旧的配置文件来配置你的核心.它会为你执行`make config'。如果你还未曾编译过核心或没有旧的配置文件,那么你可能不该做这个,因为你几乎确定会更改缺省的配置。 c.对每一个配置项,用户有三种选择: “Y”——将该功能编译进内核; “N”——不将该功能编译进内核; “M”——将该功能编译成可以在需要时动态插入到内核中的模块。 d.编译内核和模块 接下来需要运行下面两条命令:

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内核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;

相关文档
最新文档