




摘 要: 針對汽車OBD接口存在的安全隱患,設計了以i.MX6系列處理器為核心,通過其串行外設接口,利用MCP2515CAN控制器接入CAN總線的車載信息安全中繼器。在分析 Linux 設備驅動程序工作原理的基礎上,闡述了CAN接口在Linux系統下的驅動程序設計方法,實現了CAN接口在Linux系統下的驅動,解決了汽車CAN總線的中繼問題。通過在Linux系統中添加ISO15031協議過濾器,實現了非法指令過濾,為車載信息在CAN總線上的傳輸提供了一層保護屏障。
關鍵詞: CAN; 信息安全; 驅動程序; 中繼器
中圖分類號: TN92?34 文獻標識碼: A 文章編號: 1004?373X(2016)17?0120?04
0 引 言
CAN(Controller Area Network,控制器區域網絡)總線廣泛地應用于汽車上,主要用來實現車載網絡各個電控單元之間的信息交換,形成車載網絡系統。利用CAN總線、傳感器、控制器和執行器通過串行數據線連接起來[1?2]。
OBD(On?Board Diagnostic)接口作為車載監控系統的通信接口,通過CAN總線接入車載系統。OBD接口除了讀取故障碼以供修車外,首要的功能是提供車輛的各種工況數據。利用汽車OBD接口與汽車ECU通過CANBUS協議通信,就可以達到控制汽車某些部件的目的。為了消除此安全隱患,需要在OBD接口與CAN總線之間接入能夠保證信息安全的CAN中繼器,實現信息可靠傳輸與非法指令過濾。目前CAN中繼器的設計大多是MCU加控制器來實現的。例如文獻[3]中利用雙MCU實現CAN總線中繼器,文獻[4?5]中利用雙口RAM實現雙機系統的通信,文獻[6]中通過獨立雙CAN設計CAN中繼器等,在這些方案中,不僅電路冗余復雜,同時在MCU與CAN控制器交換數據時存在數據交換速度慢,準確性低等問題,而且沒有相應系統的支撐,僅憑借獨立的硬件設備,很難保證車載信息傳輸安全。
基于上述分析,本文提出車載信息安全系統中繼器的設計方案。此中繼器一端通過CAN接口與OBD相連接,另一端通過CAN接口與CAN總線相連接。當中繼器接收到來自OBD接口發送的指令后,經過指令判斷與過濾,確定指令是否可以轉發到CAN總線上。本文完成了此中繼器在嵌入式Linux系統下的驅動和中繼,并加入ISO15031汽車指令集過濾器,通過嵌入式Linux系統自身的安全屬性以及指令過濾增強了整個CAN總線系統的安全性。
1 硬件設計
本文采用i.MX6Quad處理器,該處理器是基于Cortex?A9內核的四核處理器,帶有1 MB L2緩存和64 b DDR3和2通道、支持32 b LPDDR2。
硬件結構圖包含五個組成部分,如圖1所示。
其中:系統控制部分由鎖相環、振蕩器、時鐘與復位電路、看門狗、定時器等組成;電源管理部分由電源模塊和濕度監測儀組成;程序燒寫模塊采用NorFlash,便于進行撥碼燒寫;兩個CAN接口的設計借助了參考文獻[7]中提到的問題和解決方法。具體設計如圖2所示。
為了保證中繼器工作可靠,采用隔離型的DC/DC變換器[7]。對于CAN終端電阻使用分裂終端的方式,利用兩個30 Ω電阻匹配屏蔽雙絞線的60 Ω特性阻抗[8]。CAN控制器選擇了基于SPI控制器的MCP2515。
指示燈部分共使用了7個LED燈,1個燈用于上電指示,4個燈用于兩路CAN接口的接收和發送指示燈,2個燈用于兩路CAN通信故障指示。
2 CAN中繼器程序設計
2.1 CAN接口驅動程序設計
CAN總線驅動程序的設計以Linux系統為開發平臺,通過字符設備驅動的方式實現驅動程序的設計。
根據硬件設計圖,MCP2515通過SPI的形式接入內核,通過向Linux內核添加SPI驅動對MCP2515進行驅動。在Linux 3.0.35的內核中,SPI的驅動架構可以分為如下三個層次:SPI 核心層、SPI控制器驅動層和SPI設備驅動層。具體驅動的結構圖如圖3所示。
Linux 中SPI驅動代碼位于drivers/spi/spi.c目錄。SPI核心層是Linux的SPI核心部分,提供了核心數據結構的定義、SPI控制器驅動和設備驅動的注冊、注銷管理等API。SPI控制器驅動層屬于平臺移植相關層。它的職責是為系統中每條SPI總線實現相應的讀寫方法[9?10]。SPI設備驅動層為用戶接口層,其為用戶提供了通過SPI總線訪問具體設備的接口。寫驅動程序時首先要向Linux內核注冊設備,注冊完成后,執行make menuconfig配置內核選項,然后再編譯內核,最后通過Mini USB接口將編譯好的內核、文件系統一起燒寫到集成的模塊中。
2.2 CAN數據中繼原理及程序設計
CAN中繼的主要作用是對接收到的CAN報文進行過濾轉發。中繼器的工作流程為:中繼器上電時通過讀取波特率設置電路和ID設置電路的狀態,設置好波特率和ID值。初始化完成后,iMX6Q通過監聽兩個CAN接口的中斷完成數據的存儲轉發。當CAN接口A收到總線上的數據包時產生中斷,中斷處理程序根據標準標識符和擴展標識符判斷該數據包是標準幀還是擴展幀,同時將該ID值和ID過濾表中的值進行對比,若符合過濾條件則不轉發,否則將數據包通過CAN接口B轉發出去[11?12]。
根據本文需要,要求保證車載信息安全,需要結合ISO1503汽車故障診斷協議,實現協議過濾器功能。ISO1503協議內容有9種模式[13],I協議過濾器根據這9種模式列出所有合法指令集,如果接收的指令匹配指令集,允許指令通過,否則丟棄。
根據上文完成兩個CAN接口的驅動,在此只需實現數據的轉發和過濾,由于此設備是用于汽車CAN總線上,防止黑客通過OBD接口使用非法指令對汽車進行攻擊,因此結合汽車OBD指令集協議ISO15031完成指令集的過濾。具體數據中繼實現流程如圖4所示。
對于數據轉發的處理過程,通常采用環形緩沖區的方式來實現。在參考文獻[9]中提出關于環形緩沖器的問題:讀和寫在移動尾指針時均需進行 “折行處理 ”(即當指針指到緩沖區內存的末尾時,需重新將其定向到緩沖區的首地址),環形緩沖區的執行效率并不高[14]。為此,本文根據i.MX6Quad處理器的特點(自帶32 KB的數據緩沖區域),對環形緩沖區做了改進,同時為了增強CAN總線的通信能力,提高通信效率。具體做法為:
(1) 在緩沖區域開辟兩個4 KB的環形數據緩沖區,采用雙FIFO的緩沖機制,在主監控程序的監控下對兩路緩沖區進行監控。
(2) 當主監控程序檢測到CAN接口有信息傳輸時,此CAN接口產生中斷,兩路CAN數據通過中斷的方式將接收到的報文通過標識符的比較,放入各自對應的環形緩沖區。
(3) 轉發進程通過判斷比較緩沖區的狀態標識符決定轉發的端口[15],將接收到的指令與配置文件ISO15031協議中的指令集進行匹配,決定數據轉發或過濾,保證車載指令的安全。
3 中繼測試及安全測試
本文設計的測試板如圖5所示。
采用千目電子公司的USB轉CAN接口卡對系統進行測試驗證。CAN總線的通信速率最高為1 Mb/s,本系統遵循CAN 2.0A技術規范,仲裁域采用11 b標識符,再加上64 b的數據域、控制域、CRC域等,每幀數據幀的長度為110 b左右[16]。為了確定本實驗調試的通信速率,首先找到汽車CAN總線接口,使用示波器測出CAN總線的波特率為125 Kb/s。
3.1 中繼測試
CAN總線的傳輸距離與波特率有關,傳輸距離與波特率成反比,波特率越高,傳輸距離越短。根據上述測出的CAN總線波特率為125 Kb/s,傳輸距離可在0~530 m之間。由于本實驗設備直接與CAN總線相連,實驗測試中將實驗距離設為1.5 m。中繼測試實驗中將兩個CAN子網波特率設置為125 Kb/s,通過手動以及自動定時兩種向中繼器一端發送數據,觀察中繼器能否正常工作,且雙向通信是否均不丟幀。先由CAN1接口向CAN2接口發送標準幀07 DF 01 02 03,然后由CAN2接口向CAN1接口發送相同的標準幀。經過反復測試,抽取其中一次CAN2接口實驗結果,CAN2接口實驗結果如圖6所示。可以看出,CAN2接口既可以接收到數據,也可以發送數據,幀計數順序依次遞增,沒有出現丟幀現象。
3.2 安全測試
在中繼測試的基礎上又進一步做了多次安全測試,安全測試與上述中繼實驗的不同之處在于將07 DF 01 02 03標準數據幀變為02 00 aa aa aa數據幀(非法數據幀)以及其他多種非法數據幀,實驗結果為:當CAN1接口成功向CAN1接口發送數據幀時,CAN2接口沒有接收到數據;同樣當CAN2接口向CAN1接口發送數據幀時,CAN1接口也沒有收到數據。查看中繼器中的非法數據日志文件,里面記錄了發送的各種非法數據幀信息。實驗結果表明CAN中繼器能夠過濾掉非法指令。
4 結 論
本文基于信息傳輸在OBD接口上存在的安全問題,采用i.MX6Quad處理器方案實現CAN中繼器。同時實現了在Linux系統下CAN的接口驅動,完成了車載CAN總線中繼,使其性能和效率得到了很大提高;通過將Linux系統移植到硬件平臺上,在Linux系統中植入ISO15031汽車指令集過濾器,使得系統的安全性能得到提升。基于本方案開發的CAN中繼器通過了車載系統的安全測試,達到了預期的效果。
參考文獻
[1] 黎永健,趙祚喜.汽車CAN總線概述及其故障診斷檢測方法[J].應用科學,2010(2):119?120.
[2] REGT H D.車載網絡讓汽車駛上安全、舒適、環保的快車道[J].世界電子元器件,2007(12):27?29.
[3] 邱鐵,劉曉艷,徐子川.雙MCU的CAN總線中繼器設計[J].單片機與嵌入式系統應用,2008(9):71?73.
[4] 王剛.利用雙口RAM實現雙機系統的通信[J].計算機與數字工程,2008(1):123?124.
[5] 史久根,張培仁,陳真勇.CAN現場總線系統設計技術[M].北京:國防工業出版社,2004.
[6] 艾萱.基于獨立雙CAN控制器的中繼器設計與實現[J].現代電子技術,2007,30(21):9?11.
[7] 莫瓊華.基于STM32F105的CAN總線中繼器的設計與實現[J].電子技術,2011(3):25?26.
[8] 王繼國,吉吟東,孫新亞.CAN總線控制器MCP2515的原理及應用[J].電測與儀表,2004,41(1):52?56.
[9] 戴敏,曹杰.基于ARM的單芯片CAN總線中繼器設計[J].測控技術,2010(5):64?68.
[10] THOMPSON H A, BENITEZ?PEREZ H, LEE D, et al. A?CANbus?based safety?critical distributed earoengine control systems architecture demonstrator [J]. Microprocessors and microsystems, 1999, 23(6): 345?355.
[11] 曾祥文,宋樹祥,賓相邦.嵌入式Linux下波特率自適應的CAN總線驅動的實現[J].測控技術,2015(8):104?107.
[12] 朱振濤.基于ARM9的智能車載信息系統研究[D].秦皇島:燕山大學,2007.
[13] 劉仁峰.基于PCI總線的嵌入式設備驅動程序設計與研究[D].武漢:華中科技大學,2004.
[14] 楊峰,吉吟東,薛明.CAN通信卡的Linux設備驅動程序設計實現[J].電子技術應用,2002(1):52?55.
[15] BAEK S H, JANG J W. Implementation of integrated OBD?II connector with external network [J]. Information systems, 2014, 50: 69?75.
[16] 王宏亮,田帥帥.基于C8051F060單片機SPI接口的CAN中繼器設計[J].火炮發射與控制學報,2011(2):74?77.