【摘要】針對在基于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—),男,陜西漢中人,副教授,主要研究方向:嵌入式系統應用。