Linux内核源代码是公开的,标准内核可以在以下网站上得到:
ftp://ftp.kernel.org/pub/
http://www.kernel.org/pub/
针对某一类型CPU,同样有相应的patch
ARM:
ftp://ftp.arm.linux.org.uk/
Linux内核源代码包含以下子目录:
>> arch-这个目录包含与体系结构相关的代码。对每个支持的体系结构(MIPS,ARM,386,等等),在"arch"下有一个相应的子目录。每个体系结构的子目录下有四个主要的子目录:
>> kernel, 包含与体系结构相关的内核代码
>> mm, 包含体系结构相关的内存管理代码
>> lib, 包含与体系结构相关的库代码 (vsprintf 等等)
>> mach- (目标平台目录), 包含基于此体系结构平台相关的代码
>> documentation-包含内核的文档
>> drivers-包含设备驱动代码。每类设备有相应的子目录,如char, block, net, 等等
>> fs-包含文件系统的代码。对每个支持的文件系统(ext2, proc,JFFS2 等等) 有相应的子目录
>> include-包含内核的头文件,对每一种体系结构,分别有相应的子目录asm-*
>> init-包含内核的初始化代码
>> kernel-包含内核代码
>> lib-包含内核的库代码
>> mm-包含内核管理代码
>> net-包含和网络相关代码
内核编译
oldconfig
default configuration
arch/cpu/defconfig
#make oldconfig
config
text based interactive configuration
#make config
menuconfig
Text based menu driven
#make menuconfig
xconfig
X GUI based (tcl/tk)
#make xconfig
save configuration
.config
Source code generation based on new configuration
menu creation
arch/cpu/config.in and other Config.in files
下面是和嵌入式有关的linux操作 我的学业~
编译环境(2.4.x):.config, Makefile,ld脚本
Make dep
Make menuconfig
Make zImage
Make modules
Make dep建立文件的依赖关系
make menuconfig来配置内核(根据各个目录的config.in来决定,最开始的config.in是最顶层的Makefile配置下的ARCH目录下的config.in),config.in生成最顶层的.config,提供给每个目录下的Makefile来决定变异那些文件。
最顶层的Makefile决定总体的一下变量,最重要的有:
ARCH := arm
…
HOSTCC = gcc
HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
…
CROSS_COMPILE = arm-linux-
每个目录下的Makefile来决定哪些模块被编译:
O_TARGET := misc.o
export-objs := mcp-core.o mcp-sa1100.o ucb1x00-core.o
obj-$(CONFIG_MCP) += mcp-core.o
obj-$(CONFIG_MCP_SA1100) += mcp-sa1100.o
obj-$(CONFIG_MCP_UCB1200) += ucb1x00-core.o
obj-$(CONFIG_MCP_UCB1200_AUDIO) += ucb1x00-audio.o
obj-$(CONFIG_MCP_UCB1200_TS) += ucb1x00-ts.o
include $(TOPDIR)/Rules.make
Arch/arm/Makefile也很总要,决定一些总要的参数
ifeq ($(CONFIG_CPU_32),y)
PROCESSOR = armv
TEXTADDR = 0xC0008000
LDSCRIPT = arch/arm/vmlinux-armv.lds.in
endif
内核的链接:arch/arm/vmlinux-armv(o).lds.in, vmlinux.lds
/* ld script to make ARM Linux kernel
* taken from the i386 version by Russell King
* Written by Martin Mares <
mj@atrey.karlin.mff.cuni.cz>
*/
OUTPUT_ARCH(arm)
ENTRY(stext)
SECTIONS
{
. = TEXTADDR;
.init : { /* Init code and data */
_stext = .;
__init_begin = .;
*(.text.init)
__proc_info_begin = .;
*(.proc.info)
…
http://blog.lupaworld.com/p_w_picpath/code_editor/rm.gif
__init_end = .;
}
/DISCARD/ : { /* Exit code and data */
*(.text.exit)
*(.data.exit)
*(.exitcall.exit)
}
.text : { /* Real text segment */
…
熟悉内核编译环境
熟悉.config文件
a.最顶层的config.in文件(arch/arm目录下,arm由最顶层的Makefile决定)
b.各级目录下的config.in文件
c.最后生成的.config文件(arch/arm/def-configs/)
熟悉Makefile文件
a.最顶层的Makefile文件
b./arch/arm/Makefile
c.其它目录的Makefile(主要是driver目录下的)
熟悉vmlinux.lds文件 (arch/arm/目录下)