多核處理器下智能車載平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)
初始化頁(yè)表
本文引用地址:http://butianyuan.cn/article/146841.htm在OMAP4430硬件平臺(tái)上,同構(gòu)的兩個(gè)處理器內(nèi)核共享同一個(gè)硬件MMU資源,因此在基于Linux的驅(qū)動(dòng)源碼初始化MMU硬件后,整個(gè)系統(tǒng)都運(yùn)行在虛擬地址模式下,接下來(lái)MMU模塊調(diào)用__create_page_table創(chuàng)建了整個(gè)系統(tǒng)的臨時(shí)頁(yè)表。然后程序跳轉(zhuǎn)至Linux內(nèi)核入口函數(shù)start_kernel()處,在該函數(shù)中啟用SMP,在SMP模塊的__cpu_up函數(shù)中插入創(chuàng)建SmartOSEK OS頁(yè)表的操作osek_setup_pgd()。最后,在start_kernel中調(diào)用自定義的函數(shù)osek_mm_init(),對(duì)臨時(shí)頁(yè)表中SmartOSEK OS對(duì)應(yīng)的區(qū)塊進(jìn)行重映射,分配一個(gè)新的物理地址空間,改寫頁(yè)表將新分配的物理地址對(duì)應(yīng)于該段虛擬地址,使得SmartOSEK OS物理內(nèi)存對(duì)Android內(nèi)核不可見,從而完成了二者內(nèi)存資源的相互隔離。
創(chuàng)建中斷向量
在系統(tǒng)初始化后,大部分的硬件外設(shè)資源都將分配到對(duì)應(yīng)的操作系統(tǒng)中的中斷向量表中。對(duì)于Android OS在cpu0完成系統(tǒng)初始化后,系統(tǒng)就只生成Android OS私有資源對(duì)應(yīng)的中斷向量表。而在SmartOSEK OS中,中斷向量表是針對(duì)于物理地址模式的,需要在MMU設(shè)備映射函數(shù)中增加申請(qǐng)一頁(yè)空間作為SmartOSEK OS中斷向量表,并將其入口的邏輯地址臨時(shí)定為0xffff8000。通過(guò)osek_setup_pgd()函數(shù)拷貝臨時(shí)頁(yè)表后,需要將中斷向量表所屬的頁(yè)表進(jìn)行重新映射為0xffff0000,以滿足硬件平臺(tái)的要求。最后在異常向量初始化函數(shù)kuser_get_tls_init的最后調(diào)用自定義函數(shù)osek_setup_vectors(),將SmartOSEK OS物理地址模式下的中斷向量表osek_vectors拷貝到新建的實(shí)時(shí)內(nèi)核中斷向量表中。
設(shè)置系統(tǒng)入口
在完成資源分區(qū)后,主核cpu0觸發(fā)核間中斷啟動(dòng)第二個(gè)核cpu1。為了將實(shí)時(shí)內(nèi)核SmartOSEK OS綁定到cpu1上,需要將cpu1的運(yùn)行入口,即cpu1響應(yīng)主核核間中斷的處理函數(shù)更改為SmartOSEK OS的入口函數(shù)。因此需要改寫相應(yīng)的函數(shù)secondary_start_kernel(),調(diào)用osek_entry()啟動(dòng)SmartOSEK OS。并在osek_entry()中初始化cpu1私有定時(shí)器資源。
內(nèi)核間通信
在共享內(nèi)存空間上劃分出三段連續(xù)的空間分別用于同步數(shù)據(jù)緩沖區(qū)和兩個(gè)方向上異步通信的消息隊(duì)列。如圖3所示。src字段為消息的發(fā)送方執(zhí)行實(shí)體的ID,dest字段為消息接受方處理實(shí)體的ID。size字段為消息的有效長(zhǎng)度。msg字段為消息的內(nèi)容。共享內(nèi)存是通過(guò)靜態(tài)分配實(shí)現(xiàn)的,同步消息緩沖區(qū)和異步消息隊(duì)列一條消息的最大長(zhǎng)度和隊(duì)列大小等信息需要靜態(tài)配置?! ?/p>
通過(guò)核間中斷的方式實(shí)現(xiàn)通信的雙方信號(hào)的發(fā)送。在主核cpu0上注冊(cè)四個(gè)新的核間中斷。前兩二個(gè)中斷用于發(fā)送方觸發(fā)信號(hào)通知接收方數(shù)據(jù)發(fā)送完成;后兩個(gè)中斷用于同步數(shù)據(jù)時(shí),Android向SmartOSEK發(fā)出的同步發(fā)送信號(hào),以及SmartOSEK接收完成數(shù)據(jù)后發(fā)出的反饋信號(hào)。當(dāng)發(fā)生核間中斷時(shí),中斷處理函數(shù)osek_handle_IPI()判斷當(dāng)前觸發(fā)的核間中斷類型并調(diào)用相應(yīng)的響應(yīng)函數(shù)。
平臺(tái)驗(yàn)證
對(duì)于分區(qū)功能,主要測(cè)試Android OS和SmartOSEK OS能夠正確啟動(dòng),二者能夠分別運(yùn)行在兩個(gè)處理器上并訪問(wèn)各自的私有資源,正確響應(yīng)對(duì)應(yīng)資源相關(guān)的中斷而互不干擾。圖4為系統(tǒng)運(yùn)行時(shí)通過(guò)串口打印的部分log信息,此時(shí)SmartOSEK周期性地調(diào)用任務(wù)4到任務(wù)0,Android執(zhí)行其他初始化的工作?! ?/p>
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論