论文部分内容阅读
【摘要】针对在基于AT91SAM9263和Linux的便携式检测设备与发动机电子控制器之间的文件传输的问题,对电子控制使用的Interlnk/Intersvr软件及其通信协议进行了分析研究。采用在实验室搭建协议分析环境和源码分析的方法,理清了Interlnk/Intersvr通信协议的报文格式、通信流程,并研究了DOS文件系统的结构及访问方法,最后在检测设备软件中的实现了文件传输功能。实验结果表明,项目研究达到了预期的目标。
【关键词】嵌入式系统;驱动器映射;波特率协商;文件数据簇
1.引言
Interlnk/Intersvr是高版本DOS提供的用于两台计算机之间进行文件拷贝的支持软件,支持异步串口和并行口两种连接方式。目前,采用x86核心板的许多嵌入式应用均采用该软件进行文件下载和上传。例如某型号发动机电子控制器,采用了PC104结构的x86核心板,发动机运行的记录信息保存在核心板的电子盘上,需要采用Interlnk/Intersvr下载这些信息并对发动机的工作状态进行分析。传统的作法是在实验室工控PC平台上完成对电子控制器的参数设置,但此方法时效性差,为了提高检测效率,实现发动机运行状态的就地分析,亟需设计外场便携式检测设备。根据项目技术规范书的要求,便携式检测设备采用AT91SAM9263作为CPU,嵌入式Linux作为操作系统,但由于电子控制器是定型产品,其运行软件不允许修改,因此需要在便携式检测设备上设计实现Interlnk软件。但由于Interlnk/Intersvr属于Sewell公司早期开发产品,其通信协议并没有对外公布,要在其他平台上实现Interlnk功能必须首先分析其通信协议,才能在通信协议基础上实现文件传输的功能。本文在分析该协议报文格式和通信流程的基础上,深入研究了其文件访问机制,并在便携式检测设备上实现了该功能。
2.Interlnk/Intersvr协议分析
Interlnk/Intersvr采用企业内部制定的通信协议,并没有协议文本,必须对其通信协议进行分析,才能理清报文格式和通信流程。因此,本文实验设计采用3台计算机进行报文跟踪,并分析每条报文功能,其中一台运行Intersvr,一台运行Interlnk,另一台运行支持双端口的协议分析和报文捕获软件X-Mon,计算机之间采用异步串口进行通信连接。实验环境如图1所示。实验环境搭建好之后,采用先启动Intersvr和X-Mon、再启动Interlnk的方法,便可以在X-Mon的视窗中捕获到Interlnk/Intersvr之间的通信报文。需要说明是,由于Interlnk/Intersvr使用了变波特率机制,最初的报文是乱码,而之后的报文是其真实的通信报文。
由于Interlnk/Intersvr通信信息流量很大,分析起来比较困难。本文分析从网上下载MSDOS 6.0源代码来解决此问题,该代码中有Interlnk/Intersvr的实现源码,其中,Interlnk是采用MASM汇编语言实现的常驻内存的块设备驱动程序,Intersvr是汇编和C语言混合编程的应用程序。通过阅读源代码,可以基本分析出其报文格式和通信流程,再借助图1所示的协议分析环境,逐项对其功能流程进行验证,从而弄清了Interlnk/Intersvr的工作机制和实现方法,为后期的软件设计奠定了基础。
2.1 建立通信连接
在Interlnk启动之前,必须先运行Inter-svr。Interlnk启动时先以缺省的启动波特率与Intersvr通信,最初的通信内容是在二者之间交换一组同步字节串,同步字节串是Interlnk/Intersvr约定的固定字节码,Interlnk侧为0xAA,0x55,0x5A,Intersvr侧为0x00,0xFF,0x11,Interlnk每发送一个字节,Intersvr按顺序响应对应的字节,这样就完成了同步字节串的交互。接下来需要测试服务器与客户机之间是否存在正常的通信连接。如果存在正常的通信连接,Interlnk则向Intersvr发送服务器信息请求(server_info_r),获取服务器标识码,确定最大报文长度、校验码格式等通信参数。紧接着发送初始化请求(init_packet_r),获取服务器版本信息和存储设备的配置状况和访问属性。值得注意的是,在每次报文通信之前,需要检测当前波特率是否为用户指定或允许的最大通信速率,如果不是则启动波特率协商机制,协商确定当前条件下可以达到的最大波特率。上述建立通信连接的过程如图2所示。
2.2 报文格式
Interlnk/Intersvr之间的报文通信格式相对比较简单,由帧长、帧体、CRC校验码三部分组成。该软件总共定义了30条通信命令,包括服务器信息请求、初始化请求、构建BIOS参数块(BPB)请求、读扇区请求、写扇区请求、通用I/O控制请求等。但是,报文帧交互过程中,需要进行复杂的报文帧同步以防止帧丢失,指示帧长字节数以及后续帧控制等。由X-Mon捕获的一组帧如图3所示。
报文帧同步的方法是:在每个报文帧发送之前先发送同步字节;不论是请求帧还是响应帧,收到同步字节的一侧立即回送该同步字节;每发送一帧,则对帧序列号加1;如帧长小于256字节,则帧长字节数标记置1,否则置0;如果还有后续信息需要发送,则对后续帧标记置1。每帧发送完之后,将后续将要收到的帧序列号发送给对方。
2.3 建立驱动器映射
在通信连接建立之后,Interlnk则发送驱动器信息请求(drive_info_r)来获取服务器所有驱动器信息,并建立驱动器映射。在驱动器映射建立之后,Interlnk侧的计算机即可将服务器上的驱动器(如:硬盘)当作本地盘使用。
2.4 文件访问操作
能够对服务器文件进行访问是项目研究开发的目标之一。根据项目技术规范书的要求,软件需要实现电子控制器运行程序备份下载、数据信息文件上传等功能,具体来说需要实现文件读、写、改名和删除等操作。驱动器映射建立之后,Interlnk块设备驱动程序获取DOS Shell对映射驱动器的操作,向Intersvr发送相应的请求,完成所要求的操作。这里以信息文件下载为例介绍文件操作的执行流程。 由于Interlnk是DOS常驻内存的块设备驱动程序,它对服务器文件访问与DOS一样,都是建立在BIOS参数块、文件目录结构和文件分配表基础之上,因此,Interlnk首先向Intersvr发送构建BPB参数块命令(build_bpb_r),获取服务器相应驱动器的BPB参数块;其次读取服务器根目录入口和文件分配表;然后从根目录出发查找所访问文件的入口参数,包括文件名、长度、首簇号等,根据首簇号和文件分配表获取文件所占用的簇链;最后顺序读取簇链所在的扇区,将需要下载的信息文件读取到Interlnk侧的计算机。
为了实现对DOS文件系统的访问操作,下一节对FAT16文件系统的结构、访问方法进行了进一步的分析与研究。
3.FAT16文件系统结构
FAT16文件系统把硬盘的划分为几个区,包括引导扇区、文件分配表和文件数据簇三个部分,具体结构如图4所示。其中,簇是文件存储的最小单元。FAT16将磁盘分为固定大小的扇区,多个扇区构成一个固定大小的簇。
引导扇区的结构如图5所示。其中BIOS参数主要保存如下信息:a.每扇区字节数;b.每簇扇区数(2的n次方,n=1..5);c.保留扇区数;d.文件分配表个数;e.根目录入口数;f.每个文件分配表占用扇区数等。这些参数是FAT16文件系统访问重要的参数,文件数据簇的开始扇区号、根目录扇区数等都需要使用这些参数来推算。
文件分配表(File Allocation Table,FAT)是Microsoft在FAT文件系统中用于磁盘数据(文件)索引和定位引进的一种链式结构。为了保障文件系统的可靠性,DOS设计了两个文件分配表,一个是主分配表,另外一个是备份表,主表损坏时采用备份表进行系统恢复。在FAT文件系统中,文件的存储依照FAT表中的簇链式数据结构来进行,如图6所示。同时,FAT文件系统在组织数据时将目录也抽象为文件,以简化对数据的管理。
基于FAT16文件系统的结构,2.4节介绍的信息文件下载算法的类C语言描述如下:
void copy_file_to_client(char *fn,char *en)
{
i=0;
while(1) //在目录表中找文件入口
{
if(strncmp(root[i].filename,fn,8))
{ i++;continue; }
if(strncmp(root[i].extname,en,3))
{ i++;continue; }
cluster=root[i].cluster_num;//首簇号
filelen=root[i].file_len; //文件长度
break;
}
//还没有读取的文件内容的长度
remain_byte_number=filelen;
do
{ //读当前簇的文件内容
if(sread(pio,sectors_per_cluster, file_sector_num)
& STATUS_ERROR)return;
//还没有读取的文件内容的长度
if(remain_byte_number>=bytes_per_cluster)
remain_byte_number-=bytes_per_cluster;
else remain_byte_number=0;
//从簇链中获取下一簇号
if(cluster!=-1)cluster=FAT[cluster];
if(cluster==-1)break; //EOF
}while(remain_byte_number>0);
}
4.结束语
针对在linux中通过Interlnk/Intersvr访问DOS系统文件的问题,本文采用了gcc-arm-linux交叉编译工具对项目软件中文件传输模块进行了设计实现。其中,检测设备采用异步串口与Intersvr服务器进行物理连接,文件传输模块采用了与Interlnk相同的方式与Intersvr进行同步、通信连接和波特率协商,并将用户需要下载的文件信息在本地列表显示,供用户选择下载。同时,检测设备还支持将用户存储在移动光驱中的运行软件下载到电子控制器。检测设备与电子控制器之间文件相互传输的试验表明:二者之间的通信连接正常,文件传输正确可靠,达到了项目研究预期的目的。
参考文献
[1]Mark Kampe,An Introduction to DOS FAT Volume and File Structure[OL].http://seas.ucla.edu/,2011-10-9.
[2]MS-DOS 6.0源代码(MS-DOS 6.0 Source Code.zip)[CP].http://ishare.iask.sina.com.cn,2011-6-4.
[3]陈代军.FAT32和FAT16文件系统的差异[J].成都信息工程学院学报,2003(6).
[4]周书明.巧用INTERLNK和INTERSVR[J].电脑编程技巧与维护,1997(2).
[5]维基百科,FAT,http://zh.wikipedia.org/2012-3-19.
作者简介:田伟娟(1990—),女,陕西宝鸡人,大学本科,现就读于西安工程大学计算机科学学院电子信息科学与技术专业。
通信作者:薛纪文(1970—),男,陕西汉中人,副教授,主要研究方向:嵌入式系统应用。
【关键词】嵌入式系统;驱动器映射;波特率协商;文件数据簇
1.引言
Interlnk/Intersvr是高版本DOS提供的用于两台计算机之间进行文件拷贝的支持软件,支持异步串口和并行口两种连接方式。目前,采用x86核心板的许多嵌入式应用均采用该软件进行文件下载和上传。例如某型号发动机电子控制器,采用了PC104结构的x86核心板,发动机运行的记录信息保存在核心板的电子盘上,需要采用Interlnk/Intersvr下载这些信息并对发动机的工作状态进行分析。传统的作法是在实验室工控PC平台上完成对电子控制器的参数设置,但此方法时效性差,为了提高检测效率,实现发动机运行状态的就地分析,亟需设计外场便携式检测设备。根据项目技术规范书的要求,便携式检测设备采用AT91SAM9263作为CPU,嵌入式Linux作为操作系统,但由于电子控制器是定型产品,其运行软件不允许修改,因此需要在便携式检测设备上设计实现Interlnk软件。但由于Interlnk/Intersvr属于Sewell公司早期开发产品,其通信协议并没有对外公布,要在其他平台上实现Interlnk功能必须首先分析其通信协议,才能在通信协议基础上实现文件传输的功能。本文在分析该协议报文格式和通信流程的基础上,深入研究了其文件访问机制,并在便携式检测设备上实现了该功能。
2.Interlnk/Intersvr协议分析
Interlnk/Intersvr采用企业内部制定的通信协议,并没有协议文本,必须对其通信协议进行分析,才能理清报文格式和通信流程。因此,本文实验设计采用3台计算机进行报文跟踪,并分析每条报文功能,其中一台运行Intersvr,一台运行Interlnk,另一台运行支持双端口的协议分析和报文捕获软件X-Mon,计算机之间采用异步串口进行通信连接。实验环境如图1所示。实验环境搭建好之后,采用先启动Intersvr和X-Mon、再启动Interlnk的方法,便可以在X-Mon的视窗中捕获到Interlnk/Intersvr之间的通信报文。需要说明是,由于Interlnk/Intersvr使用了变波特率机制,最初的报文是乱码,而之后的报文是其真实的通信报文。
由于Interlnk/Intersvr通信信息流量很大,分析起来比较困难。本文分析从网上下载MSDOS 6.0源代码来解决此问题,该代码中有Interlnk/Intersvr的实现源码,其中,Interlnk是采用MASM汇编语言实现的常驻内存的块设备驱动程序,Intersvr是汇编和C语言混合编程的应用程序。通过阅读源代码,可以基本分析出其报文格式和通信流程,再借助图1所示的协议分析环境,逐项对其功能流程进行验证,从而弄清了Interlnk/Intersvr的工作机制和实现方法,为后期的软件设计奠定了基础。
2.1 建立通信连接
在Interlnk启动之前,必须先运行Inter-svr。Interlnk启动时先以缺省的启动波特率与Intersvr通信,最初的通信内容是在二者之间交换一组同步字节串,同步字节串是Interlnk/Intersvr约定的固定字节码,Interlnk侧为0xAA,0x55,0x5A,Intersvr侧为0x00,0xFF,0x11,Interlnk每发送一个字节,Intersvr按顺序响应对应的字节,这样就完成了同步字节串的交互。接下来需要测试服务器与客户机之间是否存在正常的通信连接。如果存在正常的通信连接,Interlnk则向Intersvr发送服务器信息请求(server_info_r),获取服务器标识码,确定最大报文长度、校验码格式等通信参数。紧接着发送初始化请求(init_packet_r),获取服务器版本信息和存储设备的配置状况和访问属性。值得注意的是,在每次报文通信之前,需要检测当前波特率是否为用户指定或允许的最大通信速率,如果不是则启动波特率协商机制,协商确定当前条件下可以达到的最大波特率。上述建立通信连接的过程如图2所示。
2.2 报文格式
Interlnk/Intersvr之间的报文通信格式相对比较简单,由帧长、帧体、CRC校验码三部分组成。该软件总共定义了30条通信命令,包括服务器信息请求、初始化请求、构建BIOS参数块(BPB)请求、读扇区请求、写扇区请求、通用I/O控制请求等。但是,报文帧交互过程中,需要进行复杂的报文帧同步以防止帧丢失,指示帧长字节数以及后续帧控制等。由X-Mon捕获的一组帧如图3所示。
报文帧同步的方法是:在每个报文帧发送之前先发送同步字节;不论是请求帧还是响应帧,收到同步字节的一侧立即回送该同步字节;每发送一帧,则对帧序列号加1;如帧长小于256字节,则帧长字节数标记置1,否则置0;如果还有后续信息需要发送,则对后续帧标记置1。每帧发送完之后,将后续将要收到的帧序列号发送给对方。
2.3 建立驱动器映射
在通信连接建立之后,Interlnk则发送驱动器信息请求(drive_info_r)来获取服务器所有驱动器信息,并建立驱动器映射。在驱动器映射建立之后,Interlnk侧的计算机即可将服务器上的驱动器(如:硬盘)当作本地盘使用。
2.4 文件访问操作
能够对服务器文件进行访问是项目研究开发的目标之一。根据项目技术规范书的要求,软件需要实现电子控制器运行程序备份下载、数据信息文件上传等功能,具体来说需要实现文件读、写、改名和删除等操作。驱动器映射建立之后,Interlnk块设备驱动程序获取DOS Shell对映射驱动器的操作,向Intersvr发送相应的请求,完成所要求的操作。这里以信息文件下载为例介绍文件操作的执行流程。 由于Interlnk是DOS常驻内存的块设备驱动程序,它对服务器文件访问与DOS一样,都是建立在BIOS参数块、文件目录结构和文件分配表基础之上,因此,Interlnk首先向Intersvr发送构建BPB参数块命令(build_bpb_r),获取服务器相应驱动器的BPB参数块;其次读取服务器根目录入口和文件分配表;然后从根目录出发查找所访问文件的入口参数,包括文件名、长度、首簇号等,根据首簇号和文件分配表获取文件所占用的簇链;最后顺序读取簇链所在的扇区,将需要下载的信息文件读取到Interlnk侧的计算机。
为了实现对DOS文件系统的访问操作,下一节对FAT16文件系统的结构、访问方法进行了进一步的分析与研究。
3.FAT16文件系统结构
FAT16文件系统把硬盘的划分为几个区,包括引导扇区、文件分配表和文件数据簇三个部分,具体结构如图4所示。其中,簇是文件存储的最小单元。FAT16将磁盘分为固定大小的扇区,多个扇区构成一个固定大小的簇。
引导扇区的结构如图5所示。其中BIOS参数主要保存如下信息:a.每扇区字节数;b.每簇扇区数(2的n次方,n=1..5);c.保留扇区数;d.文件分配表个数;e.根目录入口数;f.每个文件分配表占用扇区数等。这些参数是FAT16文件系统访问重要的参数,文件数据簇的开始扇区号、根目录扇区数等都需要使用这些参数来推算。
文件分配表(File Allocation Table,FAT)是Microsoft在FAT文件系统中用于磁盘数据(文件)索引和定位引进的一种链式结构。为了保障文件系统的可靠性,DOS设计了两个文件分配表,一个是主分配表,另外一个是备份表,主表损坏时采用备份表进行系统恢复。在FAT文件系统中,文件的存储依照FAT表中的簇链式数据结构来进行,如图6所示。同时,FAT文件系统在组织数据时将目录也抽象为文件,以简化对数据的管理。
基于FAT16文件系统的结构,2.4节介绍的信息文件下载算法的类C语言描述如下:
void copy_file_to_client(char *fn,char *en)
{
i=0;
while(1) //在目录表中找文件入口
{
if(strncmp(root[i].filename,fn,8))
{ i++;continue; }
if(strncmp(root[i].extname,en,3))
{ i++;continue; }
cluster=root[i].cluster_num;//首簇号
filelen=root[i].file_len; //文件长度
break;
}
//还没有读取的文件内容的长度
remain_byte_number=filelen;
do
{ //读当前簇的文件内容
if(sread(pio,sectors_per_cluster, file_sector_num)
& STATUS_ERROR)return;
//还没有读取的文件内容的长度
if(remain_byte_number>=bytes_per_cluster)
remain_byte_number-=bytes_per_cluster;
else remain_byte_number=0;
//从簇链中获取下一簇号
if(cluster!=-1)cluster=FAT[cluster];
if(cluster==-1)break; //EOF
}while(remain_byte_number>0);
}
4.结束语
针对在linux中通过Interlnk/Intersvr访问DOS系统文件的问题,本文采用了gcc-arm-linux交叉编译工具对项目软件中文件传输模块进行了设计实现。其中,检测设备采用异步串口与Intersvr服务器进行物理连接,文件传输模块采用了与Interlnk相同的方式与Intersvr进行同步、通信连接和波特率协商,并将用户需要下载的文件信息在本地列表显示,供用户选择下载。同时,检测设备还支持将用户存储在移动光驱中的运行软件下载到电子控制器。检测设备与电子控制器之间文件相互传输的试验表明:二者之间的通信连接正常,文件传输正确可靠,达到了项目研究预期的目的。
参考文献
[1]Mark Kampe,An Introduction to DOS FAT Volume and File Structure[OL].http://seas.ucla.edu/,2011-10-9.
[2]MS-DOS 6.0源代码(MS-DOS 6.0 Source Code.zip)[CP].http://ishare.iask.sina.com.cn,2011-6-4.
[3]陈代军.FAT32和FAT16文件系统的差异[J].成都信息工程学院学报,2003(6).
[4]周书明.巧用INTERLNK和INTERSVR[J].电脑编程技巧与维护,1997(2).
[5]维基百科,FAT,http://zh.wikipedia.org/2012-3-19.
作者简介:田伟娟(1990—),女,陕西宝鸡人,大学本科,现就读于西安工程大学计算机科学学院电子信息科学与技术专业。
通信作者:薛纪文(1970—),男,陕西汉中人,副教授,主要研究方向:嵌入式系统应用。