zoukankan      html  css  js  c++  java
  • Nios II uCLinux/Linux启动分析

    1、 说明

      本文采用的Linux源码版本来自Altera公司FTP。不考虑zImage生成的Compress过程。因为zImage是内核binary文件经过gzip 压缩,并在头部添加解压缩代码实现的。这部分可以在内核代码树的arch/nios2/boot/compress下分析链接脚本及makefile得出。另外,Linux源码中实现了编译MMU版本和无MMU版本的Linux,所以编译无MMU版本时,关于MMU的处理部分可以忽略。可以通过设置JTAG UART或者Altera UART的基址来实现内核开启之前printk的串口输出。

    2、 Head.S

      内核程序最开始的symbol为_start。注意Nios II处理器的初始状态。如果有u-boot的存在情况,r4保存板子信息的结构体地址,r5为SOPC总线上内存的实际物理地址的开始,r6为内存物理地址的结束,r7为u-boot传过来内核启动参数字符串的首地址。  启动过程:关闭中断,清除指令缓存,指令缓存的大小在全局CONFIG中定义。清除数据缓存,有MMU的话初始化MMU,清除BSS段,设置堆栈,调用nios2_boot_init,然后调用start_kernel,开启内核。  这里注意的是,中间夹杂了exception_handler_hook,这个实际上是异常处理入口,注意,虽然Altera允许在Qsys中对Nios II的异常向量表的位置做设置,但是这里要知道,内存的开始地址为CONFIG_MEM_BASE | CONFIG_KERNEL_REGION_BASE,而异常向量表的位置始终为CONFIG_MEM_BASE | CONFIG_KERNEL_REGION_BASE|0x20,所以在Qsys中保持默认就可以了。 inthandler的处理过程在entry.S或entry-nommu.S中,具体处理可以参考Nios II Processor Reference Handbook。

    3、setup.c  

      这个文件中包含了Linux内核和硬件相关的部分的初始化过程需要的程序。接下来分析nios2_boot_init。初始化MMU,解析u-boot传过来的参数,判断魔数,保存参数。然后early_init_devtree,从DTB(由DTS生成)数据中解析需要初始化的设备,SOPC信息等等。然后就开启内核。

  • 相关阅读:
    转载-HTTP
    程序员如何写出杀手级的简历
    23 岁的你,曾处于什么样的状态?现在呢?
    IntelliJ IDEA 14 java项目中添加jar包
    BNR Android Demo学习笔记(一)——CrimeIntent
    Android高仿微信(一)——如何消除启动时的白屏
    Swift2.1 语法指南——高级操作符
    Swift2.1 语法指南——访问控制
    Swift2.1 语法指南——泛型
    Swift2.1 语法指南——协议
  • 原文地址:https://www.cnblogs.com/lyuyangly/p/4852573.html
Copyright © 2011-2022 走看看