首页 文学文摘 时政新闻 科技科普 经济法律 健康生活 管理财经 教育教学 文化艺术 社科历史

基于CK?Core的安全芯片Bootloader开发与应用

作者:张锋 刘光耀 王剑非 来源:现代电子技术

摘 要: 随着嵌入式技术的快速发展,多接口和多功能的Bootloader得到越来越多的应用,但其设计开发过程却非常复杂。为了实现定制安全芯片的软硬件初始化,并成功下载其片内操作系统(COS),设计并实现了一种支持多接口和多功能的Bootloader。该Bootloader根据安全芯片及其CK?Core CPU的结构特点开发,程序结构简洁高效,对Bootloader的设计和开发提供了有力参考。

关键词: 嵌入式系统; Bootloader;COS; 安全芯片; CK?Core

中图分类号: TN911?34 文献标识码: A 文章编号: 1004?373X(2013)22?0137?06

0 引 言

随着IT技术的迅猛发展,人们对信息安全的要求越来越高。如何有效保障信息在交互过程中的安全性,成为一个日益重要的问题。安全芯片作为信息安全嵌入式产品的核心部分,能够独立进行密钥生成、加解密。其内部拥有独立的处理器和存储单元,可存储密钥和特征数据,为实际应用提供加密和安全认证服务。在国家开展的“新一代宽带无线移动通信网”科技重大专项中,如何保证宽带多媒体集群系统的安全性是项目的重要研究部分,而由我国自主研发的新一代安全加密芯片便是该重大专项中安全加密子系统的核心。该定制芯片采用具有自主知识产权的32位RISC安全CPU核——CK?Core,对于我国信息安全事业,尤其是警用信息安全技术的发展具有重要的意义。

在嵌入式系统软件开发中,引导加载程序(Bootloader)的开发是第一个环节,它对整个系统的正常运行起着关键作用。Bootloader的实现取决于对应硬件环境及整个嵌入式系统的功能需求,例如ARM通过U?Boot来引导,而DSP可以直接从EPROM或其他的处理器加载操作系统到DSP运行。本文的安全芯片Bootloader根据安全芯片及其CK?Core CPU的结构特点设计开发,具有多接口、多功能、程序结构简洁高效的特点。本文即从设计方案、软件实现、软件功能测试及应用等角度详细论述了该引导加载程序(Bootloder)的开发过程,从而为Bootloader的设计开发人员提供了一定的参考。

1 开发系统总述

本文提出的引导/装载程序(Bootloader)是基于定制安全芯片进行设计开发的。本芯片属于我国自主设计研发的新一代安全芯片,是国家十二五科技重大专项“新一代宽带无线移动通信网”相关课题的研究成果,适用于集群终端设备、基站设备等多用途高速安全加密领域。该芯片为项目中安全加密子系统的建立奠定了基础,安全加密子系统的示意图如图1所示。其中安全密码芯片是终端、基站、安全服务器实现信息安全要求的基本设备,能够提供身份信息、密钥信息等敏感信息的安全存储;并能够完成通信信息加解密,以实现鉴权、空口加密和端到端加密功能。

本安全芯片采用CK?Core作为CPU核。CK?Core是面向嵌入式系统和SoC应用领域的32位高性能低功耗嵌入式CPU核,采用了具有自身安全保护逻辑的16/32位混合编码RISC指令集[1]。其采用自主设计的体系结构和微体系结构并具有可扩展指令、可配置硬件资源、可重新综合、易于集成等优点。本芯片采用国内先进的0.18 μm工艺生产,硬件实现了所有主流的密码算法,包括国产密码算法SM1,SM2,SM3等,与同类安全芯片相比,加解密功能更加强大,性能更加优越;芯片支持USB 2.0,UART,SPI、高速SPI(SSPI)等多种I/O接口,极大拓展了芯片的应用领域及生命周期;为使芯片的应用更为灵活,芯片内置了多种类型存储器(SRAM,FLASH,ROM)。其中Bootloader存放在芯片16 KB的ROM里,代码密度高,在保证空间资源充足的前提下充分缩减了芯片成本,并且具有保存稳定、读取方便的特点。

在结构上,本定制安全芯片采用更加高效的多总线结构,芯片的架构图如图2所示。传统的基于共享总线结构的单层AHB总线已经不能满足多处理器系统高带宽和低延时的要求。本安全芯片采用的多层AHB总线结构代表了一种更先进的片上总线互连策略,既可以减少多Master系统的访问延时,也可以增加总线带宽。

在安全性方面,首先,本芯片所有数字逻辑全部采用离散电路,即使攻击者重构版图也无法得到芯片结构与IP信息,从而有效抑制破坏性攻击及反向工程;另外,本安全芯片含有多种保护机制,如过流及频率保护、环境失效保护(Environmental Failure Protection,EFP)等,有效抑制了非破坏性攻击。

本文所述Bootloader的开发即基于上文所述的硬件环境。软件开发方面,Bootloader通过C语言及汇编指令实现,开发环境为专门适用于CK?Core的集成开发环境C?Sky Development Suit(CDS)。CDS是一个基于Eclipse,用于C?SKY CPU架构交叉开发的可视化集成软件开发环境。在CDS环境下,软件开发用户可以方便地进行项目工程管理、编写代码、设置编译链接参数、编译链接目标程序等操作,并能够通过ICE在目标板上进行C/C++语言级调试。

2 Bootloader技术

2.1 Bootloader简介

嵌入式系统是以应用为中心,以计算机技术为基础,且软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统[2]。

引导加载程序(Bootloader)则是嵌入式系统加电后运行的第一段代码。通过运行Bootloader,系统可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境[3]。因此,Bootloader是整个嵌入式系统的首要环节。在PC中,引导加载程序由BIOS和位于硬盘MBR中的OS Bootloader(比如LILO和GRUB等)一起组成。BIOS在完成硬件检测和资源分配后,将硬盘MBR中的Bootloader读到RAM中,接下来由OS Bootloader将内核映像从硬盘上读到RAM中,并跳转到内核入口点,即开始启动操作系统。但在嵌入式系统中,通常没有像BIOS那样的固件程序,所以就由芯片中的Bootloader来完成系统的加载启动。在本安全芯片中,系统在上电或复位时都从地址0x00000000处开始执行,这个地址是片内ROM地址空间,其中存放的就是本系统的Bootloader。

Bootloader通常是严重地依赖于硬件而实现的,大多数的CPU体系结构都有不同的Bootloader。目前,多种Bootloader得到了广泛的应用:例如,Blob是专门为StrongARM架构下的LART设计的Bootloader[4];U?Boot是由开源项目PPCBoot发展而来,适用于PowerPC,ARM,MIPS等多种嵌入式开发板[5];vivi是由韩国Mizi公司设计为ARM系列处理器设计的一个Bootloader[6];等等。但这些Bootloader结构复杂,资源需求量大,且并不完全适用于本芯片的硬件架构。本文设计实现的Bootloader则简洁高效,代码密度高,只需较少的资源便可完成多接口与多功能的目标。

2.2 Bootloader典型结构

Bootloader的实现通常分为Stage1和Stage2两大部分[7]。依赖于CPU体系结构的代码,通常放在Stage1中,而且为了达到短小精悍的目的,Stage1的代码通常用汇编语言实现。而Stage2通常用C语言实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。Stage1在完成硬件设备初始化、准备堆栈和RAM等操作后,会跳转到Stage2的C入口点,然后完成Stage2 的操作。

3 Bootloader设计方案及实现

3.1 系统架构

在嵌入式系统中,Bootloader作为引导与加载片内操作系统(Chip Operation System,COS)的工具,必须提供初始化硬件设备、初始化RAM、初始化I/O接口等功能。

本文所述的Bootloader即有效实现了上述基本功能。从功能上讲,该Bootloader先后运行在两种工作模式:启动模式和下载模式。安全芯片最初上电时,系统PC开始执行ROM中的Bootloader,首先进入Bootloader的启动模式,完成硬件设备初始化、RAM空间初始化、堆栈初始化,I/O接口初始化等操作;然后,Bootloader进入循环命令等待状态,待主机终端用户输入相应APDU(Application Protocol Data Unit)命令后,完成命令的解析及响应,从而实现下载COS的功能。

本文设计的Bootloader总体结构框图如图3所示。其主要由三部分组成:物理层、驱动层、应用及协议层。物理层包含UART,USB,SSPI,SPI等设备接口以及FLASH存储空间;驱动层包括系统的初始化以及各种硬件设备的驱动程序;应用及协议层包括APDU命令在不同接口协议下的解析函数及响应函数。

3.2 系统工作流程及软件实现

本文所述的Bootloader工作流程如图4所示。

整个Bootloader分为Stage1和Stage2两个阶段,下文将针对这两个阶段的设计和软件开发进行详细论述。

3.2.1 Bootloader的链接脚本开发

本文介绍的Bootloader在GCC(GNU Compiler Collection)环境下开发,在此开发过程中如何控制输出文件在内存的布局情况是非常关键的问题。在GNU中,每一个链接过程都由链接脚本(link script,一般以ld作为文件的后缀名)控制。链接脚本主要用于规定如何把输入文件内的section放入输出文件内,并控制输出文件内各部分在程序地址空间内的布局[8]。在基于CK?Core的安全芯片中,Bootloader采用GNU ld文件的标准格式开发,主要完成了text段、rodata段、data段和bss段的内存布局,即如何安排其下载地址(Load Memory Address,LMA)和运行地址(Virtual Memory Address,VMA)。上述4个section的LMA全是芯片的ROM,即存放Bootloader的空间。关于VMA,由于text段和rodata段只需读取不需改动,所以其VMA与LMA相同,也在ROM;而data段和bss段存放着局部变量、堆栈、未初始化的全局变量等,不但需要读取,而且在程序运行过程中还需改动,所以将其VMA设置在芯片内部的SRAM。这段数据从LMA到VMA数据的搬运将在Stage1中完成。

3.2.2 Bootloader的stage1

Stage1是Bootloader程序运行起来后的第一级,主要运行一些依赖于CK?Core CPU体系结构的代码,并通过汇编指令实现。在这一部分里主要完成了以下工作:

(1)芯片自检。包括芯片是否空闲等状态的自检,若自检通过则继续向下执行,否则继续等待并自检。

(2)关键值判断。通过关键值来判断程序PC接下来的运行路径。

关键值写在芯片eFLASH的固定位置上,决定着程序执行的三种路径:

①继续执行ROM里的Bootloader程序;

②打开Jtag,跳转到eFLASH去执行下载的COS,便于下载COS并进行调试,适用于实验室阶段;

③关闭Jtag,跳转到eFLASH去执行下载的COS,这样可以保证COS的安全性,适用于产品生产出厂阶段。

(3)定义异常向量表;

(4)初始化处理器状态寄存器(PSR);

(5)初始化向量基址寄存器(VBR);

(6)初始化堆栈指针;

(7)初始化内存保护区;

(8)将代码段拷贝至片内SRAM;

(9)将bss段清零;

(10)跳转到Stage2的C入口点。

3.2.3 Bootloader的Stage2

Stage2使用C语言实现,针对该定制安全芯片的各功能模块及I/O端口进行软件开发,主要完成系统的驱动层、应用及协议层的功能。这一阶段的任务主要包括:

(1)设置中断控制器,完成系统中断和异常的初始化;

(2)初始化eFLASH控制器,为eFLASH的读/写和擦除操作做好准备;

(3)初始化PLL并修改时钟频率,将系统带入一个合适的工作频率;

(4)初始化UART,USB,SSPI(高速SPI)和USB端口,并完成相应中断的注册;

(5)等待APDU命令响应:这里先要开发APDU命令的解析函数及响应函数。

Stage2的主要流程均在main()函数里实现,下面介绍了main()函数的软件实现流程,如图5所示。

值得注意的是,在Stage2的实现过程中,写FLASH等耗时的操作均在主程序的while循环里完成,通讯过程中只通过置标志变量来通知上层程序,这样可以保持I/O接口通信实时性,并进一步提高Bootloader的执行效率。

4 Bootloader的功能测试及应用

4.1 Bootloader的功能测试

Bootloader除系统初始化的功能外,更重要的任务是提供适用于实际应用的其他扩展功能。本文介绍的Bootloader共支持6种基本应用功能:读SRAM、写SRAM、读eFLASH、写eFLASH、页擦除eFLASH和程序PC跳转。对本安全芯片的四种I/O接口(USB、UART、SSPI和SPI),Bootloader均实现了对六项应用功能的支持。下文论述了对各I/O口的功能的实现及测试情况。

4.1.1 USB接口测试

Bootloader中的USB底层驱动根据SCSI协议进行通信[9]。Bootloader将安全芯片虚拟为一个USB大容量存储设备,并依据Bulk?Only传输规范来实现数据/命令/状态的传输。Bulk?Only传输规范使用控制端点清除Bulk端点的STALL状态,并发送此规范定义的两个块存储类请求(Reset请求和Get Max LUN请求)[10]。而数据/命令/状态的传输则仅仅使用Bulk端点。图6是数据/命令/状态在USB总线上的传输流程图。

为测试Bootloader中USB接口的功能实现,开发了PC端测试软件BootTool,该软件在Visual Studio 2005集成开发环境下使用Visual C++开发完成,调用了Windows中的SCSI底层驱动完成与设备的通信。BootTool的实现界面如图7所示,成功完成了对Bootloader六项应用功能的测试。

4.1.2 UART接口测试

Bootloader中,UART六项应用功能测试也是通过BootTool来完成。BootTool的串口通信部分主要通过调用CSerialPort类来实现,该类的工作流程可以简单概括如下:接收数据时,首先设置串口参数(波特率、数据位、停止位、校验位),然后开启串行端口监测工作线程,串行端口监测工作线程监测到串行端口接收到的数据、流控制事件或其他串行端口事件后,就以消息方式通知主程序,触发消息处理函数来进行数据处理。发送数据时则直接向串行端口发送字符。

4.1.3 SSPI接口测试

高速SPI(Super Serial Peripheral Interface,SSPI)是一种新型的I/O接口。SSPI接口由SSPI主控和SSPI从设备组成,如图8所示。SSPI主控负责SSPI接口的配置并发起命令和数据传输,SSPI从设备负责响应命令并完成数据传输。SSPI主控和SSPI从设备之间有4根数据线,每个clock可以传输4 b的数据,提高了数据传输速率。

SSPI接口的测试要采用专用的SD控制芯片及SD控制板。安全芯片运行Bootloader充当SSPI从设备。进行测试时,PC端运行专用脚本程序,通过SD控制板向SD控制芯片发送APDU命令,SD控制芯片再通过其内部的firmware将命令转发给安全芯片的Bootloader,并负责接收和回送其返回的Response,最终通过Response来确定是否测试通过。

4.1.4 SPI接口测试

SPI接口的测试采用两块安全芯片的开发板对接来测试。其中一块设置为SPI Host模式,另一块运行Bootloader,充当SPI Slave。通过判断SPI Slave的响应是否正确来决定是否通过各应用功能测试。

4.2 Bootloader的应用

Bootloader的主要应用就是COS的下载,根据是否完成COS下载及是否修改关键值,可以将芯片分为三种工作状态:Boot状态、调试状态和出厂状态。三种状态的转换图如图9所示。

为配合芯片的实际应用,我们根据安全芯片的Bootloader开发了COS下载工具WorkshopTools,该工具在Visual Studio 2010集成开发环境下用Visual C++实现,如图10所示。经测试,通过该工具可实现与安全芯片Bootloader的通信,并成功完成了安全芯片COS的下载及工作状态的修改,从而使安全芯片可以根据实际需要工作在各种状态。

使用WorkshopTools为基于CK?Core的安全芯片下载COS的过程如图11所示。

5 结 语

Bootloader的设计与实现是一个非常复杂的过程。嵌入式系统中,完善的Bootloder能够大大增强系统的稳定性,提高系统的实时性。本文设计的Bootloader具有多接口和多功能的特点,它结合特定安全芯片及其CK?Core CPU的结构和功能特点,成功实现了该嵌入式系统的软硬件初始化、命令解析及发送等引导装载功能,并支持多种I /O接口下载COS,为基于该芯片的多种安全加密设备开发奠定了基础。因此,本文所详细论述的Bootloader设计与实现过程,对设计和开发其他类型的嵌入式系统Bootloader提供了较有价值的参考。

参考文献

[1] 潘赟.CK?Core嵌入式系统开发教程[M].北京:科学出版社,2011.

[2] 杨铸,唐攀.嵌入式底层软件开发[M].北京:北京航空航天大学出版社,2011.

[3] Kamal.嵌入式系统:体系结构、编程与设计[M].北京:清华大学出版社,2010.

[4] 张勇,郭熹崴,潘琢金.浅析Blob在S3C44B0上的移植[J].沈阳航空工业学院学报,2006(2):38?39.

[5] DING Xu?chang, LIAO Yong?qing, FU Jian?guo, et al. Analysis of bootloader and transplantation of U?Boot based on S5PC100 processor [C]// 2011 International Conference on Intelligent Human?Machine Systems and Cybernetics. Washington, DC, USA: IEEE Computer Society, 2011, 1: 61?64.

[6] 胡丰凯,张林,邹韬平.vivi系统引导程序的网络功能扩展[J]. 单片机与嵌入式系统应用,2006(6):57?59.

[7] ZHANG Zeng?ping, LI Shu?hua. The design and implementation of the embedded system based on ARM7 [J]. Advanced Materials Research, 2012, 433: 5607?5610.

[8] ZHANG Lei. GNU?ld链接脚本浅析[EB/OL]. [2005?11?03]. http://wenku.baidu.com/view/01d4e9c758 f5f61fb736663b.html.

[9] American National Standards Institute. Information technology: SCSI block commands–2 (SBC?2) [S]. New York, USA: American National Standards Institute, 2002.

[10] USB Implementers Forum. Universal serial bus mass storage class: bulk?only transport [S]. [S.l.]: USB Implementers Forum, 1999.