一.BootLoader
功能简单描述,屏蔽所有中断,初始化GPIO,初始化SDRAM,拷贝BootLoader到SDRAM中,加载内核映像文件,跳转到C程序,初始化串口,初始化以太网,等待外部输入,无外部输入,跳转到内核入口处。有外部输入,进入BootLoader模式,进行命令解释循环。
a) 部分头文件
处理器PXA255的地址空间为线性地址空间,处理器各部分寄存器是模块化的,可定义各功能模块的基地址,通过基地址加偏移地址的方式访问各功能寄存器。
config.h
SRAM(FLASH)的基地址为:0x0000000
SARM(FLASH)的地址大小为:0x02000000(32M)
DRAM(SDRAM)的基地址为:0xA0000000
DRAM(SDRAM)的地址大小为:0x020000000×2(64M)
Start_xscale.h
中断控制器的基地址:INTERRUPT_CONTROL_BASE―0x40D00000
时钟管理控制器的基地址:CLOCK_MANAGER_BASE-0x41300000
通用GPIO的基地址:GPIO_BASE-0x40E00000
内存控制器的基地址:MEM_CTL_BASE-0x48000000
b) 内存分配脚本文件
ld-xscale – ELF文件格式
c) 汇编语言初始化部分
d) C语言代码部分
二.内核代码部分
a) 汇编语言部分
2.4.18-rmk7-pxa1-XSBasearcharmkernelhead-armv.S文件根据2.4.18-rmk7-pxa1-XSBaseincludelinuxautoconf.h文件的配置执行相关的操作,设置处理器的模式,查询处理器的类型,创建页表等操作后跳转到2.4.18-rmk7-pxa1-XSBaseinitmain文件的start_kernel处
b) 内核入口部分
C语言代码部分对系统作第二次初始化
内核加锁
输出Linux版本信息(printk(linux_banner))
设置与体系结构相关的环境(setup_arch())
提取并分析核心启动参数(从环境变量中读取参数,设置相应标志位等待处理,(parse_options(
使用"arch/alpha/kernel/entry.S"中的入口点设置系统自陷入口(trap_init())
使用alpha_mv结构和entry.S入口初始化系统IRQ(init_IRQ())
核心进程调度器初始化(包括初始化几个缺省的Bottom-half,sched_init())
时间、定时器初始化(包括读取CMOS时钟、估测主频、初始化定时器中断等,time_init())
控制台初始化(console_init())
模块初始化init_modules()
剖析器数据结构初始化(prof_buffer和prof_len变量)
核心Cache初始化(描述Cache信息的Cache,kmem_cache_init())
延迟校准(获得时钟jiffies与CPU主频ticks的延迟,calibrate_delay())
内存初始化(设置内存上下界和页表项初始值,mem_init())
创建和设置内部及通用cache("slab_cache",kmem_cache_sizes_init())
创建页cache(内存页hash表初始化,pageable_cache_init())
检查体系结构漏洞(对于alpha,此函数为空,check_bugs())
SMP机器其余CPU(除当前引导CPU)初始化(对于没有配置SMP的内核,此函数为空,smp_init())
启动init过程(创建第一个核心线程,调用init()函数,原执行序列调用cpu_idle() 等待调度,rest_init())
三.文件系统部分
文件系统与内核相联系,在内核的配置中menuconfig中的General Setup中的配置
根据根文件系统下的linuxrc脚本文件可知,它启动了init, init进程是系统所有进程的起点,内核在完成核内引导以后,即在本线程(进程)空间内加载init程序,它的进程号是1。
init程序需要读取/etc/inittab文件作为其行为指针,inittab按照initdefault启动runlevel 3。进入rc3.d目录。在rc3.d目录下有一系列以S开始的文件,表示启动的意思,如果以K字母开头,表示Kill的意思。而这些以S开始的文件会链接到其他的脚本文件,会执行相关的链接的脚本文件。如:
rc.sysinit,network,pcmcia等脚本文件。
在init执行完成以后,会执行/bin/login文件,确认用户名以及密码以后,把控制权交给shell,进入shell命令,执行相关的配置文件.profile等,最后$出现在虚拟终端上,整个启动过程结束。