史上最全linux内核配置详解

史上最全linux内核配置详解
史上最全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设备控制器

Cpuset support,只有含有大量CPU(大于16个)的SMP系统或NUMA(非一致内存访问)系统才需要它。

[ ]enable deprecated sysfs features to support old userspace tools,在某些文件系统上(比如debugfs)提供从内核空间向用户空间传递大量数据的接口,一般不选。

[ ]Kernel->user space relay support (formerly relayfs),内核系统区和用户区进行传递通讯的支持,这个选项在特定文件系统(relayfs)中提供数据接口支持,它可以支持从内核空间到用户空间的大批量数据传递的支持。不清楚可以不选。

[ ]Namespaces support,(有子项)命名空间支持,允许服务器为不同的用户信息提供不同的用户名空间服务,不清楚可以不选。

[ ]Initial RAM filesystem and RAM disk (initramfs/initrd) support,初始RAM的文件和RAM磁盘(initramfs /initrd)支持(如果要采用initrd启动则要选择,否则可以不选),不需要,不用选。嵌入式linux一般不选。

[ ]Optimize for size,优化大小,-Os代替-O2参数,可能会有二进制错误问题,一般不选。

(0)Default panic timeout,添0即可。

[*]Configure standard kernel features (for small systems),特殊内核用到,可以不选,嵌入式linux则必选。

[ ]Enable the Anonymous Shared Memory Subsystem,启用匿名共享内存子系统,不清楚可以不选。

[ ]Enable AIO support,支持AIO(Asynchronous I/O 异步事件非阻塞I/O),(包含aio.h, aio_read,向内核发出读命令,aio_write向内核写命令,详细见‘AIO介绍‘文档),AIO机制为服务器端高并发应用程序提供了一种性能优化的手段。加大了系统吞吐量,所以一般用于大型服务器,一般不用选。

[ ]Kernel Performance Events And Counters(有子项),不清楚,不选。

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

[*]Enable SLUB debugging support,支持SLUB内存分配管理器调试,

[ ]Disable heap randomization,禁用随即head,选不选均可。

Choose SLAB allocator (SLUB (Unqueued Allocator)) --->,选择内存分配管理器,强烈推荐使用SLUB。

[ ]Profiling support,剖面支持,用一个工具来扫描和计算计算机的剖面图,支持系统测评,一般开发人员使用,不选。

[ ]Kprobes,调试人员使用,不选。

GCOV-based kernel profiling --->(有子项),默认即可。

2. Enable loadable module support(可加载模块)

[ ]Forced module loading,强行加载模块,不建议选。

[*]Module unloading,支持模块卸载,必须选上。

[ ]Forced module unloading,强行卸载模块,即使内核认为这样并不安全,也就是说你可以把正在使用中的模快卸载掉。如果你不是内核开发人员或者骨灰级的玩家,不建议选。

[ ]Module versioning suppor,这个功能可以让你使用其它版本的内核模块,除非特殊需要,一般不选。

[ ]Source checksum for all modules,这个功能是为了防止更改了内核模块的代码但忘记更改版本号而造成版本冲突,现在很少使用,不选。

3. Enable the block layer(块设备层)

[*]Support for large (2TB+) block devices and files,仅在使用大于2TB的块设备时需要[*]Block layer SG support v4,通用SCSI设备第四版支持。

[*]Block layer data integrity support,块设备数据完整性支持。

[*]IO Schedulers --->(有子项),IO调度器

[ ]Anticipatory I/O scheduler,抢先式I/O调度器,大多数块设备只有一个物理查找磁头(例如一个单独的SA TA硬盘),将多个随机的小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量.适用于大多数环境,特别是写入较多的环境(比如文件服务器) [ ]Deadline I/O scheduler,期限式I/O调度器,轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库)。

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

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

4. System T ype(arm 占用配置,一般是厂家提供,与第7项代替了原有的Processor type and features)

5. [ ]FIQ Mode Serial Debugger,一般不选。

6. Bus support(总线支持)

PCI support,PCI总线支持,主板上最长用的插槽,最好选上,arm linux可以不选,arm 一般没有PCI总线。

PCCard (PCMCIA/CardBus) support,一般笔记本有这种插槽,笔记本选上,arm linux 不选。

7. Kernel Features(内核特征)

[ ] Tickless System (Dynamic Ticks),非固定平率系统,能让内核运行的更有效率,并且省电,pc下可选,特别是笔记本,arm linux一般不用选。

[ ] High Resolution Timer Support,支持高频率时间发生器,需要硬件兼容,但大多数PC 和ARM都不支持,不选

Memory split (2G/2G user/kernel split) --->,内核与用户空间各占2G,内核空间0-0x7FFFFFFF,用户空间80000000-FFFFFFFF

Preemption Model (No Forced Preemption (Server)) --->,内核抢占模式。普通PC用户一般选2,arm linux 选1就可以。

No Forced Preemption (Server),禁止内核抢占,适合服务器环境。针对于高吞吐量的设计,但有可能延时较长,适用于服务器或科学运算,或向要最大的运算能力,而不理会调度上的延时。

V oluntary Kernel Preemption (Desktop),自愿内核抢占,适合普通的桌面环境。已降低吞吐量为代价,降低内核调度的最大延时,提供更快的应用程序响应,即使系统已经高负荷运转,应用程序仍然能运行的很“流畅”,适合用户桌面环境

Preemptible Kernel (Low-Latency Desktop),主动内核抢占,适合运行实时程序的环

境。更低的吞吐量,进一步降低内核的调度延时,使应用程序更加流畅。

[ ]Compile the kernel in Thumb-2 mode,编译Thumb-2 mode内核,一般不选

[*] Use the ARM EABI to compile the kernel,与下面绑定配置。

[*] Allow old ABI binaries to run with this kernel (EXPERIMENTAL),对于嵌入式系统(jffs2 yaffs2),这两个要选上,否则很可能启动的时候报错(kernel panic- not syncing: Attempted to kill init!)

[ ] High Memory Support (EXPERIMENTAL)(有子项),1G物理内存以下不选,超过1G才选。(配置略有变化,以前的选项是OFF(<1G),4G(>1G && <4G),64G(>4G))。

Allocate 2nd-level pagetables from highmem,1G物理内存以下不选,超过1G(小于4G)才选

Allocate 3nd-level pagetables from highmem,大于4G,选择此项目。

Memory model (Flat Memory) --->,一般选"Flat Memory",其他选项涉及内存热插拔。

[ ] Enable KSM for page merging,允许linux内核识别出包含相同内容的内存页,然后合并这些内存页,将数据整合在一个位置可以多次引用,特殊功能,不用选。

(4096) Low address space to protect from user allocation,默认4096即可

[ ] Use kernel mem{cpy,set}() for {copy_to,clear}_user() (EXPERIMENTAL),不清楚可以不选。

----------------- ----------------- ----------------- -----------------

附:yaffs2 文件系统:Kernel panic - not syncing: Attempted to kill init!

在内核挂载根文件系统时,提示Kernel panic - not syncing: Attempted to kill init!的解决方法:

方法1:

Kernel Features --->

[*] Use the ARM EABI to compile the kernel

[*] Allow old ABI binaries to run with this kernel (EXPERIMENTA)

方法2:

修改busybox的Makefile

修改

CC=$(CROSS_COPILE)gcc

CC=$(CROSS_COPILE)gcc -march=armv4t

一般海思编译器选择此选项,linux-gcc-3.4.5 以下的编译器,不用选,如果用4.3.3(支持EABI的编译器)以上的最好选上。

8. Boot options

一般不需要配置,u-boot会把启动参数传递给内核。如果bootloader没有传参数,可以配置启动参数,类似下面这样:

(0x0) Compressed ROM boot loader base address

(0x0) Compressed ROM boot loader BSS address

(mem=32M console=ttySAC0 root=/dev/ram initrd=0x30800000,4M ramdisk_size=4096 rw) Default kernel command string

9. CPU Power Management

[ ] CPU idle PM support,允许软件控制的空闲进程电源管理,arm linux一般不用选。

10. Floating point emulation(浮点运算,(arm专用)看arm是否支持硬浮点协处理器,支持的话选择VFP,不支持选择NWFPE)

[ ] NWFPE math emulation

[ ] FastFPE math emulation (EXPERIMENTAL)

[*] VFP-format floating point maths

[ ] Advanced SIMD (NEON) Extension support

10. Userspace binary formats(二进制支持)

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

11. Power management options(电源管理)

一般用于笔记本,PC和arm可以不选。

[*] Power Management support,选择此项,下面的项才能可见

[ ] Power Management Debug Support,调试用,不用选

[*] Suspend to RAM and standby,待机到内存,即内存供电而暂时关闭硬盘等外设。

< > Advanced Power Management Emulation,高级电源管理,

[ ] Run-time PM core functionality,允许对运行中接入的I/O设备进行电源管理。

12. Networking suppor t,(协议层的网络支持,socket等,硬件层的支持在Device Drivers 中配置)

Networking options --->,网络选项

<*> Packet socket,这种socket能够让应用程序(tcpdump,iptables)直接与网络设备通讯,而不通过内核中的其他中介协议,最好选上。

<*> Unix domain sockets,一种仅运行于本机上的效率高于TCP/IP的socket,简称Unix socket.许多程序都使用它在操作系统内部进行进程间通信(IPC),比如X Window 和syslog,最好选上。

< > Transformation user configuration interface,为IPsec(可在ip层加密)之类的工具提供XFRM 用户配置接口支持,不清楚可以不选。

[ ] Transformation sub policy support (EXPERIMENTAL),XFRM子策略支持,仅供开发者使用,不清楚不要选。

[ ] Transformation migrate database (EXPERIMENTAL),

[ ] Transformation statistics (EXPERIMENTAL),

< > PF_KEY sockets,用于可信任的密钥管理程序和操作系统内核内部的密钥管理进行通信,IPsec也依赖于它,可以不选。

[ ] PF_KEY MIGRA TE (EXPERIMENTAL),子项,不用选。

[*] TCP/IP networking,TCP/IP协议,必须要选

[*] IP: multicasting,群组广播,选上

[] IP: advanced router,高级路由功能,做路由器的话选上,可以不选。

Choose IP: FIB lookup algorithm (choose FIB_HASH if unsure) (FIB_HASH),子项,不懂的话就选FIB_HASH吧

[ ] IP: policy routing,策略路由,不清楚可以不选。

[ ] IP: equal cost multipath,用于路由的基于目的地址的均衡。不清楚可以不选。

[ ] IP: verbose route monitoring,显示冗余的路由监控信息,可以不选

[ ] IP: kernel level autoconfiguration,内核启动时自动配置IP地址、路由表等,需要从网络启动的无盘工作站需要这个,普通用户不需要。

< > IP: tunneling,IP隧道,将一个IP报文装在另一个IP报文的技术。不清楚不用选。

< > IP: GRE tunnels over IP,基于IP的GRE(通用路由封装)隧道,不清楚可以不选。

[] 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攻击的好东西,要启用它必须同时启用/proc文件系统和"Sysctlsupport", 然后在系统启动并挂载了/proc 之后执行"echo 1>/proc/sys/net/ipv4/tcp_syncookies"命令,不清楚可以不选。

< > IP: AH transformation,IPsec验证头(AH),实现了数据发送方的验证处理,可确保数据既对于未经验证的站点不可用也不能在路由过程中更改,不清楚可以不选。

< > IP: ESP transformation,IPsec封闭安全负载(ESP),实现了发送方的验证处理和数据加密处理,用以确保数据不会被拦截/查看或复制。不清楚可以不选。

< > IP: IPComp transformation,IPComp(IP静荷载压缩协议),用于支持IPsec,不清楚可以不选。

< > IP: IPsec transport mode,IPsec传输模式,常用于对等通信,用以提供内网安全.数据包经过了加密但IP头没有加密,因此任何标准设备或软件都可查看和使用IP头,不清楚可以不选。

< > IP: IPsec tunnel mode,IPsec隧道模式,用于提供外网安全(包括虚拟专用网络).整个数据包(数据头和负载)都已经过加密处理且分配有新的ESP 头/IP头和验证尾,从而能够隐藏受保护站点的拓扑结构,不清楚可以不选。

< > IP: IPsec BEET mode,IPsec BEET模式,不清楚可以不选。

[*] Large Receive Offload (ipv4/tcp),针对TCP 流量的LRO (Large Receive Offload) 支持,选上。

<*> INET: socket monitoring interface,socket监视接口,一些Linux 本地工具(如:包含ss的iproute2)需要使用它,选上

[] TCP: advanced congestion control --->,高级拥塞控制,如果没有特殊需求(比如无线网络)就别选了,内核会自动将默认的拥塞控制设为"Cubic"并将"Reno"作为候补,可以不选。如果网络用处较多,还是选上为好(如网络视频服务器)。关于拥塞控制,见tcp拥塞控制.doc文档。

[ ] TCP: MD5 Signature Option support (RFC2385) (EXPERIMENTAL),不清楚可以不选。

<*> The IPv6 protocol --->,IPV6支持的话,就选上,

[*] Only allow certain groups to create sockets,只允许特定的群体创建socket,选上,没什么坏处。

[*] Network activity statistics tracking,最好选上。

…….网络选项中,后面的不清楚的话可以不选,选上基本几项,网络就可以工作了,有时间进一步深入研究。

-*- Wireless --->(无线,没有无线网卡的话可以不选)

<*> cfg80211 - wireless configuration API,暂时未会,使用默认配置

13. Device Drivers(设备驱动)

Generic Driver Options --->,通用选项

(/sbin/mdev) path to uevent helper,不理解,用的默认值

[ ] Maintain a devtmpfs filesystem to mount at /dev,让devtmpfs文件系统安装在/dev,不清楚可以不选。

[*] Select only drivers that don't need compile-time external firmware,只显示那些不需要内核对外部设备的固件作map支持的驱动程序,除非你有某些怪异硬件,否则请选上。

[ ] Prevent firmware from being built,不编译固件(固化的软件,如bios).固件一般是随硬件的驱动程序提供的,仅在更新固件的时候才需要重新编译。可以不选,但想要更新固件的话就要重新编译内核了。

{*} Userspace firmware loading support,提供某些内核之外的模块需要的用户空间固件加载支持,在内核树之外编译的模块可能需要它,选上。

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

() External firmware blobs to build into the kernel binary

< > Connector - unified userspace <-> kernelspace linker --->,用户空间和内核空间连接器,工作在netlink socket协议的顶层,不清楚可以不选。

<*> Memory Technology Device (MTD) support --->,特殊的存储技术,如常用语数码相机或嵌入式系统的闪存卡,一般是NOR flash和Nand的支持,arm linux必选,PC不用选。

[ ] Debugging,调试模式,不选。

< > MTD tests support,MTD测试支持,不清楚可以不选。

< > MTD concatenating support,连接多个MTD设备,例如使用JFFS2文件系统管理多片Flash的情形。只有一片Flash时不选。

[*] MTD partitioning support,分区支持,选上。

< > RedBoot partition table parsing,使用RedBoot解析Flash分区表,如果需要读取这个分区表的信息选择此项

[*] Command line partition table parsing,允许通过内核命令行传递MTD分区表信息,

< > ARM Firmware Suite partition parsing,使用AFS分区信息

< > TI AR7 partitioning support,AR7分区支持

<*> Direct char device access to MTD devices,将系统中的MTD设备看做字符设备进行读写,需要与驱动同步的。

-*- Common interface to block layer for MTD 'translation layers'

<*> Caching block device access to MTD devices,文件系统挂载后,模拟块设备进行访问。常用于只读文件系统。如果是DiskOnChip使用NFTL方式。

< > FTL (Flash Translation Layer) support,提供对Flash翻译层支持,可以不选

< > NFTL (NAND Flash Translation Layer) support,NAND Flash翻译层支持,可以不选

< > INFTL (Inverse NAND Flash Translation Layer) support,提供INFTL支持,DiskOnChip使用

< > Resident Flash Disk (Flash Translation Layer) support,提供RFD支持,为嵌入式系统提供类似BIOS功能,不清楚可以不选,使用Uboot驱动的话也不用选。

< > NAND SSFDC (SmartMedia) read only translation layer,NAND SSFDC只读翻译

层,不清楚可以不选。

< > SmartMedia/xD new translation layer,不清楚可以不选。

< > Log panic/oops to an MTD buffer,MTD缓冲日志,不清楚可以不选。

RAM/ROM/Flash chip drivers --->,RAM/ROM/Flash芯片驱动,不清楚可以不选。

Mapping drivers for chip access --->,为芯片的访问方式选择Mapping驱动,不清楚可以不选。

Self-contained MTD device drivers --->,自身包含MTD设备驱动,一般不选。

< > Include chip ids for known NAND devices.,NAND flash信息,不用选。

< > NAND Device Support --->,Nand设备支持,有nand的话选上,子项默认配置即可,如果支持Nand,加选这一项就够了。

< > OneNAND Device Support --->,One nand支持,不清楚可以不选。

LPDDR flash memory drivers --->,LPDDR Flash内存驱动,未用,不用选。

UBI - Unsorted block images --->未分类block影响,不清楚不选。

附:配置支持jffs2两步

1)在“memory technology devices(mtd)”选项中选择:

<*>memory technology device(mtd)support

<*>mtd partitioning support

<*>cashing block device access to mtd devices

ram/rom/flash chip drivers--->

<*> detect flash chips by common flash interface(cfi) probe

<*> support for intel/sharp flash chips

mapping drivers for chip access--->

<*> cfi flash device in physical memory map

(0) physical start address of flash mapping

(1000000)physical length of flash mapping

(2)buswidthin octets

<*> intel strataflash device mapped on at91rm9200

这里设置了flash芯片的起始地址、大小以及宽度,比如:起始地址为“0”,大小为“1000000”,即16mb,宽度为“2”,即16字节。然后选中自己加入的“intel strataflash device mapped on at91rm9200”这一项

2)在“file systems”选项中选择:

<*>joumalling flash file system v2(jffs2)support

对于其他功能,可根据自己的实际情况,进行裁减,然后保存退出,接下来编译出操作系统内核映像。(详细见linux支持nor flash.txt 文档)

< > Parallel port support --->,配置并口,如打印机,arm linux可以不用配置

< > PC-style hardware (NEW),

< > AX88796 Parallel Port (NEW),

[ ] IEEE 1284 transfer modes (NEW),

[*] Block devices --->,块设备,一般都不用选,除非有特殊需要

< > Loopback device support,拿文件来模拟块设备,想要mount ios文件的话必须选上,一般不选。

< > Network block device support,网络块设备支持,让PC成为网络块设备的客户端。一般不选

< > Low Performance USB Block driver,低性能USB块设备驱动程序,一般不选。

<*> RAM block device support,RAM块设备支持,子选项保持默认就好了。

< > Packet writing on CD/DVD media,不清楚可以不选。

< > A TA over Ethernet support,不清楚可以不选。

[*] Misc devices --->,混杂设备驱动,一般不选。

< > A TA/A TAPI/MFM/RLL support (DEPRECA TED) --->,不清楚可以不选。

SCSI device support --->,支持u盘的话,需要选上。

< > RAID Transport Class,不清楚可以不选。

<*> SCSI device support,支持u盘选上,子选项默认配置即可。

< > Serial A TA and Parallel A TA drivers --->,SA TA和PA TA支持,没有硬盘的话可以不选。

[ ] Multiple devices driver support (RAID and LVM) --->,特殊服务器管理用到,如LVM,一般用户不会用到,不用选,

[*] Network device support --->,网络设备支持,必选。包括前兆网卡,PPPOE等的支持。

[*] HID Devices --->,HID支持,选上

[*] USB support --->,USB支持,选上

<*> MMC/SD/SDIO card support --->,SD卡支持,选上。

……

其他选项根据需求来。在嵌入式linux中一般IIC SPI等device都自己写驱动,不用选。

14. File systems(文件系统)

<*> Second extended fs support,EXT2文件系统支持。

[*] Ext2 extended attribute,EXT2文件系统支持。

<*> Ext3 journalling file system support,EXT3文件系统支持,子项默认就行。

<*> The Extended 4 (ext4) filesystem ,EXT4文件系统支持,子项默认就行。

……

有JFS(IBM所用)文件系统等,省略,用的不多。

……

[*] Enable POSIX file locking API,使能POSIX文件锁的API,最好选上。

[*] Dnotify support,基于目录的文件变化的通知机制,不选nfsd起不来,比选的。

[ ] Inotify file change notification support,新式的文件体统的变化通知机制,用以替代老旧的Dnotify,选了Dnotify就不要选它了。

[*] Inotify support for userspace,用户空间的Inotify支持,最好选上。(notify 是一个Linux特性,它监控文件系统操作,比如读取、写入和创建)。

<*> FUSE (Filesystem in Userspace) support,允许在用户空间实现一个文件系统,如果打算开发一个自己的文件系统或使用一个机遇FUSE的文件系统,最好打开。

<*> Character device in Userpace support,允许在用户空间实现一个字符设备,

-*- Miscellaneous filesystems --->,杂项文件系统,子项很复杂,主要配置jffs2 和yaffs2文件系统,一般用于嵌入式设备。

[*] Network File Systems --->,网络文件系统,NFS等。

……

其他没有特殊需求可以不选。

15. Kernel hacking(内核hack选项,基本上选Enable __must_check logic和Stacktrace就可以了,有需要再深入研究)

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

[ ] Enable __deprecated logic,不清楚不要选。

[*] Enable __must_check logic,在编译内核的过程中使用"必须检查"的逻辑,禁用它将不会显示某些警告信息,选上。

[ ] Magic SysRq key,不懂,千万别选。

[ ] Strip assembler-generated symbols during link,,不清楚不要选。

[ ] Enable unused/obsolete exported symbols,没用的信息符号,会使内核增大,不选.

[ ] Debug Filesystem,不是内核开发者的别选。

[ ]Run 'make headers_check' when building vmlinux,在编译内核时运行'make headers_check'命令检查内核头文件,当你修改了与用户空间相关的内核头文件后建议启用该选项。

[ ] Kernel debugging,不是内核开发者的别选。

[ ] SLUB debugging on by default,不清楚不要选。

[ ] Enable SLUB performance statistics,不清楚不要选。

[*] Stacktrace,支持调用栈,用于出错排查问题。

[ ] Debug memory initialization,调试内存初始化,不选,

[ ] Check for stalled CPUs delaying RCU grace periods ,检查停止CPU延缓RCU的宽限期,

[ ] Latency measuring infrastructure,不清楚不要选。

[ ] Sysctl checks,不清楚不要选。

[ ] Tracers --->,不清楚不要选。

[ ] Perform an atomic64_t self-test at boot,不清楚不要选。

[ ] Sample kernel code ---> ,不清楚不要选。

[*] Enable stack unwinding support,可以不选(31没选)。

[*] V erbose user fault messages,可以不选(31没选)。

[ ] On-chip ETM and ETB,片上ETM、ETB,不清楚可以不选。

16. Security options(安全选项,一般不需要配置,)

[ ] Enable the /proc/keys file by which keys may be viewed,允许有权限的进程通过/proc/keys读取所有的key,最好不要选。

[ ] Restrict unprivileged access to the kernel syslog,限制未经授权访问内核日志。

[ ] Enable different security models,允许内核选择不同的安全模式,如果未选择按默认处理。

[*] Enable the securityfs filesystem,不清楚可以不选(16没选)。

Default security module (Unix Discretionary Access Controls) --->,默认安全模式。17. Cryptographic API(支持的加密算法)

18. Library routines(库子程序)

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

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

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

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

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

linux 内核参数修改

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

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

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

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

linux内核的网络配置

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

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

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

Linux设置内核参数的方法

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

linux内核IMQ源码实现分析

本文档的Copyleft归wwwlkk所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。 E-mail: wwwlkk@https://www.360docs.net/doc/2e12118453.html, 来源: https://www.360docs.net/doc/2e12118453.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/2e12118453.html,/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 然后使用下面的命令将你的代码树与Linus的代码树最新状态同步: $ git pull 安装内核源代码 内核包有GNU zip(gzip)和bzip2格式。Bzip2是默认和首选格式,因为它的压缩比通常比gzip更好,bzip2格式的Linux内核包一般采用linux-x.y.z.tar.bz2形式的文件名,这里的x.y.z是内核源代码的具体版本号,下载到源代码包后,解压和抽取就很简单了,如果你下载的是bzip2包,运行: $ tar xvjf linux-x.y.z.tar.bz2 如果你下载的是gzip包,则运行: $ tar xvzf linux-x.y.z.tar.gz 无论执行上面哪一个命令,最后都会将源代码解压和抽取到linux-x.y.z目录下,如果你使用Git下载和管理内核源代码,你不需要下载tar包,只需要运行git clone命令,它就会自动下载和解压。 内核源代码通常都会安装到/usr/src/linux下,但在开发的时候最好不要使用这个源代码树,因为针对你的C库编译的内核版本通常也链接到这里的。 应用补丁

史上最全linux内核配置详解

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

Linux内核结构详解教程

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

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

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

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

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

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

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

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

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

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

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

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

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

配置和编译Linux内核

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

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

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

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

相关文档
最新文档