MIPS体系内核启动流程详解:压缩内核与entry点剖析

4星 · 超过85%的资源 需积分: 10 3 下载量 198 浏览量 更新于2024-09-13 收藏 137KB DOC 举报
本文档分享了作者在理解和实践Linux内核启动过程中的个人心得,特别针对MIPS体系架构进行了深入探讨。首先,作者强调了在内核开发过程中,生成的三个关键文件vmlinuz、vmlinux和vmlinux32的作用,其中vmlinuz是可引导且压缩的内核文件,被放置在/boot目录下,并通过配置boot.cfg文件来指定启动选项。 当系统上电后,MIPS处理器从地址0xBFC00000开始执行,这个地址对应物理地址0x1FC00000,内核由引导程序负责加载到内存。对于压缩内核,会先执行_arch/mips/boot/compressed/head.S来初始化堆栈并解压内核映像,然后转而执行架构相关的head.S,如在MIPS体系下是(kernel_entry())函数。这个函数主要职责包括初始化内核堆栈、清理BSS段(未初始化的数据区域)、设置参数以及准备启动kernel_init()。 kernel_entry()函数位于kernel文件夹下的head.S,它涉及到了TLB(Translation Lookaside Buffer)初始化和Cache初始化,这是为了确保处理器能有效访问内存。接下来,函数会清理BSS段,这是初始化进程的重要步骤,因为BSS段通常包含了静态变量,清理它们是为了确保内存的正确初始化。 为了为第一个进程,也就是众所周知的init进程做准备,文章提到了`init_thread_union`结构体,它在`include/linux/sched.h`中定义。这个结构体包含了一个`thread_info`结构体实例和一个用于存储栈的数组。THREAD_SIZE宏定义了栈的大小,用于设置每个线程的堆栈空间。 总结来说,作者的内核启动心得主要包括内核引导过程的细节,如引导程序的作用、内核加载和初始化的流程,以及如何通过`kernel_entry()`函数进行体系结构相关的任务,如堆栈初始化和BSS段的清理。同时,文章还介绍了第一个进程特别是init进程的准备工作,通过`init_thread_union`结构体展示了内核为创建第一个进程所作的准备。
232 浏览量
介绍了源码开放的通用启动模块U-Boot 的文件结构,并以Broadcom 公司的4 内核处理器BCM1480 和RMI的32 内核处理器XLR732 为例,阐述了该模块在64 位多内核MIPS体系结构处理器上的移植经验,包括文件的修改、新增、编译、多内核的启动顺序等。   目前,微处理器架构呈百家争鸣之势,x86、PowerPC、MIPS、68x、ARM、Xscale 等架构纷纷在广阔的电子产品市场划分势力范围。x86 架构在PC机领域独领风骚——虽然基于x86的处理器迄今最多集成4 个内核,小于MIPS 架构的32 内核。ARM 架构的处理器统治着消费类电子市场,而在嵌入式领域,尤其是通信产品领域,x86、MIPS、PowerPC 架构的处理器正逐鹿中原。不同特性的处理器架构组成了丰富多彩的计算控制平台,但是无论是什么类型的处理平台,“开门第一件事”都是调用启动代码。   启动代码一般存放在外部的非易失性存储器上,例如Flash芯片。通常不同的处理器,即便基于相同的架构,启动代码往往大相径庭,更何况不同的处理器架构了。例如,BIOS 启动代码适合于x86 的处理器,风河(Windriver)公司的基于VxWorks操作系统的Bootrom 支持PowerPC、ARM、MIPS 等多种处理器。但是,这些启动代码往往源码不开放、开发工具和许可费用昂贵、通用性差。   U-Boot 是德国Denx 软件中心依照GPL 发布的源码公开的公共软件,其全称是Universal Bootloader,即通用启动模块,目前它支持x86、PowerPC、MIPS、ARM 等处理器架构,支持1000 多种嵌入式平台。然而,因为U-Boot 的前身是ppcboot,是一种专用于PowerPC 架构处理器的启动模块,后来Denx 软件中心将其扩展到ARM 处理器等其他架构,所以目前U-Boot支持的平台中,PowerPC 架构的处理器最多。其他架构的处理器平台正在全世界有兴趣的工程师的努力下逐渐完善。   U-Boot 的最新版本是1.1.5,支持4Kc、5Kc、MIPS32AU1x00 等少数MIPS 架构单内核处理器。笔者将U-Boot 扩展到了业界先进的两款64位多内核MIPS处理器上。