多核處理器下智能車(chē)載平臺的設計與實(shí)現
初始化頁(yè)表
本文引用地址:http://dyxdggzs.com/article/146841.htm在OMAP4430硬件平臺上,同構的兩個(gè)處理器內核共享同一個(gè)硬件MMU資源,因此在基于Linux的驅動(dòng)源碼初始化MMU硬件后,整個(gè)系統都運行在虛擬地址模式下,接下來(lái)MMU模塊調用__create_page_table創(chuàng )建了整個(gè)系統的臨時(shí)頁(yè)表。然后程序跳轉至Linux內核入口函數start_kernel()處,在該函數中啟用SMP,在SMP模塊的__cpu_up函數中插入創(chuàng )建SmartOSEK OS頁(yè)表的操作osek_setup_pgd()。最后,在start_kernel中調用自定義的函數osek_mm_init(),對臨時(shí)頁(yè)表中SmartOSEK OS對應的區塊進(jìn)行重映射,分配一個(gè)新的物理地址空間,改寫(xiě)頁(yè)表將新分配的物理地址對應于該段虛擬地址,使得SmartOSEK OS物理內存對Android內核不可見(jiàn),從而完成了二者內存資源的相互隔離。
創(chuàng )建中斷向量
在系統初始化后,大部分的硬件外設資源都將分配到對應的操作系統中的中斷向量表中。對于A(yíng)ndroid OS在cpu0完成系統初始化后,系統就只生成Android OS私有資源對應的中斷向量表。而在SmartOSEK OS中,中斷向量表是針對于物理地址模式的,需要在MMU設備映射函數中增加申請一頁(yè)空間作為SmartOSEK OS中斷向量表,并將其入口的邏輯地址臨時(shí)定為0xffff8000。通過(guò)osek_setup_pgd()函數拷貝臨時(shí)頁(yè)表后,需要將中斷向量表所屬的頁(yè)表進(jìn)行重新映射為0xffff0000,以滿(mǎn)足硬件平臺的要求。最后在異常向量初始化函數kuser_get_tls_init的最后調用自定義函數osek_setup_vectors(),將SmartOSEK OS物理地址模式下的中斷向量表osek_vectors拷貝到新建的實(shí)時(shí)內核中斷向量表中。
設置系統入口
在完成資源分區后,主核cpu0觸發(fā)核間中斷啟動(dòng)第二個(gè)核cpu1。為了將實(shí)時(shí)內核SmartOSEK OS綁定到cpu1上,需要將cpu1的運行入口,即cpu1響應主核核間中斷的處理函數更改為SmartOSEK OS的入口函數。因此需要改寫(xiě)相應的函數secondary_start_kernel(),調用osek_entry()啟動(dòng)SmartOSEK OS。并在osek_entry()中初始化cpu1私有定時(shí)器資源。
內核間通信
在共享內存空間上劃分出三段連續的空間分別用于同步數據緩沖區和兩個(gè)方向上異步通信的消息隊列。如圖3所示。src字段為消息的發(fā)送方執行實(shí)體的ID,dest字段為消息接受方處理實(shí)體的ID。size字段為消息的有效長(cháng)度。msg字段為消息的內容。共享內存是通過(guò)靜態(tài)分配實(shí)現的,同步消息緩沖區和異步消息隊列一條消息的最大長(cháng)度和隊列大小等信息需要靜態(tài)配置?! ?/p>

通過(guò)核間中斷的方式實(shí)現通信的雙方信號的發(fā)送。在主核cpu0上注冊四個(gè)新的核間中斷。前兩二個(gè)中斷用于發(fā)送方觸發(fā)信號通知接收方數據發(fā)送完成;后兩個(gè)中斷用于同步數據時(shí),Android向SmartOSEK發(fā)出的同步發(fā)送信號,以及SmartOSEK接收完成數據后發(fā)出的反饋信號。當發(fā)生核間中斷時(shí),中斷處理函數osek_handle_IPI()判斷當前觸發(fā)的核間中斷類(lèi)型并調用相應的響應函數。
平臺驗證
對于分區功能,主要測試Android OS和SmartOSEK OS能夠正確啟動(dòng),二者能夠分別運行在兩個(gè)處理器上并訪(fǎng)問(wèn)各自的私有資源,正確響應對應資源相關(guān)的中斷而互不干擾。圖4為系統運行時(shí)通過(guò)串口打印的部分log信息,此時(shí)SmartOSEK周期性地調用任務(wù)4到任務(wù)0,Android執行其他初始化的工作?! ?/p>
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論