1. 程式人生 > >鴻蒙OS的系統呼叫是如何實現的? | 解讀鴻蒙原始碼

鴻蒙OS的系統呼叫是如何實現的? | 解讀鴻蒙原始碼

本文將首先帶您回顧“系統呼叫”的概念以及它的作用,然後從經典的Hello World開始,逐行程式碼層層分析——鴻蒙OS的系統呼叫是如何實現的。 # 寫在前面 9月10號 華為開發者大會(HDC)上,華為向廣大開發者宣佈了鴻蒙2.0系統開源,原始碼託管在國內原始碼託管平臺“碼雲”上:[https://openharmony.gitee.com/](https://gitee.com/openharmony) 我也第一時間從碼雲下載了鴻蒙系統的原始碼,並進行了編譯和分析。當晚回看了HDC上的關於鴻蒙OS 2.0的主題演講,個人最為好奇的是——這次開源的liteos-a核心。因為它支援了帶MMU(記憶體管理單元)的ARM Cortex-A裝置;我們知道,在帶有MMU的處理器上,可以實現虛擬記憶體,進而實現程序之間的隔離、核心態和使用者態的隔離等等這些功能。 # 系統呼叫簡介 引用一張官方文件中的圖片,看看liteos-a核心在整個系統中的位置。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201125104118540.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center) 這次開源的鴻蒙系統中同時包含了兩個核心,分別是liteos-a和liteos-m,其中的liteos-m和以前開源的LiteOS相當,而liteos-a是面向應用處理器的作業系統核心,提供了更為豐富的核心功能。此前已經開源的LiteOS,只是一個實時作業系統(RTOS),它主要面向的是記憶體和快閃記憶體配置都比較低的微控制器。 我們先來簡單回顧一下作業系統課程的一個知識點——系統呼叫,以及為什麼會有系統呼叫?它的作用是什麼?如果你對於這兩個問題以及瞭然於心,可以直接跳過本段,看後面的原始碼分析部分。 在微控制器這樣的系統資源較少的硬體系統(比如STM32、MSP430、AVR、8051)上,通常直接裸跑程式(也就是不使用任何作業系統),或者使用像FreeRTOS、Zephyr這一類的實時作業系統(RTOS)。這些實時作業系統中,應用程式和核心程式直接執行在同一個實體記憶體空間(因為這些裝置一般沒有MMU)上。而RTOS只提供了執行緒(或者叫任務),執行緒間同步、互斥等基礎設施;應用程式可以直接呼叫核心函式(使用者程式和核心程式只是邏輯上的劃分,本質上並沒有太大不同);一旦有一個執行緒發生異常,整個系統就會重啟。 而在ARM Cortex-A、x86、x86-64這樣的系統資源豐富的硬體系統上,SoC或CPU晶片內部一般集成了MMU,而且CPU有特權級別狀態(狀態暫存器的某些位)。基於特權級別狀態,可以實現部分硬體相關的操作只能在核心態進行,例如訪問外設等,使用者態應用程式不能訪問硬體裝置。在這樣的系統上,系統呼叫是使用者態應用程式呼叫核心功能的請求入口。通俗的說,系統呼叫就是在有核心態和使用者態隔離的作業系統上,使用者態程序訪問核心態資源的一種方式。 # 從Hello World開始 接下來,我們一起從鴻蒙系統原始碼分析它在liteos-a核心上是如何實現系統呼叫的。鴻蒙OS使用了musl libc,應用程式和系統服務都通過musl libc封裝的系統呼叫API介面訪問核心相關功能。 下面,我們就從經典的helloworld分析整個系統呼叫的流程。鴻蒙系統目前官方支援了三個晶片平臺,分別是Hi3516DV300(雙核ARM Cortex A-7 @ 900M Hz),Hi3518EV300(單核ARM Cortex A-7 @ 900MHz 內建64MB DDR2記憶體)和Hi3861V100(單核RISC-V @160M Hz 內建 SRAM 和 Flash)。其中Hi3516和Hi3518是帶有Cortex A7核心的晶片,鴻蒙系統在這兩個平臺使用的核心自然是liteos-a。根據官方指導文件,我們知道這兩個平臺的第一個應用程式示例都是helloworld,原始碼路徑為:applications/sample/camera/app/src/helloworld.c,除去頭部註釋,程式碼內容為: ```java #