Zynq UltraScale+ MPSoC 的核心 ARMv8 架構使系統設計人員只需極少量修改就可以快速啟用并運行現有的 ARMv7 代碼。這種架構兼容性使設計人員可以提高生產力,加速產品上市進程,同時減少開發成本和工程設計投資。
簡 介
WP473
軟件設計人員運用基于新一代 ARMv8 架構的賽靈思 Zynq UltraScale+ MPSoC,不僅可以充分利用其先進性能,同時還能保持現有軟件投資。
在美國計算機學會雜志《美國計算機協會通訊全集》的一篇專欄中,Steve Furber 指出,32 位 ARMv7 SoC(例如 Zynq UltraScale+ MPSoC)是最豐富和最受歡迎的 SoC 產品。[ 參考資料 1]另一層隱含的意義是:ARMv7 SoC 的用戶群很大,意味著軟件—— 從簡單的庫、工具一直到完整操作系統—— 的用戶群更為龐大。最近,隨著向 64 位平臺的移植持續加速,系統設計人員面臨的問題在于:是花大力氣將現有軟件移植到新架構,還是簡單地在新平臺上重新開始開發軟件。[ 參考資料 2]
任何一個具有一定規模的軟件項目都需要投入大量的人力和軟件架構。損失這些投資無論從短期還是長期看對項目都有毀滅性影響。因此,SoC 平臺之間的軟件移植會帶來很大不確定性。移植不當很容易導致功能和性能不理想。在這個需要縮減設計預算和加速產品上市進程的時代,不允許有太多的不確定性。
賽靈思 Zynq 產品組合的最新成員 Zynq UltraScale+ MPSoC 采用新一代 ARMv8 架構,其精湛的設計可解決上述種種問題。ARMv8 采用設計人員熟悉的 CPU 架構和軟件開發流程,使他們能夠立即著手進行項目移植,且可將現有軟件基礎架構投資損失降至最低。
ARMv8 通過設計簡化軟件移植
Zynq UltraScale+ MPSoC 中的 ARMv8 架構與前代 ARMv7 架構兼容,同時可擴展支持最新特性與功能,因此能夠從根本上簡化軟件移植。這樣可創建熟悉的開發環境,讓軟件開發人員在移植過程伊始就能專注于代碼本身。ARMv8 架構通過兩種基本方式實現這種深度兼容:
ARMv8 架構支持兩種不同執行狀態:
AArch32,本機 32 位狀態
AArch64,本機 64 位狀態
AArch64 狀態中的 64 位 ARMv8 指令集是 ARMv7 中指令集的自然延伸;AArch32 狀態中的 32 位指令集直接兼容于 ARMv7 中的指令集。
AArch64 執行狀態是本機 ARMv8 執行環境。它支持 ARMv8 架構的完整特性集與功能。相反,AArch32 執行狀態提供與 ARMv7 環境的本機向后兼容。從軟件執行角度來看,該狀態為本機 ARMv7 環境。開發人員可選擇讓代碼在編譯時間內在哪種執行狀態下運行。正常運行時間內,CPU 可在 AArch64 和 AArch32 這兩種執行方式之間即時切換,以提供軟件所要求的執行環境。這些上下文變化發生在異常邊界,無需用戶或軟件設計人員進行輸入;32 位代碼和64 位代碼高效并行執行。
當在 AArch64 狀態下運行時,提供完整的 64 位 ARMv8 指令集。很大程度上,64 位 ARMv8 指令集是ARMv7 中指令集的延伸。只需對指令集在語法和行為上稍加修改,就能支持 32 位指令以及 32 位與 64 位混合寄存器。當在 AArch32 狀態下運行時,處理器使用標準 32 位指令以及 32 位寄存器;軟件設計人員處理指令集的方式與使用其他 ARMv7 處理器時相同。
使用代碼庫
WP473
低層裸機和 RTOS 代碼開發人員是受低層處理器架構差別影響最多的人。當開始移植軟件時,最佳方式是啟用編譯器中所有警告和錯誤消息,使用 ARMv8 編譯器重新簡單編譯軟件,不做修改。對這種方式下生成的警告或錯誤信息進行分析,這樣軟件開發團隊可以確定哪些錯誤可以忽略,以及哪些需要在移植過程中加以注意。
ARMv8 編譯器本機支持標準高級代碼,例如 C 和 C++ ;當有合適的 ARMv8 板支持包 (BSP) 時,可編譯和運行這類代碼。相比之下,匯編代碼時則需要特別注意如何使用代碼。盡管 ARMv8 中依然存在諸多 ARMv7 匯編指令,但是它們的語法或行為存在微秒的變化。有些編碼結構的編譯或行為與 ARMv7 不同,其中包括:硬編碼存儲器位置( 適用任何軟件移植項目)、對 ARMv7 協處理器( 例如 CP15) 和寄存器名稱的訪問,以及數據對齊。由ARM 發布的ARM Cortex -A 程序員ARMv8-A 使用指南 (DEN0024A) 對移植問題進行了詳細的分析。
我們不妨看看容易移植的代碼實例以及會產生問題的代碼,這樣有助于我們從概念上討論架構之間的區別。
有的指令只需很少的操作就可從 ARMv7 轉換為 ARMv8 語法,ADD 指令就是個很好的例子。ARMv7 中的寄存器的命名方案為 Rn,其中 n 是寄存器的個數。這樣命名直接了當,因為 ARMv7 中所有寄存器都是 32 位。在 ARMv8 中,寄存器既可以是 32 位也可以是 64 位。32 位寄存器的命名方案為 Wn,而 64 位寄存器的命名方案則為 Xn。這樣軟件設計人員必須根據正在考慮的操作對象的尺寸,對現有的代碼進行評估并適當地修改。見表 1。
表 1 :ADD 各種環境中指令命名方案
ARMv7 | ARMv8 A32 |
ARMv8 A64 (32位) |
ARMv8 A64 (64 位) |
ADD Rd, Rn | ADD Rd, Rn | ADD Wd, Wn | ADD Xd, Xn |
移植 ADD 這樣的指令不僅需要評估代碼的最終用途,還要相應地改變寄存器名稱。根據整個代碼庫的復雜程度,甚至可以自動執行移植。
其他情況下,例如訪問 ARMv7 協處理器,可能需要更全面的代碼分析。這種分析被認為是最佳方法,因為協處理器控制很多針對整個處理器的系統級屬性和功能,而且控制協處理器是針對ARMv7 的常見操作。
當在 AArch64 狀態下運行時,無法直接訪問 CP15 寄存器,因為它們不在 ARMv8 架構中。當在 AArch32 狀態下運行時,則可通過概念協處理器訪問它們。這是由 AArch32 執行狀態提供的結構,用于為原有的 32 位代碼提供一致的執行環境。
例如,假設一個程序需要 Main ID Register —— 協處理器 CP15 中 c0 寄存器的一部分—— 的內容。使用 ARMv7 的專用 MRC 指令和 ARMv8 的 AArch32 執行狀態訪問這個值:
MRC p15, 0, r1, c0, c0, 0
直接在 AArch32 狀態運行的原有代碼無需修改;但移植到 AArch64 狀態的代碼需要根據新架構的要求進行調整。
在本機 AArch64 執行狀態下,Main ID Register 值位于名為 MIDR_Eln 的新專用寄存器中。該寄存器可方便地通過系統寄存器訪問指令來訪問。
MRS:
MRS x1, MIDR_EL1
因此,開發人員應該知道這種專用操作和調用,以便相應地更改匯編指令。同樣,這是單行修改,不會影響周圍軟件代碼的整體結構。此外,還要注意源寄存器和目標寄存器都是本機 64 位寄存器,與 64 位架構的其余部分一致。
保持現有軟件完整
WP473
對基于 Linux 操作系統的軟件而言,移植條件通常比 RTOS 或裸機代碼更直接。底層的 Linux 操作系統可通過抽象消除很多底層硬件中的差異。大多數情況下,只需使用 64 位 Linux 編譯器進行重新編譯就可以讓代碼運行在 64 位 Linux 上。賽靈思 PetaLinux 工具可針對64 位 Linux 環境在本機中整合和重新編譯代碼,從而自動執行該過程。
其他情況下,開發人員可能需要使代碼保持為 32 位二進制數。軟件可能需要與只有 32 位形式的外部庫鏈接;或者包含需要花時間轉換的 32 位匯編代碼。移植這類軟件時,可利用很多現代 Linux 版本中都有的 multiarch 或 multib 功能實現顯著加速。盡管不是完全一樣,但這些經常可以互換使用。
Multiarch 是一種系統和文件系統布局的配置方法,以便運行 32 和 64 位動態鏈接程序。原來的32 位 ARMv7 Linux 程序無需修改,可直接導入,并與新的 64 位程序共存。該功能可用來快速建立并運行系統,同時移植特定的 32 位應用程序并針對底層 64 位架構進行微調。
支持Multiarch 的版本將 32 位和64 位庫納入相同 Linux 文件系統中,以實現這種兼容性。當執行 64 位應用時,使用本機 64 位庫;32 位應用則使用 32 位庫。
創建和維護 multiarch 操作系統需要投入不少時間。幸好,開源項目,例如 Yocto Project、Canonical 和 Linaro,提供易于集成的內容。Yocto Project 提供完整的端對端構建系統;Canonical 和 Linaro 提供現成可用的參考文件系統,使開發人員快速取得進展。賽靈思答復66636 詳細介紹了如何在 ZCU102 評估平臺上集成 Ubuntu Core 14.04 文件系統。
默認情況下,這些 multiarch 文件系統只使用 64 位應用程序。由于它們基于 dpkg 管理工具,因此只需簡單的命令行接口即可添加更多架構:
# dpkg -add-architecture armhf
配置 dpkg 工具以支持 32 位架構( 例如 armhf),然后,使用更高級的封裝管理工具,例如 apt-get,就像在 Linux 的 Intel x86 兼容版本上一樣。
對于有些系統來說,通過 multiarch 在 64 位主機上運行現有的 32 位應用程序就足夠了,無需其他工作。對于其他系統,multiarch 可起到節省時間的作用,同時還要對軟件協議棧的其他部分進行微調,并針對底層 64 位架構和操作系統來優化它們。
總 結
WP473
ARMv8 為軟件開發人員提供很多性能、安全和架構方面的新功能,但是,如果軟件開發人員因擔心丟掉現有的軟件架構而不愿意使用它,那么這些新功能也就無用武之地。ARMv8 可從硬件和軟件接口實現處理器架構的自然演進,從而消除這種顧慮。將開發人員熟悉的指令集實現自然演進,以此簡化低級代碼的移植。此外,還可以回退到 AArch32 狀態,這樣開發人員就能夠快速運行現有的32 位代碼,以最少的時間和精力在新硬件上評估代碼。最后,multiarch Linux 允許將一些代碼不經任何修改直接運行,這樣就可以顯著減少整體系統集成。ARMv8 處理器,例如 Zynq UltraScale+ MPSoC 允許開發人員利用新一代功能并保持原有軟件投資。
-
賽靈思
+關注
關注
32文章
1794瀏覽量
131246 -
C++
+關注
關注
22文章
2108瀏覽量
73622 -
編譯器
+關注
關注
1文章
1623瀏覽量
49108
發布評論請先 登錄
相關推薦
評論