powerpc-linux内核start_kernel之前启动分析(1)-开门见山

本文介绍了在 PowerPC 上进行 Linux 内核移植时,针对 PowerPC 460s 处理器核的启动分析。文章详细讲解了在启动过程中,内核如何初始化 TLB 和异常处理,特别是 MMU 的常开状态对启动流程的影响,以及如何确保运行地址与链接地址一致。通过对 _start 汇编代码的解析,阐述了 PowerPC 与 ARM 在启动初期地址配置和跳转的差异。
摘要由CSDN通过智能技术生成

前段时间做了公司内核从arm处理器到一款powerpc处理器的移植(公司处理器换核,前期用FPGA仿真板进行了芯片验证和软件移植),借这个机会也学习了powerpc处理器的一些知识,对powerpc的内核启动也有所了解。
完成了arm版本内核start_kernel之前汇编分析,也想尝试写几篇文章对powerpc的启动进行分析,与大家分享。

在分析之前,首先罗嗦几句,这次移植工作之前我从来没有接触过powerpc相关的知识,因此是作为一个初学者来完成这次移植工作的。
初学者要完成一次完整的内核移植,我觉得首要一点是认真学习该处理器核的芯片手册,以我移植的处理器(ppc460s)为例,首先要找到该处理器核的芯片手册,不像SOC芯片手册会介绍SOC的外设资源,处理器核芯片手册介绍的是处理器内部逻辑以及特性,手册需要重点关注的几点有:
(1)地址空间管理,包括上电取指地址,MMU如何配置使用等
(2)寄存器定义,包括通用寄存器,特殊功能寄存器
(3)中断异常的定义,异常向量表如何定义和使用
(4)cache管理
(5)处理器核reset后如何初始化,处理器核手册会给出一些标准的步骤
(6)处理器核特定资源介绍,如ppc460s核内集成了timer,有指定指令进行操作

以上所述都是处理器核的特性,肯定会在处理器核的手册中进行介绍,学习了这些,再对基于该处理器核的SOC地址空间布局(看SOC手册,地址空间分布是由处理器核外的地址总线仲裁决定的)加以学习,对这款处理器就有了内在的了解。
当然处理器指令集也是一项处理器核特性,各架构处理器表面看最大的区别就是指令集不一样,但是我个人感觉指令集并不需要特别的关注,只需要看懂指令含义,会写最基本的指令即可,指令是我们操纵处理器的工具。处理器的核心区别还是在上述的几点。
每种架构处理器都会有些通用的处理器特性定义,也有专门的资料来介绍,可以与处理器核手册配合着看,如powerpc的BOOKE,MIPS的《see mips run》,ARM的《ARM指令体系架构》等。这些资料都对处理器的上述特性做了一些通用的定义。
linux内核在start_kernel之前的大部分工作都是对处理器核的一个初始化工作,将整个内核启动过程全部了解后你就会发现,内核启动其实就是一个处理器SOC由内到外进行初始化的过程!
了解了处理器核的特性,接下来就可以进行内核移植,内核移植的大体思路我总结了一篇文章,连接如下:
http://blog.csdn.net/skyflying2012/article/details/43281565

linux内核的入口是在_start,对于如何根据链接脚本来判断内核入口函数可以看我的arm内核启动分析第一篇文章:
http://blog.csdn.net/skyflying2012/article/details/41344377

kernel版本:3.4.55
处理器:ppc460s

今天首先来分析_start的前几行汇编,ppc460s属于ppc的44x系列,根据arch/powerpc/kernel/Makefile,_start在arch/powerpc/kernel/head_44x.S中。powerpc各个系列处理器差别较大,因此head文件也有好多个,本文只分析460s所属的head_44x.S,首先来看前几行汇编:

_ENTRY(_stext);
_ENTRY(_start);
    /*
     * nop指令在后面会被abatron_pteptrs页表指针替换掉
     * 
     */
    nop
    mr  r31,r3      /* save device tree ptr */
    li  r24,0       /* CPU number */

    //没有选RELOCATABLE,不走该分支
#ifdef CONFIG_RELOCATABLE
/*
 * Relocate ourselves to the current runtime address.
 * This is called only by the Boot CPU.
 * "relocate" is called with our current runtime virutal
 * address.
 * r21 will be loaded with the physical runtime address of _stext
 */
    bl  0f              /* Get our runtime address */
0:  mflr    r21             /* Make it accessible */
    addis   r21,r21,(_stext - 0b)@ha
    addi    r21,r21,(_stext - 0b)@l     /* Get our current runtime base */

    /*
     * We have the runtime (virutal) address of our base.
     * We calculate our shift of offset from a 256M page.
     * We could map the 256M page we belong to at PAGE_OFFSET and
     * get going from there.
     */
    lis r4,KERNELBASE@h
    ori r4,r4,KERNELBASE@l
    rlwinm  r6,r21,0,4,31           /* r6 = PHYS_START % 256M */
    rlwinm  r5,r4,0,4,31            /* r5 = KERNELBASE % 256M */
    subf    r3,r5,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值