今天的学习内容是:
linux内核分析和配置:
1)内核源码目录结构分析
2)Makefile , Kconfig文件分析
3)Linux启动过程分析
4)配置,编译内核
移植内核首先把 linux内核源码文件linux-2.6.31.tar.bz2 放到linux下,解压tar xjvf linux-2.6.31.tar.bz2 之后 进入文件目录打开Makefile
VERSION = 2 (主版本号)2.6
PATCHLEVEL = 6
SUBLEVEL = 31 (次版本号)
EXTRAVERSION = (扩展版本号)
NAME = Man-Eating Seals of Antiquity
内核源码目录结构:
arch 目录下 存放的是 与体系结构相关的代码。 对应于每个支持的体系结构 ,
有一个相应的子目录如:
x86、arm 等,每个体系结构子目录下包含几个 主要子目录:
.boot 启动内核所需的平台特有代码
.kernel 体系结构特有特征(如SMP)的实现
.mm 与体系结构相关的内存管理代码
.lib 与体系结构相关的通用函数的实现
fs 目录下是 linux所支持的文件系统的代码,每个支持的文件系统有相应的子目录,
如carmfs,yaffs,jffs2等
drivers 所有设备驱动程序代码,它占整个内核代码量一半以上,每一个子目录对应一类驱动程序
include 包含编译内核所需要的大部分头文件,与平台无关的头文件放在include/linux子目录下,
平台相关的头文件 如 include/asm-arm
init 内核初始化代码 (内部有个main.c , 第二部分的代码是从此运行的)
kernel 内和管理核心代码
lib 库函数代码
mm 内存管理代码
net 网络支持代码
sound 音频设备驱动代码
scripts 用于配置内核的脚本文件
documentation 内核相关文档
有了源码 后 要相移植得先对内核进行配置 **************************
内核配置系统的基本结构:
Makefile 文件分析
Makefile的作用 :
1) 决定编译哪些文件
2) 怎样编译这些文件
3) 按顺序连接这些文件
Makefile : 分布在linux 内核源码中得Makefile定义了linux内核编译的规则;
配置工具:
make config 字符界面
make menuconfig Ncurses图形界面
make xconfig Xwindows 图形界面
配置文件:
.config :在配置内核时生成,根据 .config来决定使用哪些Makefile
make config 等 具体详解参看 内核配置博文
另外以点 大头的文件都是隐藏文件 。 如 : .config 要更改属性才能看到
打开.config 文件可以看到具体内容。
如:
CONFIG_HAVE_KERNEL_BZIP2=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_KERNEL_GZIP=y
# CONFIG_KERNEL_BZIP2 is not set
# CONFIG_KERNEL_LZMA is not set
=y 的 表示被编译的 。 用#注释掉的 是 不参加编译的
另外这些配置选项都是在子目录下的Makefile下定义的
如:
# These are (potentially) separate modules
obj-$(CONFIG_ACPI_AC) += ac.o
obj-$(CONFIG_ACPI_BUTTON) += button.o
obj-$(CONFIG_ACPI_FAN) += fan.o
obj-$(CONFIG_ACPI_VIDEO) += video.o
这是在/linux-2.6.31/drivers/acpi/Makefile 中的一部分定义
如果CONFIG_ACPI_AC 这个选项 在.config中=y 即:
CONFIG_ACPI_AC=y
则Makefile 就会编译连接 ac.o 这个文件
编译过程就是从顶级的Makefile 开始 然后调用 各级子目录下的Makefile文件进行编译
在顶级Makefile中 :
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
ARCH 是指定CPU 的架构 我们可以修改为 ARCH ?= arm 来指定我们的arm架构
# ===========================================================================
# *config targets only - make sure prerequisites are updated, and descend
# in scripts/kconfig to make the *config target
# Read arch specific Makefile to set KBUILD_DEFCONFIG as needed.
# KBUILD_DEFCONFIG may point out an alternative default configuration
# used for 'make defconfig'
include $(srctree)/arch/$(SRCARCH)/Makefile
这条代码就是进入arch目录下的arm 文件夹下执行 Makefile 文件
# Objects we will link into vmlinux / subdirs we need to visit
init-y := init/
drivers-y := drivers/ sound/ firmware/
net-y := net/
libs-y := lib/
core-y := usr/
这里把目录分成了5类,然后依次的进入这些目录执行他们的Makefile
则在各自子目录下的Makefile中如:
obj-$(CONFIG_ACPI_AC) += ac.o (当在.config中CONFIG_ACPI_AC=y )
则 obj-$ 会把 ac.c 文件编译成 ac.o文件
Kconfig 文件 分析
Kconfig 文件就是个配置选项的菜单,一般在每个目录下都有个Kconfig文件 ,在执行#make menuconfig
命令时,就会查找所有的Kconfig 文件生成menuconfig的配置菜单。
配置菜单的生成 我们可以在 /drivers 目录下的 Kconfig 中可以看到各级菜单生成的代码
各个级别的子目录下的Kconfig 里都有其下属目录菜单生成代码(同上一样)
Kconfig 中有 5种变量:
bool 有两种取值 y , n y 表示编译 n 是不编译。如:
config MTD_PARTITIONS
bool "MTD partitioning support" 引号中的是 菜单上显示的名字
tristate 有三种取值 y , n , m 。 m 代表编译成模块
string 字符串
hex 十六进制数据
int 十进制数据
# drivers/mtd/nand/Kconfig
menuconfig MTD_NAND
tristate "NAND Device Support"
depends on MTD
select MTD_NAND_IDS
(depends on MTD意思是只有上层的MTD菜单被选中时,才会出现"NAND Device Support"这个选项的菜单)
阅读(1664) | 评论(0) | 转发(0) |