Chinaunix首页 | 论坛 | 博客
  • 博客访问: 209146
  • 博文数量: 32
  • 博客积分: 306
  • 博客等级: 二等列兵
  • 技术积分: 337
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-15 10:02
文章分类
文章存档

2013年(21)

2011年(11)

我的朋友

分类: LINUX

2011-11-23 12:13:00

今天的学习内容是:
linux内核分析和配置:
1)内核源码目录结构分析
2)Makefile , Kconfig文件分析
3)Linux启动过程分析
4)配置,编译内核
 
ARM 体系结构的源码网址: www.arm.linux.org.uk/developer
 
移植内核首先把 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) |
给主人留下些什么吧!~~