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信息等等。然后就开启内核。
Nios II uCLinux/Linux启动分析的更多相关文章
- 关于Nios II的启动分析(转载)
原文地址:http://hi.baidu.com/goatdai/item/cc33671545d89243e75e06ad 常用到的存储器包括SDRMA.SRAM.FLASH.Onchip_memo ...
- Linux内核分析作业7:Linux内核如何装载和启动一个可执行程序
1.可执行文件的格式 在 Linux 平台下主要有以下三种可执行文件格式: 1.a.out(assembler and link editor output 汇编器和链接编辑器的输出) ...
- linux内核分析作业3:跟踪分析Linux内核的启动过程
内核源码目录 1. arch:录下x86重点关注 2. init:目录下main.c中的start_kernel是启动内核的起点 3. ipc:进程间通信的目录 实验 使用实验楼的虚拟机打开shell ...
- Linux内核分析之可执行程序的装载和启动
一.内容分析 1.可执行文件的创建 (1)预处理阶段 预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行相应的转换,预处理过程还会删除程序中的注释和多余的空白字符.其中预处理指令主 ...
- Linux内核分析——跟踪分析Linux内核的启动过程
万子惠 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 实验部分 menu程序: cd LinuxKernel/ qemu -kernel linux-3.18.6/a ...
- Linux内核分析之跟踪分析Linux内核的启动过程
一.实验过程 使用实验楼虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-/arch/x86/boot/bzImage -initrd rootfs.img ...
- Linux内核启动分析过程-《Linux内核分析》week3作业
环境搭建 环境的搭建参考课件,主要就是编译内核源码和生成镜像 start_kernel 从start_kernel开始,才真正进入了Linux内核的启动过程.我们可以把start_kernel看做平时 ...
- 从linux启动到rootfs的挂载分析
简单的来说,根文件系统包括虚拟根文件系统和真实根文件系统.在Kernel启动的初始阶段,首先去创建虚拟的根文件系统,接下来再去调用do_mount来加载真正的文件系统,并将根文件系统切换到真正的文件系 ...
- Linux内核启动分析
张超<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 我的代码可见https://www.shiyanlo ...
随机推荐
- linux的rpm教程
1.rmp查询 1.1 软件包详细信息 rpm -qpi httpd-2.4.25-9.fc27.x86_64.rpm 系统将会列出这个软件包的详细资料,包括含有多少个文件.各文件名称.文件大小.创 ...
- java的装饰设计模式
类似python中的装饰器. 示例: public class Test5 { public static void main(String[] args) { Worker w = new Work ...
- python_迭代器和生成器
迭代器和生成器 1.迭代器 特点: 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容 不能随机访问集合中的某个值 ,只能从头到尾依次访问 访问到一半时不能往回退 便于循环比 ...
- 小知识-为什么Linux不需要磁盘碎片整理
转载至:http://beikeit.com/post-495.html 简单译文: 这段linux官方资料主要介绍了外部碎片(external fragmentation).内部碎片(inter ...
- (翻译)在 Xamarin 应用中使用 MongoDB
原文地址:https://blog.xamarin.com/write-apps-using-mongodb-xamarin/ 在设计应用时,最重要的决定之一就是要使用什么类型的数据库. 不久之前,这 ...
- 前端读者 | 嗨,你知道this吗
本文来自 @position_柚子,地址:https://juejin.im/post/5995c7a76fb9a0247a60c407 在平时的代码中,相信大家经常用到 this,可是你真的明白此 ...
- No module named '_Sqlite3' 解决方法
今晚,在学习Python的时候,(学习链接:http://yidao620c.github.io/blog/20150420/simpleblog-01.html(搭载自己的博客案例)): 想为系统生 ...
- HDU 1561 The more, The Better【树形DP/有依赖的分组背包】
ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物.但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先 ...
- CodeForces 738A Interview with Oleg
模拟. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #includ ...
- Oracle实例,具体运用
Oracle关键字的使用 使用insert 添加数据: INSERT INTO 表名 VALUES (加入对应的数); COMMIT; INSERT INTO p_emp VALUES('TO ...