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