Linux内核
一、Linux内核
Linux内核的源码树早已有超过20000个文件,超过600万行代码。这还是几年前的数据。
须要工具、根文件系统、Linux应用程序共同构建一个可用的系统。
1、内核版本
当前的Linux内核版本为2.6.28。版本命名规则如下:
VERSION=2
PATCHLEVEL=6
SUBLEVEL=28
EXTRAVERSION=
NAME=
内核包含的文件:/include/linux/version.h
2、内核结构
Linux内核的布局、组织和结构
(1)顶楼源目录
顶楼内核源目录包含下述子目录:
archcryptoDocumentationdriversfsincludeinitipckernel
libmmnetscriptssecuritysoundusr
这种子目录又包含几级带源码、makefiles和配置文件的子目录。至今为止linux运维最佳实践,Linux内核源码树的最大分支为drivers子目录。drivers子目录包含Linux内核所支持的以太网卡、USB控制器、大量的硬件设备。
arch子目录是第二大分支linux内核开发社区,包含了对超过20种的处理器构架的支持。
顶楼目录还包括顶楼makefile、隐藏的配置文件、各种信息文件。
顶楼内核源码树还包括两个重要的buildtarget:System.map和vmlinux。
(2)编译内核
Linux内核太大,剖析内核是一项令人失望的任务。多线程、优先级(preemption)降低了剖析的复杂度。实际上,就算是定位入口点,也是一项挑战。理解二补码映像的有效方式是检测其建立组件。
内核构建系统的输出形成几个普通文件(commonfiles)以及特定构架的二补码模块。
普通文件与构架无关。System.map和vmlinux是其中的两个普通文件。
System.map在内核调试期间有用,它包含了易读的内核符号和各自的地址列表。
vmlinux是特定构架的可执行格式的ELF文件。它由每位构架的顶楼内核makefile形成。
假如内核被编译,且带符号调试信息,这么内核会包含vmlinux映像。
虽然它是可执行的ELF文件,它还是不会直接引导。
以ARMXScale构架的IndelIXP425网路处理器为例,使用如下命令:
makeARCH=armCROSS_COMPILE=xscale_be-ixp4xx_defconfig
此命令不完善内核,为XScale构架打算源码树,包括此构架和处理器的初始缺省配置。
CROSS_COMPILE=xscale_be-让make强制使用XScaletoolchain构建内核映像
ARCH=arm让make强制使用内核源码树的arm分支
(3)正确的内核——vmlinux
LD/arch/arm/boot/compressed/vmlinux
vmlinux文件是实际的正确内核。它是一个完全独立的、巨大的单个映像。在vmlinux二补码文件中,没有未解决的外部引用存在。
(4)内核映像组件
vmlinux映像由几个二补码映像组合而成。
vmlinux映像组件的描述
------------------------------------------
组件描述
------------------------------------------
arch/arm/kernel/head.o指定的内核构架启动代码
init_task.o内核所需的初始化线程和任务
init/built-in.o主要的内核初始化代码
usr/built-in.o内建的initramfs映像
arch/arm/kernel/built-in.o指定构架的内核代码
arch/arm/mm/built-in.o指定构架的显存管理代码
arch/arm/common/built-in.o指定构架的类属(generic)代码
arch/arm/mach-ixp4xx/built-in.o指定机器的代码,一般是初始化
arch/arm/nwfpe/built-in.o指定构架的浮点仿真代码
kernel/built-in.o内核自身的通用组件
mm/built-in.o显存管理的通用组件代码
ipc/built-in.o进程间通讯,比如SysVIPC
security/built-in.oLinux安全组件
lib/lib.a各类帮助函数文档
arch/arm/lib/lib.a指定构架的通用工具,随构架而变
lib/built-in.o通用内核帮助函数
drivers/built-in.o所有内建驱动器可载入模块
sound/built-in.o声音驱动器
net/built-in.oLinux网路
.tmp_kallsyms2.o符号表
------------------------------------------
甚少直接启动内核映像,内核映像通常是被压缩了的,bootloader负责解压映像。
Makefile和Kconfig文件驱使内核配置和完善过程。
二、内核构建系统
Linux内核配置和构建系统相当复杂。使用Kbuild来构建内核系统。
Linux2.6内核使用Kbuild来编译内核模块。
Kbuild才能编译内核树目录内的内核模块,也才能编译内核树目录外的内核模块。
Kbuild文件倾向于"Makefile"这个名子,"Kbuild"也是可以用的。但若果"Makefile"和"Kbuild"同时出现的话,使用的将会是"Kbuild"文件。
1、Dot-config文件
Dot-config文件是用于构建Linux内核映像的配置“蓝图”。可编辑配置文件,命名为.config,定位在顶楼源目录,驱使内核的构建。
makemrproper命令会删掉配置文件,且无任何提示。由于其目标是返回内核源码树为纯洁的、无配置的状态。它包括从源码树移除所有配置数据,即删掉你的.config。
Linux的“.”+扩充名的文件是Linux的隐藏文件。
Linux2.6的.config文件片断
------------------------------
...
#USBsupport
CONFIG_USB=m
#CONFIG_USB_DEBUGisnotset
#MiscellaneousUSBoptions
CONFIG_USB_DEVICEFS=y
#CONFIG_USB_BANDWIDTHisnotset
#CONFIG_USB_DYNAMIC_MINORSisnotset
#USBHostControllerDrivers
CONFIG_USB_EHCI_HCD=m
#CONFIG_USB_EHCI_SPLIT_ISOisnotset
#CONFIG_USB_EHCI_ROOT_HUB_TTisnotset
CONFIG_USB_OHCI_HCD=m
CONFIG_USB_UHCI_HCD=m
...
------------------------------
要理解.config文件,须要理解Linux内核的基本面。
Linux有庞大的结构,整个内核作为一单个静态链接可执行而编译。但是,还可能编译和“增量链接”源集到单个对象模块linux内核开发社区,动态插入到正在运行的内核。
通常的设备驱动常常采用此方式。在Linux中,这称为可载入模块,亦称为设备驱动器。内核引导后,调用指定的应用程序,插入可载入的模块进正在运行的内核。
2、配置编辑器
初期的内核使用一个简单的命令行驱动脚本来配置内核——>很笨拙
内核配置子系统使用了几个图形化的后端。新的Linux内核版本包括了10个配置目标。
概述如下,可从makehelp见到:
-config使用命令行程序更新当前配置
-menuconfig使用基于菜单的程序更新当前配置
-xconfig使用基于Qt的后端更新当前配置
-gconfig使用基于GTK的后端更新当前配置
-oldconfig以提供的.config更新当前配置
-randconfig用随机回答所有选项的新配置
-defconfig使用所有缺省选项的新配置
-allmodconfig选择模块的新配置
-allyesconfig所有选项均回答yes的新配置
-allnoconfig所有选项均回答no的新配置
使用makegconfig可显示GTK图形的配置编辑窗口。
大多数内核软件模块也要读.config配置文件。在构建过程期间红旗linux下载,.config文件被装入一个C头文件,坐落/include/linux目录下,名为:autoconf.h。
Linux的autoconf.h文件片断:
------------------------------
/*
*USBsupport
*/
#defineCONFIG_USB_MODULE1
#undefCONFIG_USB_DEBUG
/*
*MiscellaneousUSBoptions
*/
#defineCONFIG_USB_DEVICEFS1
#undefCONFIG_USB_BANDWIDTH
#undefCONFIG_USB_DYNAMIC_MINORS
/*
*USBHostControllerDrivers
*/
#defineCONFIG_USB_EHCI_HCD_MODULE1
#undefCONFIG_USB_EHCI_SPLIT_ISO
#undefCONFIG_USB_EHCI_ROOT_HUB_TT
#defineCONFIG_USB_OHCI_HCD_MODULE1
#defineCONFIG_USB_UHCI_HCD_MODULE1
------------------------------