魯 振,胡堅升,李名揚
(中軟信息系統工程有限公司,北京 102209)
近年來,以自主CPU+OS為核心的國產基礎軟硬件生態體系不斷發展和完善,但仍存在一些短板和弱項,比如基礎軟件方面,操作系統多是基于開源的Linux系統,經常會導致軟件開發與運行存在運行依賴庫不規范、應用軟件版本混亂、沖突等問題。基于系統開發和運行的實踐,當前國產基礎軟件生態體系主要存在以下四個方面的問題。
(1)開發嚴重碎片化。Linux上存在太多的開發庫,國產操作系統缺少一套類似微軟.NET框架的統一開發解決方案,開發者難以選擇最佳的開發語言、開發庫和開發環境,比如對C/C++而言,主流的用戶 界 面 (UI)程 序 開 發 有 Gtk、Qt、WxWidget 三 種 ,同時 Gtk本身又有 Gtk2和 Gtk3系列[1],Qt有 Qt4和 Qt5區分。Linux應用軟件開發者需要一套開發和運行的行業標準,解決開發框架選擇難、開發文檔少或無、開發庫版本多、開發接口不統一等問題。
(2)權限控制機制存在安全隱患。主流的國產操作系統使用基于用戶角色的權限控制機制,應用一般具備諸如訪問用戶文件[2]、訪問其他應用數據[3]、使用網絡和外部設備[4]等權限。雖然大多數的 Linux發 行 版(典 型 的 如 Debian、Ubuntu、Redhat、Centos)都提供自身的軟件包維護機制,用戶往往也使用值得信賴的源下載應用,但病毒往往也會利用應用程序這條路徑植入傳播。用戶對一些程序的非法操作往往會導致嚴重的安全問題,給自身帶來極大的困擾。例如用戶使用的應用程序需要訪問網絡時,有可能會從不安全的站點下載惡意程序,執行一些非法操作,如盜取用戶的敏感信息,干擾用戶的日常工作、數據安全和個人隱私等,用戶需要一種有效的保護計算機安全的方法,比如利用沙箱技術給應用程序提供隔離的運行空間。
(3)跨架構應用移植不統一。應用軟件可移植性越來越受到關注,諸如Java、Python等語言都提供一套虛擬機用于屏蔽底層處理器和操作系統差異[5],但是對于C/C++等平臺相關編程語言,目前缺少一種跨架構的可移植開發運行解決方案[6]。
(4)應用軟件版本混亂。主流的國產操作系統發行版都使用類似RPM、DPKG等打包系統構建,最大的特點是上游開發者和下游軟件包維護者(打包者)明顯地區分開。上游應用開發者編寫代碼,下游發行者獲取并將其轉化(編譯、編寫規則并重新打包)為 RPM或DEB包;最后安裝到本地系統中。這種場景在一定程度上解決了包的風險問題,因為軟件包維護者往往會選擇值得信賴和功能可靠的應用,但是也難以避免地暴露一些問題,上游應用開發者往往希望更高的發布速度,而事實上完全依賴下游發行者打包開發的應用,下游發行者決定具體的調度、申明、打包、提供支持等規則。應用本身的實際測試變得十分困難,因為最終用戶往往可能使用不同的包版本,應用在某個發行版的某個版本下的測試,無法確定應用在其他發行版和其他版本的任意組合下都能正常運行;要測試應用在某個發行版的某個版本下的運行,開發者往往需要安裝該發行版的版本環境,并編譯運行該應用,這將是一項繁雜的工作。
針對國產基礎軟硬件生態環境下應用軟件開發與運行存在的問題,設計多架構應用軟件開發及運行庫服務系統,目標主要有以下三點:
(1)提供跨平臺多架構的統一運行庫,屏蔽底層軟硬件差異,使應用更易于分發到不同的平臺架構,該運行庫覆蓋最基本的C/C++標準庫、Python虛擬機、Java虛擬機等應用基本運行環境。
(2)提供統一和容易使用的開發接口,解決Linux上開發庫的碎片化問題。
(3)提供應用運行沙箱,沙箱提供了文件系統隔離、系統資源隔離、物理資源隔離、權能限制和強制訪問控制等策略,盡可能地防止上層應用直接訪問底層主機,減少應用程序對主機造成的影響,為用戶提供一個獨立和安全的運行環境。
根據以上目標,應用軟件開發及運行庫服務整體框架如圖1所示。

圖1 多架構應用軟件開發及運行庫服務系統整體設計
多架構應用軟件開發及運行庫服務系統(CCF)自底向上分為操作系統態、運行態(CRE)、開發態(CDK)、應用態和分發態。其中,操作系統層包括當前所有主流的Linux發行版和底層處理器架構,多架構應用軟件開發及運行庫服務系統可支持所有主流Linux發行版和絕大部分處理器架構。CCF可屏蔽操作系統和處理器架構差異,基于CCF開發和運行的應用軟件僅依賴于相應類型的CCF,與操作系統差異無關。使用操作系統類庫,并直接運行于主機系統的應用軟件屬于非托管應用,這些應用一般與平臺類型相關。運行層包括沙箱、核心基礎庫(如libc、glib、xlib等庫)、編程語言通用庫(分為用戶界面、多媒體、進程通信、數據庫操作等20多種類型)、編程語言執行引擎(如 C++標準庫 libstdc++、Java虛擬機、Python虛擬機、PHP執行引擎、JavaScript解析引擎等)。開發層實際上是運行態加上開發應用必須的頭文件、編譯器、jar包、python模塊等文件組成的。使用CCF開發并依賴CCF運行的應用是“托管”應用,并以“CPK”的方式分發。

圖2 多架構應用軟件運行時框架
2.1.1 多架構應用軟件開發及運行核心框架運行時(CRE)
多架構應用軟件運行時提供了基于良好定義且高度優化的環境,以支撐應用軟件的運行。這里指的運行時實際上是一系列不同架構、不同版本的運行時。運行時包括 C/C++、Python、Java等高級語言基本運行環境,具體表現為可執行文件、動態鏈接庫、資源文件、配置文件、腳本等。運行時本身又分為基本運行時和開發運行時,前者是支撐一個應用運行的最小環境,后者則在包含前者的基礎上,添加編譯和調試應用所需的基本環境。運行時的整體設計如圖2所示。
2.1.2 多架構應用軟件開發及運行核心框架開發工具(CDK)
多架構應用軟件開發工具由開發運行時、工具鏈、基礎類庫、公共接口、應用框架組成,支持 C/C++、Java、PHP、Python等多種編程語言,提供統一的公共編程接口和通用基礎類庫。利用工具鏈編譯、虛擬機運行等方式實現應用程序在沙箱中的最終運行。圖3展示了開發框架的各個層次。
2.1.3 多架構應用軟件運行沙箱(CCF Sandbox)
多架構應用軟件運行沙箱是一套整合了內核cgroups、namespaces、selinux、kdbus、systemd 和 wayland顯示服務器的應用運行沙箱機制。基本的原則是,應用以普通用戶身份執行,只具備最低的訪問權限。更多的權限需要通過權限定義和提權。與一般的沙箱不同,多架構應用軟件運行沙箱采用的是“資源是否可見”原則,而非“資源訪問控制”。與限制應用訪問操作系統資源權限不同,這里的沙箱默認應用軟件對操作系統資源不可見。當沙箱初始化完成后,首先建立文件系統,同時,某些白名單內的文件和路徑(一般是最基本的資源)隨之被掛載到命名空間(namespace),只有那些經過篩選、審查且被認為運行足夠穩定的文件或目錄才會被沙箱中的應用軟件訪問。圖4展示了沙箱和應用之間的關聯。
2.2.1 多架構應用軟件開發流程

圖4 安全沙箱設計框架
多架構應用軟件開發及運行庫服務系統主要由托管式應用的開發和運行兩個過程組成。 多架構應用軟件開發流程如圖5所示。

圖5 多架構應用軟件開發流程圖
2.2.2 多架構應用軟件運行流程
多架構應用軟件運行流程如圖6所示。
2.2.3 系統實現及驗證
本文以FT1500A(ARM64)、x86兩類CPU架構下的gedit應用軟件為例,驗證多架構應用軟件開發及運行方法從開發到運行的實現流程。
在構建一個gedit之前,先安裝應用軟件對應的運行時(CRE)、開發包(CDK)和沙箱工具。
首先創建目錄并初始化目錄,選擇對應的運行時和開發包:
$mkdir my-app
$ccf build-init./my-app gedit ccf/x86/1.0 ccf/x86/1.0
得到一個“metadata”文件(該文件用于定義一些環境配置和權限申明)和空的“my-app/files/”和“myapp/exports/”目錄。 然后使用“prefix=/app”構建應用軟件:
$ccf build./my-app./configure--prefix=/app
$ccf build./my-app make&&make install
“ccf”將會選擇對應開發包構建應用程序,構建完成的應用將安裝到“my-app/files”目錄。
接著需要導出一些資源文件(如desktop文件和圖標文件)并打包應用軟件:

圖6 多架構應用軟件運行流程圖
$ccf build-finish./my-app
最后將打包生成的應用轉化為deb、rpm或者cpk格式。并分發到對應架構的Linux平臺。該平臺在安裝對應版本(或較高版本)的基礎上運行該應用:
$ccf run gedit
本文對國產CPU+OS基礎環境應用軟件及運行依賴庫進行了研究,提出了一種多架構應用軟件開發及運行方法,設計了由多架構應用軟件開發及運行核心框架運行時(CRE)、多架構應用軟件開發及運行核心框架開發工具(CDK)、多架構應用軟件運行沙箱(CCF Sandbox)組成的多架構應用軟件開發及運行庫服務系統(CCF),探索了多架構應用軟件開發和運行流程,提供覆蓋支持多種高級語言開發、統一開發類庫及 API、托管應用運行、多架構可移植方案、沙箱安全機制等多個方面的服務。經過在 FT1500A、X86(CPU)+麒 麟(OS)兩類架 構 環 境 上驗證,該方法能夠為國產基礎軟硬件生態體系提供良好的多架構應用軟件開發及運行服務,為國產基礎軟硬件生態的軟硬件適配、整體解決方案提供技術支撐,可以作為國產基礎軟硬件生態體系應用軟件開發及運行的標準。