APP下载

基于自定制Linux 系统的x86 平台上PCI 硬件测试软件实现

2014-01-20

扬州职业大学学报 2014年2期
关键词:驱动程序单板内核

王 威

(中船重工七二三研究所,江苏 扬州 225009)

随着大规模集成化电路的出现,嵌入式单板计算机在各个领域中应用广泛。因此,通过硬件测试来提高单板计算机的质量成为一个值得研究的课题。国内各大嵌入式单板计算机厂商的产品,整体系统架构具有多样性和紧凑性。一种既具有通用性可以兼容多个硬件平台,又具备一定性能的系统软件成为测试软件必备之选。Linux系统[1]由于其具有很强的跨平台性与可裁剪性,因此被本测试软件使用。Linux 是一套可供免费使用和自由传播的类Unix 操作系统,是一个基于POSIX 和UNIX 的多用户、多任务、支持多线程和多CPU 的操作系统。它能运行主要的UNIX 工具软件、应用程序和网络协议。它支持32 位和64位硬件。Linux 继承了Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux 存在着许多不同的版本,但都使用Linux 内核。

1 x86 平台模型和PCI 空间描述

x86 平台的CPU 具有32 根地址线,根据编制原理232=4G 内存空间。

图1 x86 内存映射模型

可以从x86 内存映射模型(见图1)上看出[2],0 到1M 内存空间用来保留与DOS 系统的兼容,1M向上一直到RAM 顶端TOLUD 为RAM 存储空间,PCI 设备则在RAM 顶端到APIC 之间,APIC 向上为中断控制程序与BIOS 的FLASH 映射。

PCI 空间中对系统的PCI 设备进行编址并映射设备其中的内存空间,因此对系统中的PCI 设备进行访问,即是对PCI 空间进行访问。

PCI 设备包含配置空间、IO 空间和内存空间。在x86 系统中,所有可以访问的内存以及IO空间都被映射到了统一的4G 的x86 内存空间中,并且系统使用PCI 配置空间来管理所有的PCI 设备空间。而PCI 配置空间本身又可以通过x86 IO空间设置的PCI 配置空间地址和数据端口访问。此时访问地址是由PCI 总线号,功能号以及PCI类型等数据编址而成。

当从配置空间中得到PCI 设备的基地址的时候,就可以根据设备中自身的地址映射使用相同的偏移量结合基地址对设备内容进行访问。

2 被测目标嵌入式系统结构

本嵌入式单板计算机选用了以下的硬件架构(见图2):Intel ATOM E620T (x86 architecture)其中集成了北桥、USB 键盘、PCI 设备(Ethernet等)、南桥设备(USB,SATA)和256MB DDRAM Memory。

表1 PCI 配置空间

图2 实验单板计算机硬件框架

通过对此实验单板计算机架构分析所得,绝大多数芯片由PCI 总线连接至CPU,由CPU 对其进行控制和访问。其中由于CPU 芯片集成了北桥,因此,对于RAM 芯片的访问功能集成至CPU中。对此平台的测试主要是对PCI 空间上的一些设备以及端口,由于端口的实现方式为存储器映射方式,因此,对端口的访问实际上是对PCI 芯片设备的存储空间进行访问。

3 建立Linux 测试平台及开发环境

由于制作自定制Linux 系统必须对其内核程序进行重新编译,因此,需要额外的Linux 系统计算机辅助开发。开发环境包括一台带有Linux 操作系统的PC。安装并使用GCC 编译器来辅助编译kernel 和root 文件系统。同时安装busybox 和syslinux。

3.1 制作一张可启动Linux 的系统卡

由于大多数嵌入式系统都具有CF 卡槽,或者MSD 卡槽,因此,本系统选择使用CF 卡作为测试软件系统的载体。Linux 系统启动的简略步骤:CPU 上电后,BIOS 进行工作,BIOS 将读取硬盘的MBR 区数据;在MBR 区启动boot loader(LILO,GRUB,SYSLINUX 等),进行boot 程序的加载。在boot loader 启动过程中,boot 程序将初始化设备驱动,并且使有些设备可以通过boot 程序启动。在boot loader 程序完成后,操作系统接管CPU 的控制,系统成功启动。

3.2 编译支持目标机的Linux 内核

基于上文中的硬件环境建立Linux kernel。从www.linux.org 下载最新的Linux kernel;解压缩下载下来的内核代码,安装GCC 编译器;根据待测硬件配置源码包,制作bzImage 内核镜像。可从网上下载linux - 2.6.38.3. tar. bz2,运行“make menuconfig”在配置项中选择“Enable Eg20T south bridge I2c support”.

3.3 制作Linux 根文件系统

从www.busybox.net 下载busybox 源代码,并且使用“make menuconfig”来配置busybox 的编译。在编译的过程中,[* ]ash 的选项必须选中。

因为ash 功能是linux 系统的基本功能,所以此选项必须被选中。其他的选项可以根据软件需求进行修改。完成“make menuconfig”的配置以后,运行“make”命令,则根文件系统将在“-install/. folder”下创建出来,并且shell 工具可以运行在目标Linux 平台上。

3.4 制作CF 卡启动盘

通过syslinux 工具可以制作一张用来启动系统的CF 卡。在命令行输入“. /extlinux —i/dev/sdc1”(这里默认CF 卡占据设备的SDC1),通过这个命令使CF 卡能用来启动系统。并将CF 卡格式化为ext2 或ext3 的文件系统。

3.5 把Linux 系统安装到CF 卡上

将根文件系统拷贝到CF 卡上,即将打包好的内核镜像“bzImage”拷贝到CF 卡上。并且根据以下配置来编辑配置文件“extlinux. conf”来设置Linux 系统环境:

4 制作硬件测试驱动

4.1 PCI 总线扫描与IO 控制

Linux 操作系统给编程人员提供了PCI 驱动的接口,因此可以通过此接口直接操作PCI 设备。本软件系统使用Linux 系统函数pci-get-domain-bus-and-slot()来枚举硬件系统中所有的PCI 设备。通过pci-scan()函数来对具体的PCI设备进行查询,这种查询是通过对PCI 总线号,设备号以及功能号的设置来实现的,在使用查询功能之前可以通过阅读硬件手册来获得被访问设备的PCI 硬件信息。如果查询成功的话,函数将返回PCI 设备配置字描述结构指针。通过对此指针的操作,可以实现对PCI 设备配置内容的操作。

取得PCI 设备配置内容后,可以根据基地址存储单元即BAR(Base Address Register)中提供的内容结合PCI 设备中的偏移量来生成相应的地址,然后可以用iomap()函数将要访问的物理内存映射至测试程序的逻辑地址中执行。在对PCI设备地址中的IO 地址进行操作时也可以按照此方法,可以调用pci-iomap()函数来将IO 端口映射至内存空间进行访问,映射结果为获得一个指向此地址的指针,因此,可以通过对指针进行操作来访问硬件资源[3]。

4.2 软件架构

根据嵌入式硬件和软件的结构(见图3)。整个测试系统被分为三层,最底层为硬件层,此层包含了x86 平台的硬件,其中有芯片、端口、总线等部件。中间层为Linux 内核层,在此层Linux 系统自动将对底层硬件的访问封装在驱动程序内,其中有IO 空间访问,内存空间访问等,甚至包括一些特殊协议包括I2C 协议等等,都将其封装在内核层。而本软件系统的PCI 测试驱动也是存在于此层。最顶层是应用层,在这一层应用函数通过sys-call()的系统调用来访问内核层的驱动,从而实现对硬件底层的访问。

图3 硬件测试驱动程序框架

由于Linux 系统的保护机制,应用程序无法直接对物理内存进行访问,只有在内核级的编程模式下,才可以对硬件地址进行访问。因此要实现对硬件的测试程序,只有将其置于内核级的编程模式下。而普通的内核级编程由于必须对内核进行打包并且每次调试都需要重新编译,导致调试非常不方便。为了解决这个问题,本系统采用了测试驱动模块的方式,将对硬件的测试功能添加入驱动程序中,并且在调试过程中使用了insmod 命令来实时插入和卸载测试驱动模块,从而实现调试的实时性,并且可以在调试完之后卸载模块,不影响整个系统的运行。

同时为了满足测试程序的多重调用,可将被测芯片所有的测试函数封装至驱动框架内,并且通过ioctl()函数向驱动程序传递调用何种测试函数的命令,从而实现了测试程序的多重调用功能。具体程序实现如下:

示例代码中,对单板计算机中常用的FPGA芯片的各个功能模块建立了测试函数,例如fpga-ram(),并且通过对各测试函数设定其ioctl 调用命令,从而实现芯片整体测试的集成,并形成一个通用性的硬件测试驱动程序框架。

4.3 自动化测试设计

当测试驱动模块趋于调试稳定时,本系统将驱动程序生成的* .ko 文件打包置内核的启动批处理* . sh 文件中,从而实现了测试程序的自动调用与测试。

5 结语

本文讨论了一种基于自定制Linux 硬件测试软件的开发方式,研究了Linux 环境下PCI 总线及PCI 设备的访问方式,同时根据Linux 驱动程序的框架对于硬件测试程序进行了探讨,实现了硬件自动化测试。

[1] 林纳斯·托瓦兹.Linux 系统[EB/OL].(1991 -10-5)[2014 - 01 - 11]. http://baike. baidu. com/view/1634.htm?fr=aladdin.

[3] 科波特.LINUX 设备驱动程序[M].3 版.北京:中国电力出版社,2006.

猜你喜欢

驱动程序单板内核
多内核操作系统综述①
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
阻止Windows Update更新驱动程序
单板U型场地滑雪关键技术动作及训练方法
刘佳宇——2018年平昌冬奥会单板滑雪女子U型场地亚军
Linux内核mmap保护机制研究
计算机硬件设备驱动程序分析
封面人物 单板滑雪凌空飞燕蔡雪桐
妙用鼠标驱动