本人屌丝硬件男一枚,操作系统、软件等完全“家里蹲”大学毕业。但是从看到WRTnode的第一天起,就被它骚气的土豪金吸引,即刻励志转型做码农,愿为WRTnode抛头颅洒热血,在一条“不归路”上越走越远……(PS:WRTnode诞生至今才几天啊,能走多远啊你……)
——————————不割不快乐———————————————-
既然是一枚门外抠脚大汉,所以要把自己学习的过程暴露给众大神,接收四方批评,方能炼成城墙脸皮。
所以我将把自己学习WRTnode的过程全部记录在本版中,心中顿时有一种四处贴小广告的快感!反正版主也不能把我禁言了 hahahaha~~
—————————-把大象搬入冰箱供需几步————————————–
精简版答案:供需三步。把冰箱门打开;把¥#@#%*&@
(有多远滚多远,这么老的梗还用你说啊)
WRTnonde版答案:
第一步:找到冰箱,并打开冰箱门;
第二步:把冰箱里面东西该扔扔,该整理整理,给大象腾地儿;
第三步:置备小推车,起重机等大小设备来搬大象,最好再在冰箱里按几个Camera记录整个搬运过程;
第四步:找到大象;
第五步:把大象搬到冰箱中;
第六步:把冰箱门关上。
我们为什么突然开始搬大象了?
因为WRTnode上跑的是openwrt的系统,是一个标准的发行版linux系统。对于之前就玩玩8位机的本丝见到如此高大上的操作系统那就好比我看到了大象一般。
第一个问题就来了:这个仅仅有一块MT7620N的SoC,一块64MB的DDR2,一块16MB的MX25L12835F SPI Flash,一些DCDC和外设电路,是如何把linux系统运行起来的呢?(这应该是能跑linux的嵌入式系统的最小系统了吧)
如果把linux内核看作大象,那么DDR2的RAM就是冰箱,而搬大象到冰箱里的工作,就是bootloader的工作。
——————————bootloader————————————
Bootloader的概念是什么谷歌上写的很清楚。Bootloader的主要运行任务就是将内核映像从嵌入式系统掉电数据可保存的存储设备(硬盘、Flash、EEPROM、SDCard、U盘、网络服务器)读到RAM中,然后跳转到RAM上内核的入口点去运行操作系统。
PS:为什么要读到RAM中?
计算机系统的存储结构时刻都体现了cache的模型:
cpu内部高速cache是cpu外部的内存的cache
内存是系统“硬盘”的cache
“硬盘”是网络数据的cache
越靠近CPU的存储设备读取速度越快,容量越小,每单位数据量价格越高。
第一、RAM的数据是掉电即失的,所以开始它只能存在掉电数据保留的存储器上。
第二、内核程序一定要放到速度较快的RAM中才能够高效的运行。(在低速的八位机前后台(裸机)嵌入式系统中,程序是直接写在MCU内部的rom上然后直接读取运行的,因为对rom读取的速度并不会制约到整个系统运行速度,这样的程序也称固件。但是当系统运行速度提高后(如32为ARM上运行速度在70MHz左右)直接在rom上读程序并执行会因为读取速度慢而必须在读指令间插入空指令等待。所以对于WRTnode,其主频在600MHz,直接在Flash上运行程序无疑是不可取的。)
Bootloader的主要任务
设计程序入口指针。
建立异常中断处理向量。
初始化CPU各种模式的堆栈和寄存器。
初始化系统中要使用的各种片内外设备。
初始化目标板。
引导操作系统。
Bootloader安装的位置通常在系统复位后最初始的地址位置。
Bootloader过程
Bootloader启动大多数都分为两个阶段。依赖于CPU体系结构的代码通常都放在stage1中,通常用汇编实现。Stage2中常用C语言实现,实现复杂的功能。
Stage1
硬件设备初始化,通常只初始化最基本的设备:如内存控制器、串口设备等。
为加载stage2准备内存空间。
复制Bootloader的stage2(有些bootloader好像是把stage1和2的内容都复制过去的,此处不明,望大神指点)到内存空间。
设置堆栈。
跳转至stage2的入口点。
Stage2
初始化本阶段要使用到的硬件设备:如以太网、USB等。
检测系统内存映射。
将内核映像和根文件系统映像从固体存储器上读到内存空间中。
设置内核启动参数。
启动内核。
从bootloader的整个运行过程来看,就是WRTnode搬大象的过程,至于把大象搬到冰箱里面后大象要做什么事情,bootloader是完全没法控制的。也就是说,当bootloader引导内核启动后,内核并不需要bootloader的帮助就可以完成整个系统的管理(包括软件硬件)。这一点和PC机上的BIOS有所不同。
————————————–uboot—————————————-
在我们的WRTnode上,使用的是uboot这种bootloader。至于uboot是由哪些组成?是如何具体实现bootloader的每一个阶段的任务的?uboot应该如何使用和修改?这些内容庞大。但是我愿意仔仔细细,认认真真的分析整个WRTnode的uboot,就当作是初生牛犊不怕虎吧~在后续也会陆陆续续贴出许多“小广告”。希望各位大神提板轻拍,在此先笑脸迎各位光临了^_^
By SchumyHao
Schumy.haojl@gmail.com