linux内核可从 Kernel.org 上获得,其中偶数版本为稳定版本。
linux内核代码结构:
kernel/ 内核管理的核心代码(系统相关代码在arch/*/kernel中)
arch/ 体系结构相关代码,每个目彔代码一个体系结构
include/ Linux 头文件
include/asm-
include/linux Linux kernel core 头文件
lib/ 内核的库代码,和处理器体系结构相关的代码在arch/*/lib下
drivers/ 系统中驱劢程序代码
fs/ 文件系统
ipc/ IPC(迚程通讯代码)
mm/ 内存管理代码,和处理器体系结构相关的代码在arch/*/mm下
net/ 网络协议代码
scripts/ 编译配置脚本文件
sound/ 声音驱动程序
Documentation/ 内核文档目录
README 概要和编译介绍
Makefile 顶层makefile文件,我们后面的配置要进行修改,也从makefile进行分析
内核配置步骤:
1:cp arch/arm/s5pv210_defconfig .config
2:修改Makefile
ARCH=arm
CROSS_COMPILE=arm-linux-
3:执行配置命令
make menuconfig
然后进入图形配置界面
4:配置完毕,开始编译
make zImage
生成的zImage在arch/arm/boot/ 下。这里说明一下一些内核的格式:
zImage:经过zlib压缩后的Linux内核
uImage:uboot格式的内核文件,是uboot默认引导的内核,如果需要引导zImage还需要自己向uboot添加命令
vmlinux:未经压缩的Linux内核,是elf格式
Image:从vmlinux生成的二进制格式,内核映像文件,没有压缩
内核启动分析:
1:内核自解压(zImage)
2:检查内核是否支持此CPU的ID号
2:初始化一个硬件,也就是静态编译进内核的驱动模块
3:开始挂载根文件系统
4:启动init进程
内核的链接脚本分析:
arch/arm/kernel/vmlinux.lds 可见有:
381 __proc_info_begin = .;
382 *(.proc.info.init)
383 __proc_info_end = .;
384 __arch_info_begin = .;
385 *(.arch.info.init)
386 __arch_info_end = .;
这些段是用来存处理器ID和开发板ID的。从Makefile文件可知内核最先执行的代码是head.S文件位于 arch/arm/kernel/head.S
81 mrc p15, 0, r9, c0, c0
将存储在协处理器中CPU的ID号读到ARM处理器的r9寄存器
82 bl __lookup_processor_type
内核是否支持此CPU的ID号
381 __proc_info_begin = .;
382 *(.proc.info.init)
383 __proc_info_end = .;
用r9中ID号到__proc_info_begin->__proc_info_end中匹配,如果匹配成功,内核继续运行,如果匹配不成功,内核不
启动
85 bl __lookup_machine_type
theKernel(0, 2456, 0x20000100)
r0 r1 r2
用uboot通过r1寄存器传递来板子的2456号,到以下段匹配,如果匹配成功,返回开发板结构体,内核继续执行,如果
不成功,内核不启动
今天就到这里吧!