本文主要参考韦东山老师的《嵌入式Linux应用开发完全手册》,基于Linux-2.6.32.2源码。
概要:本文内容包含Linux源码树结构分析、Linux Makefile分析、Kconfig文件分析、Linux内核配置选项分析。这些知识是为了理解内核文件的组织形式,为具体移植内核做知识准备。
1. Linux源码树结构分析
对Linux源码树下个子目录内包含的内容进行列表罗列:
目录 | 简介 |
---|---|
arch | 体系结构相关的代码,每一个子目录代表一种架构 |
block | 块设备的通用函数 |
crypot | 常用加密和散列算法、压缩和CRC校核算法 |
fs | Linux支持的文件系统,每一个子目录代表一种文件系统 |
include | 内核头文件:基本头文件(include/linux )、驱动或功能部件头文件(例:include/mtd )、体系相关头文件(linux/asm-arm ) |
driver | 所有的驱动程序,每一个子目录代表一类驱动程序 |
init | 内核的初始化程序,其中main.c中的start_kernel函数是内核引导后执行的第一个函数 |
ipc | 进程间通信代码 |
kernel | 内核管理的核心代码,与体系相关的代码在/arch/$(ARCH)/kernel |
lib | 内核用到的库函数,与处理器相关的库函数位于/arch/$(ARCH)/lib |
mm | 内存管理代码,与处理器体系相关的位于/arch/$(ARCH)/mm |
net | 与网络相关的代码,每一个子目录对应于网络的一个方面 |
security | 安全、密钥相关的代码 |
sound | 音频相关的驱动程序 |
usr | 用来制作一个压缩的cpio归档文件:initrd的镜像,它可以作为内核启动后挂载的第一个文件系统 |
script | 用于配置、编译内核的脚本文件 |
Document | 内核文档 |
2.Linux Makefile分析
主要从三个方面讲解:编译哪些文件、如何编译文件、如何连接文件
最权威的参考资料:/Documentation/Kbuild/makefiles.txt
Linux Makefile的分类
名称 | 描述 |
---|---|
顶层Makefile | 总体上控制着内核的编译 |
arch/$(ARCH)/Makefile | 决定哪些和体系相关的代码参加编译 |
.config | 配置文件,内核配置时产生,所有的Makefile都根据这个文件编译内核(包括顶层的和各分成的Makefile) |
scripts/Makefile.* | Makefile公用的通用规则、脚本等 |
*/Makefile | 负责该目录下文件的编译 |
- 编译哪些文件
顶层Makefile决定哪些目录中的文件将编译进内核
init-y := init/
drivers-y := drivers/ sound/ firmware/
net-y := net/
libs-y := lib/
core-y := usr/
...
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
顶层Makefile将13个子目录分成5个部分:init-y、drivers-y、net-y、libs-y、core-y
顶层通过下列语句包含和体系架构有关的Makefile。仔细观察可以看到/arch子目录的根目录下是没有Makefile文件的,而其它各子目录都是有Makefile。
include $(srctree)/arch/$(SRCARCH)/Makefile
...
SRCARCH := $(ARCH)
所以在编译内核之前先要确定ARCH
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
...
SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
-e s/arm.*/arm/ -e s/sa110/arm/ \
-e s/s390x/s390/ -e s/parisc64/parisc/ \
-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
-e s/sh[234].*/sh/ )
默认的ARCH不是我们需要的,所以要进行修改
ARCH ?=