摘要: 针对将uclinux向nios处理器移植过程中的启动加载程序u-boot bootloader进行研究。首先介绍移植的步骤,然后利用bootloader的设计思想,着重讨论u-boot在nios中的设计与实现,最后对u-boot在基于linux的嵌入式系统 中的运用作了探索和展望。
关键词: u-boot bootloader uclinux nios软核
1 概述
1.1 nios简介
nios是 altera 公司以risc为基础的可配置、可裁减软核处理器。它具有16位指令集和16/32位数据通路,通过将包括16或32位高性能处理器在内的移种应用模块嵌入到通用fpga/cpld内,实现完全可配置的嵌入式系统。其开发套件包括:具有必要外围内核的nios处理器、c/c++编译器、cygnus的源级调试程序、quartus编译软件、验证工具和开发板。
nios软核处理器主要特性包括:高效灵活的处理器模块,可以通过软件配置成16位或32位的中央处理单元(risc结构),并可选择不同的内部存储器大小,其最高执行速度可达50mhz;具有多种其它功能模块的选择(sdram控制器、uart控制器、pci接口模块、lcd接口模块、mac接口模块等多种功能模块);具有完整、廉价、便捷的开发系统。所有开发(包括设计、调试)均通过软件进行,不再需要专门的硬件仿真器和编器,大大减少了开发设备的成本。
1.2 向nios移植 uclinux 需要做的工作和步骤
(1)硬件需求
需要一个 altera 公司的开发包,或者是下面三种之一:apex board,stratix board,cyclone board。本文选用的是cyclonae board。
(2)软件需求
下载一个最新版本的 uclinux ,并搭建一个nios的gnu c编译环境,准备好cdk4nios开发包。cdk4nios开发包是nios的交叉开发包。
(3)bootloader
需要编写或移植一个bootloader到altara nios board上。本文就是要设计一个用于nios的u-boot bootloader。利用quartus软件为开发板定义默认参数,然后在开发板上测试u-boot。
(4) uclinux 内核的编译
将下载好的 uclinux 源泉代码解压到/home目录下,会产生/home/ uclinux -dist目录,进入该目录,依次键入:
make menuconfig
make dep
make
在/home/ uclinux -dist/image目录中产生image.rom,image.ram,romfs.img,它们分别是内核的映像及文件系统的映像文件。键入make menuconfig时,会出现开发平台及内核配置和文件系统应用程序的配置界面,可以根据需要配置。
(5) uclinux 的根文件系统及其加载
uclinux 系统采用romfs文件系统,这种文件系统相对于一般的ext2文件系统要求更少的空间。romfs文件系统不支持动态擦写保存,对于需要系统动态保存的数据,采用虚拟ram盘的方法进行处理(ram盘将采用ext2文件系统)。同时, uclinux 内核也支持各种文件系统,例如,网络文件系统,在需要时可以进行mount。
解决了上述问题以后, uclinux 便可以成功地移植到nios上。
1.3 u-boot介绍
u-boot是启动引导程序的一种,是一种通用的linux bootloader。在做 uclinux 移植时,碰到的第一个问题就是移植bootloader或者自己编写bootloader程序。linux内核启动部分的代码需要判断从bootloader传递过来的寄存器值。u-boot对linux引导有特别的支持,如:
①scc/fec以太网支持;
②bootp/tftp引导;
③ip,mac预置能力和在线读写flash、doc、ide、iic、eerom、rtc;
④支持串行口kernit,s-record下载代码;
⑤识别二进制、elf32、pimage格式的image,对linux引导有特别的支持;
⑥单软件软件运行环境(hello.c);
⑦监控(minitor)命令集有读写i/o、内存、寄存器、外设测试功能等;
⑧脚本语言支持(类似bash脚本);
⑨支持watchdog,lcdlogo,状态指示功能等。
本文着重介绍 uclinux 向nios软核处理器移植过程中,u-boot的设计和实现。
2 u-boot的设计
2.1 bootloader的设计思想
bootloader的设计除了依赖于cpu的体系结构外,它实际上也依赖于具体的嵌入式板级设备的配置。也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种cpu而构建的,要想让运行在一块板子上的bootloader程序也能运行在另一块板子上,通常也都需要修改bootloader的源程序。从本质上讲,它不属于操作内核,它是针对不同的cpu体系结构的,这一部分代码不具有可移植性。在移植操作系统时,这部分代码必须加以改写。
bootloader引导加载程序是系统加电后运行的第一段软件代码。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统开发中,bootloader还担任了与主机端通信的任务,它相当于一个“服务器”,不断监听从主机端传来的控制信息和数据信息,完成相应的操作。它担负着初始化硬件和引导操作系统的双重责任,也是在特定硬件平台上操作系统移植至关重要的一点。
2.2 nios内核的u-boot设计方案
在主机上建立开发环境的具体步骤:
①建立nios平台内核的头文件和连接;
②建立实用程序集合;
③建立nios平台c编译器;
④建立nios平台的glibc库;
⑤建立nios平台c++编译器;
⑥建立应用程序的开发和测试。
所建立的开发环境结构图如图1所示。
搭建完开发环境后,使用开发主机的并口为nios开发板写入引导程序作为系统启动和管理flash的bootloader,也就是u-boot。该工具能为nios平台提供引导功能,并且能够支持网络通信,调试和简单的flash文件系统,也是cpu开机后执行的第一个程序,它的任务是将操作系统内核(压缩的或非压缩的)装载到内核要求的地址中,然后让出控制权。
nios处理器允许操作系统改变内核时钟,以方便内存对于时间的处理,所以u-boot的第一个任务就是配置处理器的时钟,并进行内存存取设置。一旦内存可以使用,就开始初始化相应的堆栈。内存初始化完成后,u-boot能使处理器上的串口中断处理,以允许开发板通过串口与开发环境通信。此后,u-boot还必须完成三个基本工作:
*禁用mmu(memory management unit);
*寄存器(cpu寄存器)r0置零;
*寄存器r1置相应的nios体系结构代码。
完成这些后,u-boot的工作就完成了,可以通过用户命令或者系统自动执行下一步,u-boot将跳至内存中内核代码开始处,开始启动内核。流程图如图2所示。
3 nios内核的u-boot实现
为了达到将u-boot移植到nios平台上的目的,我们进行以下操作。
①在makefile文件和make all script里增加一项设置选择,仿照已经存在的那些例子。
②建立一个存放开发板代码的目录,增加所需要的文件。在这个目录里,至少有“makefile”,“nios.c“,flash.cu-boot.lds。
③为开发板建立一个新的设置文件:include/configs/nios.h。
④如果移植u-boot到一个新的cpu,还需要建立一个放置cpu代码的目录。
⑤运行make nios_config。
⑥运行make,获得一个u-boot.srec的文件并安装到目标系统。
⑦调试并解决可能产生的问题。
当然,在修改u-boot代码时,要特别注意和开发板及cpu相关的部分,要设置成专门的nios配置。
config_nios——定义了所有nios32的板子。
cfg_nios_console—console uart的基地址。
cf g_gbl_data_offset—在nios移植中所用到全局变量的偏移量,简单来讲是全局数据的地址。
cfg_nios_tmrbase—计时器的基地址。
cfg_nios_tmrirq——分配给计时器的中断请求。
下面介绍如何用germs执行u-boot。
在没有将u-boot编入flash之前,键入nios-run命令来运行u-boot monitor,步骤如下:
*打开一个nios sdk shell。
*把目录转换到含有u-boot.src文件的目录。
*执行下列命令:
$nios-run -r u-boot.srec
这时我们可以看到:
u-boot 1.0.0 pre(jan 2004-07:36:40)
cpu nios-32 rec3.18(03018)
regfile size:256
lo_limit/hi_linit:2/14
board: altera nios 1c20developemt kit
in:serial
out:serial
err:serial
==>
*在下载完之后,germs monitor将自动启动u-boot。可以看到u-boot命令符号“==>”,看到后,退出nios-run。
*启动终端,应该被设置在115200,n,8,1处运行。
*开始用u-boot了,试着从u-boot符号那里执行help命令:
==>help
将u-boot放到flash存储器里,在u-boot的提示符下,进行擦除flash的一个区。
==>erase 40000 4ffff
把u-boot代码装载到ram:把一个二进制映像装载到ram。
==>loadb 800000
把这个二进制映像从ram拷贝到flash。
==>cp.b80000 40000 10000
这样,当通过标准的32位设置后,开发板重置,u-boot自动启动。若用安全模式下启动u-boot,输入下列的germs命令:+g40000。
结语
u-boot bootloader是操作系统和硬件的枢纽,相对于操作系统内核来说,它是一个硬件抽象层。它负责初始化硬件,引导操作系统内核,检测各种参数给操作系统内核使用。一个功能完备的大型bootloader的工作量,相当于一个小型的操作系统。嵌入式领域中,操作系统移植的关键在于:bootloader的移植和操作系统内核硬件相关部分移植。设计和实现一个好的u-boot将大大提高操作系统移植的稳定性,并大大加快操作系统移植的周期。
索尼将发布AR/VR版的标志性博物馆回顾展“David Bowie is”
什么是路由表
中国电子技术标准化研究院获授权 成为ZigBee联盟首个在华检测服务供应商
国内外的学院派对比,可知中国AI的道路还是任重而道远
电容单位换算1mf等于多少uf
NIOS软核处理器的Linux引导程序U-boot设计
基于QorIQ处理器的物联网网关设计
Airfast GaN射频晶体管带来大量创新设计理念
笔记本电池保养维护
思特威推出两颗基于自研先进BSI工艺平台的手机应用新品SC520CS与SC820CS
摄像头深度检测主要技术方法
RFID条形码智能仓储管理系统解决方案
小红书搜索团队研究新框架:负样本在大模型蒸馏中的重要性
免费又好用的PCB参数计算神器——Saturn PCB Toolkit
Windows 10时间线功能为何失败?挖坑太大填不回去了
风力摆pid调节_风力摆控制系统_风力摆系统结构图解
6寸柔性AMOLED显示模组与PEDOT触控面板的技术整合
矿机发展及种类介绍
NSK轴承的使用方法及注意事项
纯电动汽车和燃油车相比优势明显吗