300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 龙芯2h芯片不能进入pmon_基于龙芯2F架构的PMON分析与优化

龙芯2h芯片不能进入pmon_基于龙芯2F架构的PMON分析与优化

时间:2022-06-25 07:07:31

相关推荐

龙芯2h芯片不能进入pmon_基于龙芯2F架构的PMON分析与优化

摘要:基本输入/输出系统(BIOS)是现代计算机系统的重要组成部分,负责计算机系统的开机自检、板级初始化、加载操作系统内核以及基本I/O功能。以龙芯2F CPU架构为研究背景,在其基础上分析了PMON的系统结构与工作流程,通过添加网络驱动程序,最终实现通过PMON加载Linux和VxWorks操作系统。进行必要的功能完善与性能优化,并经过严格的测试以排除可能存在的深层次缺陷,实现了一个性能稳定、功能完善、高可靠性的能与国产龙芯2F处理器平台紧密搭配的BIOS。

关键词:BIOS;CPU;龙芯2F处理器;PMON

龙芯CPU使用PMON作为基本输入输出系统(BIOS)。PMON具有强大而丰富的功能,除基本的I/O功能外,还包括硬件初始化与检测、操作系统引导和程序调试等功能。PMON早期的版本功能少且扩展性不好。现在龙芯CPU上使用的PMON添加了硬盘和其他文件系统的支持,以及显卡的支持等。本文在深入分析PMON源码的前提下,添加了82551网卡驱动以便以网络下载加载操作系统内核,并对移植好的PMON系统进行了功能、性能和稳定性等方面的测试以适应某些重要领域对计算机系统高可靠性要求。通过专门的测试程序来实现此任务,并且尽量保证高的测试覆盖性。

1 基于龙芯2F架构的PMON分析

1.1 PMON执行流程分析

在龙芯2F CPU上电之初,内存和内存控制器处于不确定状态,因此CPU开始执行的BIOS代码只能放在非易失性介质中。PMON的二进制代码就存放于主板上一块512 KB的FLASH芯片上,其虚拟地址为0xBFC00000,物理地址是0x1FC00000。

由于在ROM FLASH运行的速度比较慢,并且空间有限,不能随时更改ROM中的内容,就需要把引导程序搬到内存里运行。因此,PMON的运行过程分为两个阶段:第一阶段是在ROM FLASH中运行,主要进行基本硬件初始化,如:北桥、南桥、内存控制器、缓存和串口初始化等;第二阶段在内存中执行,主要完成环境变量和基本数据结构的初始化、PCI总线扫描和设备初始化,显卡初始化、网络协议和设备初始化,并对搜索到的PCI总线上的设备进行驱动程序的加载与配置等,最后加载操作系统内核。

1.2 PMON在ROM中的执行流程

龙芯CPU开始执行的指令将CP0控制寄存器的状态寄存器和原因寄存器清零,让CPU处于内核模式。这是因为MIPS CPU启动时,必须定义足够的CPU控制寄存器状态,以使CPU能执行非缓存的指令。在对缓存初始化之前,不能访问缓存。非缓存的异常入口在0xBFC00000,但此处没有足够的空间存放启动代码,于是设计了一个跳转。这个跳转可以测试CPU是否正常工作。如果硬件发生了某种严重的错误,可能会导致CPU严重的异常。如果CPU正常启动起来并跳转到了正确的位置并执行了预先设计的指令,就可以相信CPU正常,某些硬件正常。跳转之后,PMON进行一系列的初始化与测试工作,这个过程如图1所示。

1.3 PMON在内存中的执行流程

PMON在内存中的执行过程非常复杂,下面按照其执行流程分析主要的函数:

_init():主要功能是顺序执行初始化。列表上的所有函数,建立必要的数据结构和编译环境。初始化列表上的函数主要可以分为3类:命令初始化函数,文件系统初始化函数,可执行文件初始化函数。

Evenint():环境变量初始化函数,这些环境变量解释并执行不同的命令。它们对PMON来说是必需的,用户可以定义另外的变量来保存任何字符串,如文件名和命令符等。

Tgt_devinit():主要功能是南桥初始化和PCI设备初始化。其中南桥初始化函数是cs5536_init()。PCI设备初始化由函数_pci_businit()完成,分为两步;先是北桥初始化,然后是设备初始化,包括对设备的扫描和设备所需资源的分配。PCI设备的初始化部分是PMON分析中的难点。

Init_net():主要进行了如下的工作;虚拟内存初始化等;用_pci_deviceinit函数完成了PCI配置空间的参数初始化,并且初始化显卡;网络系统的初始化包括网络设备的初始化和协议的配置等。

最后加载操作系统内核。这里会用到两个重要的命令Load和g。Load命令用于加载文件(内核)到内存,g命令执行内核文件。加载了内核文件之后就可以通过g命令来执行内核。

2 基于龙芯2F架构的PMON修改与优化

2.1 添加82551网卡驱动

网卡是一个PCI设备,所以其驱动在PCI设备初始化时实现。对于PCI设备,有一个重要的数据结构struct cfdata cfdata,这个数组是根据具体平台的配置文件生成的,以下是配置文件的相关部分:

这个部分描述了设备之间的链接关系,cfdata是这个关系的数组表示。另外还有一个PV数组定义一个设备的父设备,每个节点的父设备都是一个数组,在设备的cfdata结构中定义数组的开始。

上述配置文件中的fxp0表示的就是网卡设备。因为fxp0是PCI子设备,因此在查找PCI子设备时,其4个子设备:fxp0,rtkO,ohci,pci-ide的驱动也会在此时加载。查找设备有一个函数:config_found,其会调用config_serch,config_search从静态设备树cfdata中查找当前设备的子设备,然后对设备调用mapply函数,进行设备的匹配,如果设备存在则会调用该设备的ca_attach函数来加载设备的驱动程序。这里找到网卡设备之后会调用fxp_attach函数。在设计的网卡驱动中,实现了操作系统将怎样通过网卡驱动来讲网络包发送出去,而网卡收到网络数据包之后怎样通过操作系统来做后续处理。在PMON中,网卡中断通过查询来实现。fxp_attach函数会调用pci_intr_establish将中断程序注册到查询列表poll_list上。网口要将数据包发送出去,就必须提供一个网络接口,以提供给发送函数。在这里,将网络数据包放在网络接口的ifp→if_snd队列中,然后启动if_start来开始发送。在网卡发送完一个包后,检查发送队列,如果有剩余则继续发送,直到发送完毕。然后通过函数e100_poll来检查是否收到包,并进行收包处理。先进行缓冲区的清除,使能接收队列,查询是否有数据可接收,有则开始接收。无则继续查询并发出信息。

2.2 编译PMON

添加好了网卡驱动程序之后,需要对PMON进行重新配置和编译。配置和编译的过程如下。主要用到几条命令:

通过网络来更新PMON时使用下面的命令:load-f 0xbfc00000-r tftp://192.16.12.30来进行PMON的在线烧写。并通过网络来加载操作系统:load tftp://192.16.12.30/VxWorks.如果加载系统内核成功则验证了网卡驱动的有效。

3 系统测试

3.1 系统启动阶段网卡测试

由于启动阶段网卡只用于加载操作系统内核,对性能并没有太高要求。只需测试其功能即可。通过在启动过程中用另外一台主机对其进行ping操作来测试其功能。其界面如图2所示。

3.2 系统启动时间测试

经过测试,在硬盘启动模式下,系统从加电到操作系统启动完毕耗时不超过35 s,符合绝大部分应用需求。

3.3 500次开关机测试

为测试移植后的系统POST功能的稳定性,进行了500次开关机实验。经验证,成功启动次数为500,失败次数为0,成功率100%。

3.4 200 h老练测试

为测试PMON在系统运行时的稳定性,用专用的整机测试软件进行了200 h老练测试。经测试,系统运行正常,未出现故障,测试合格。

4 结语

为了适应PMON在国产计算机系统中的需求,对其进行了分析与优化。在分析了源码的基础上,对其进行了必要的修改与优化,增加了82551网卡的驱动等。为了验证优化后系统的稳定性,进行了一系列的测试验证,包括启动阶段的网络测试、系统启动时间测量、500次开

关机测试以及200 h老练测试等。经验证,修改后的PMON系统运行稳定,可以在多个重要领域中进行应用。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。