欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙OS代碼學(xué)習(xí):init進(jìn)程的相關(guān)代碼

鴻蒙系統(tǒng)HarmonyOS ? 來源:CSDN 博主 ? 作者:阿拉神農(nóng) ? 2021-03-26 16:24 ? 次閱讀

作者介紹:

中科創(chuàng)達(dá)OpenHarmony研究組

說明:

中科創(chuàng)達(dá)OpenHarmony研究組第一時(shí)間對(duì)https://codechina.csdn.net/openharmony上開源的代碼進(jìn)行了詳盡的代碼研讀和學(xué)習(xí)。為此,我們打算編寫一系列篇幅中等,內(nèi)容精煉的源碼分析文章來引領(lǐng)大家更進(jìn)一步的走進(jìn)鴻蒙OS。隨著對(duì)代碼的了解,廣大開發(fā)者想親自動(dòng)手參與的意愿和信心也會(huì)隨之增強(qiáng)——這也是鴻蒙OS開源的意義所在。

本篇內(nèi)容摘要:

本篇以O(shè)penHarmony中ipcamera_hi3518ev300為編譯目標(biāo),介紹init進(jìn)程的相關(guān)代碼。

寫在前面的話

我們對(duì)OpenHarmony的代碼進(jìn)行了一個(gè)簡(jiǎn)單粗略的統(tǒng)計(jì)。除去所有的third_party代碼(即OpenHarmony使用的第三方開源庫(kù)),其他剩余的代碼中,以.c、.h文件為統(tǒng)計(jì)入口,總有效代碼行數(shù)(不含注釋、空行等,統(tǒng)計(jì)工具為tSourceCounter)為325627行。其中,歸屬kernel目錄下的總有效代碼行數(shù)為74150行。整個(gè)OpenHarmony中,kernel部分占比為22.8%左右,代碼量上占大頭的還在于kernel之上的、我們稱之為Framework的部分。根據(jù)我們?cè)?a href="http://www.delux-kingway.cn/v/tag/502/" target="_blank">Android系統(tǒng)上多年的摸索和經(jīng)驗(yàn),F(xiàn)ramework恰恰是Android OS的精髓。所以,以O(shè)penHarmony目前才20多萬行的Framework代碼量來看,感興趣的開發(fā)者在這塊參與共建、獻(xiàn)策獻(xiàn)力的機(jī)會(huì)非常大。

1. OpenHarmony源碼的下載和編譯

先介紹代碼的下載和編譯。我們研究組用得是ubuntu 19.10的主機(jī)環(huán)境。

1.1 源碼下載

按照codechina.csdn官網(wǎng)的源碼下載指南:https://codechina.csdn.net/openharmony/docs/-/blob/master/get-code/%E6%BA%90%E7%A0%81%E8%8E%B7%E5%8F%96.md

我們使用的是第四種方式“獲取方式4:從代碼倉(cāng)庫(kù)獲取”。執(zhí)行這一節(jié)中的幾個(gè)命令,即可得到整個(gè)源碼倉(cāng)庫(kù)。

1.2 編譯源碼

我們選擇的編譯目標(biāo)是“Hi3518解決方案”,其編譯后的輸出目錄名為ipcamera_hi3518ev300。ipcamera_hi3518ev300是一個(gè)基于海思的ip攝像頭設(shè)備。相關(guān)的介紹文檔入口在https://codechina.csdn.net/openharmony/docs/-/blob/master/quick-start/%E6%90%AD%E5%BB%BA%E7%8E%AF%E5%A2%83-2.md。

注意,編譯不同的解決方案需要建立對(duì)應(yīng)的編譯環(huán)境。對(duì)hi3518來說,開發(fā)者需要按照上述鏈接里的“搭建環(huán)境”來下載和配置。

一切就緒后,在源碼根目錄下執(zhí)行 python build.py。如果不帶參數(shù)的話,它會(huì)提醒你指定編譯目標(biāo),截圖如下:

圖1 python build.py不帶參數(shù)的執(zhí)行結(jié)果

這次,我們通過python build.py ipcamera_hi3518ev300即可編譯“Hi3518解決方案”。編譯耗時(shí)10幾分鐘。

注意,編譯過程中可能出現(xiàn)找不到的錯(cuò)誤。這是因?yàn)槟壳拔覀兿螺d的代碼中沒有包含valgrind的頭文件。開發(fā)者可以手動(dòng)將/usr/include/valgrind目錄拷貝到prebuilts/lite/sysroot/usr/include下即可(僅限Ubuntu平臺(tái),需提前安裝好valgrind工具)。

1.3 OpenHarmony編譯相關(guān)小知識(shí)介紹

OpenHarmony源碼編譯系統(tǒng)使用了google開發(fā)的gn工具以及ninjia。這二者結(jié)合起來比傳統(tǒng)的makefile編譯系要高效,尤其適合大系統(tǒng)的并行編譯。對(duì)開發(fā)者而言,如果要參與OpenHarmony的開發(fā),需要對(duì)gn的語(yǔ)法有些了解。本文僅做一些最基本的介紹:

使用gn工具的話,開發(fā)者將編譯規(guī)則寫在名為BUILD.gn文件中。和Makefile一樣,gn文件有自己的語(yǔ)法規(guī)則,屬于領(lǐng)域語(yǔ)言(Domain Specific Language,DSL)。gn語(yǔ)法不難,但編譯規(guī)則本身有很多內(nèi)容,所以一下子要掌握全部?jī)?nèi)容也不容易。

gn支持自定義模板函數(shù),可放在名為.gni的文件中。OpenHarmony中最常見到的gn模板文件為./build/lite/config/component/lite_component.gni。.gn文件中通過import可導(dǎo)入gni模板文件。OpenHarmony定義了lite_component、lite_library等模板函數(shù)。

gn中,可執(zhí)行文件的編譯函數(shù)入口為exectuable("文件名"),共享庫(kù)的編譯規(guī)則函數(shù)為shared_library("文件名")。所以,如果要搜索某個(gè)文件對(duì)應(yīng)的編譯規(guī)則,可以先搜索所有的BUILD.gn文件,然后grep executable。以下是我們grep所有的executable的結(jié)果截圖。

圖2 grep BUILD.gn中executable的結(jié)果示意

通過這種方式,我們能很快定位到比如init對(duì)應(yīng)的代碼在什么地方。

最后,我們?cè)俸?jiǎn)單介紹下OpenHarmony編譯系統(tǒng)中和底層OS有關(guān)的一個(gè)條件編譯控制變量ohos_kernel_type。目前,該變量有四個(gè)取值,分別為"liteos_a"、"liteos_m"、"liteos_riscv"和"linux":

"liteos_a"和"linux"經(jīng)常做為一組進(jìn)行判斷。liteos_a實(shí)際對(duì)應(yīng)的是Cortex-A系列,其性能相對(duì)較高,可以跑Linux系統(tǒng)。

"liteos_m"和"liteos_riscv"往往是一組的。liteos_m對(duì)應(yīng)的是Cortex-M系列,liteos_riscv是Riscv芯片的表示,二者可能都是針對(duì)性能一般,功耗較低的設(shè)備。

ohos_kernel_type的取值由build/lite/product/解決方案名.json文件中的product字段決定。例如,我們選擇的ipcamera_hi3518ev300的配置文件內(nèi)容截圖如下,它的kernel字段值為"liteos_a"。

圖3 build/lite/product/ ipcamera_hi3518ev300.json配置文件示意圖

編譯完成后,所有編譯生成物都在out/ipcamera_hi3518ev300目錄下。

2 init源碼精要解析

init是Linux系統(tǒng)上的第一個(gè)應(yīng)用進(jìn)程,是其它進(jìn)程的源頭。對(duì)ipcamera_hi3518ev300來說,它的編譯產(chǎn)物中也有一個(gè)init進(jìn)程。

在上面提到的out/ipcamera_hi3518ev300目錄下,有一個(gè)rootfs.tar文件。這個(gè)文件里就是設(shè)備上根文件系統(tǒng)的內(nèi)容。打開其中的/rootfs/bin目錄,可以看到此次編譯的可執(zhí)行程序如下截圖所示:

圖4 out/ipcamera_hi3518ev300/rootfs.tar/bin內(nèi)容示意

借助圖2里提到的辦法,我們可以定位到init對(duì)應(yīng)的代碼路徑為base/startup/services/init_lite/。其內(nèi)容如下圖所示:

圖5 init_lite源碼文件示意圖

main.c是整個(gè)init的入口。我們簡(jiǎn)單看一下它的代碼,如下所示。

圖6 init_lite/main.c

init main函數(shù)非常精簡(jiǎn),非常符合"lite"輕量簡(jiǎn)便的風(fēng)格。當(dāng)然,也不排除未來init的代碼會(huì)越來越復(fù)雜。我們?cè)贏OSP上觀察到的情況就是一個(gè)例子——AOSP里現(xiàn)在的init的相關(guān)代碼非常復(fù)雜)。

我們對(duì)InitReadCfg比較感興趣,這個(gè)函數(shù)內(nèi)部將讀取/etc/init.cfg文件。這個(gè)文件在圖4中提到的rootfs.tar中可以找到,下圖是其內(nèi)容的示意:

圖7 rootfs.tar/etc/init.cfg

init.cfg本質(zhì)上是一個(gè)json格式的文件。它包括一個(gè)名為"jobs"的數(shù)組和一個(gè)名為"services"的數(shù)組。

對(duì)"jobs"來說:內(nèi)部分別包含"pre-init"、"init"和"post-init"三個(gè)元素。從上面的截圖中可以看出,這三個(gè)元素對(duì)應(yīng)的就是設(shè)置掛載一些設(shè)備、設(shè)置好路徑,啟動(dòng)服務(wù)等工作。

對(duì)"services"來說:它包含一組服務(wù)的定義。所謂的服務(wù),就是系統(tǒng)里的關(guān)鍵進(jìn)程。可以猜測(cè)到,init將根據(jù)service的配置來啟動(dòng)對(duì)應(yīng)的服務(wù)程序,并設(shè)置它的uid、gid、進(jìn)程優(yōu)先級(jí)和權(quán)限等。

如果開發(fā)者對(duì)Android系統(tǒng)有一定了解的話,會(huì)發(fā)現(xiàn)OpenHarmony和AOSP在init的工作流程上有著相似的設(shè)計(jì)思路。不過,對(duì)OpenHarmony目標(biāo)設(shè)備來說,使用json格式無疑是比較簡(jiǎn)單且方便的。

最后,我們?cè)倏匆幌耰nit的另外一個(gè)重要職能——服務(wù)進(jìn)程狀況監(jiān)控。init.cfg中的那些服務(wù)屬于系統(tǒng)關(guān)鍵進(jìn)程。運(yùn)行過程中如果它們出現(xiàn)異常導(dǎo)致進(jìn)程退出,需要有個(gè)辦法將它們重新啟動(dòng)以保證業(yè)務(wù)連續(xù)性。

這個(gè)功能的實(shí)現(xiàn)就是利用Linux系統(tǒng)的SIGCHILD信號(hào)。init在SignalInitModule中監(jiān)聽了該信號(hào)并設(shè)置了對(duì)應(yīng)的信號(hào)處理函數(shù)——SigHandler。SigHandler函數(shù)的具體處理過程則比此處說得要更復(fù)雜一點(diǎn)?,F(xiàn)在,這部分內(nèi)容就留給讀者們自行探索了!!

編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • init
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    3450
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2638

    瀏覽量

    66740
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1983

    瀏覽量

    30606
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙OS學(xué)習(xí)資料,持續(xù)更新中

    鴻蒙OS學(xué)習(xí)資料,持續(xù)更新中鏈接地址 https://blog.csdn.net/qq_31765191/article/details/108948033
    發(fā)表于 10-10 10:35

    物聯(lián)設(shè)備開發(fā),安全先行-記鴻蒙OS Hi3861平臺(tái)代碼裁剪及基于MbedTLS的https接入測(cè)試

    本帖最后由 davin98 于 2020-11-15 10:38 編輯 代碼裁剪原有鴻蒙OS全量代碼過于龐大,不利于加入代碼倉(cāng)庫(kù)記錄追
    發(fā)表于 11-15 09:24

    【HarmonyOS HiSpark IPC DIY Camera試用連載 】鴻蒙OS內(nèi)核如何啟動(dòng)第一個(gè)用戶進(jìn)程init_lite

    1.鴻蒙OS編譯知識(shí)OpenHarmony源碼編譯原理(原理引自中科創(chuàng)達(dá)OpenHarmony研究組 鴻蒙OS開源代碼精要解讀之——
    發(fā)表于 11-20 10:27

    [文章] 【HarmonyOS HiSpark IPC DIY Camera試用連載 】鴻蒙OS內(nèi)核如何啟動(dòng)第一個(gè)用戶進(jìn)程init_lite

    1.鴻蒙OS編譯知識(shí)OpenHarmony源碼編譯原理(原理引自中科創(chuàng)達(dá)OpenHarmony研究組 鴻蒙OS開源代碼精要解讀之——
    發(fā)表于 11-20 16:44

    鴻蒙內(nèi)核源碼分析(進(jìn)程管理篇):進(jìn)程是內(nèi)核的資源管理單元

    來承載,它就是LosProcessCB(進(jìn)程控制塊),代碼很長(zhǎng)但必須全部拿出來,長(zhǎng)是長(zhǎng)了點(diǎn),忍忍吧!LITE_OS_SEC_BSS LosProcessCB *g_runProcess
    發(fā)表于 11-24 11:23

    鴻蒙liteos-a如何啟動(dòng)第一個(gè)用戶進(jìn)程init_lite

    的結(jié)果截圖。 (以上原理引自中科創(chuàng)達(dá)OpenHarmony研究組 鴻蒙OS開源代碼精要解讀之——init) 2. 從編譯過程看鴻蒙
    發(fā)表于 12-10 12:04

    鴻蒙liteos-a如何啟動(dòng)第一個(gè)用戶進(jìn)程init_lite

    的結(jié)果截圖。 (以上原理引自中科創(chuàng)達(dá)OpenHarmony研究組 鴻蒙OS開源代碼精要解讀之——init) 2. 從編譯過程看鴻蒙
    發(fā)表于 12-10 15:02

    鴻蒙OS開源代碼精要解讀之——init

    OpenHarmony中ipcamera_hi3518ev300為編譯目標(biāo),介紹init進(jìn)程相關(guān)代碼。 寫在前面的話 我們對(duì)OpenHarmony的
    發(fā)表于 12-22 13:49

    鴻蒙系統(tǒng)學(xué)習(xí)筆記】鴻蒙系統(tǒng)的啟動(dòng)流程v2.0

    鴻蒙內(nèi)核源碼注解分析:OsUserInitProcess()【最新1.1.0 LTS代碼有重構(gòu),但意思一樣】這時(shí)候才創(chuàng)建1號(hào)進(jìn)程Init,這是用戶態(tài)根
    發(fā)表于 04-06 10:20

    LINUX 進(jìn)程代碼分析

    LINUX 進(jìn)程代碼分析 task_struct 數(shù)據(jù)結(jié)構(gòu)表示進(jìn)程的數(shù)據(jù)結(jié)構(gòu)是struct task_struct。task_struct 結(jié)構(gòu)是進(jìn)程實(shí)體的核心,Linux 內(nèi)核通
    發(fā)表于 02-09 15:13 ?16次下載

    init函數(shù)和init進(jìn)程的區(qū)別

    由于執(zhí)行init()函數(shù)的內(nèi)核線程和init進(jìn)程進(jìn)程標(biāo)識(shí)符都是1,它們又都叫init,因此init
    發(fā)表于 01-05 10:49 ?1691次閱讀

    Linux系統(tǒng)下init進(jìn)程的前世今生

    Linux系統(tǒng)中的init進(jìn)程(pid=1)是除了idle進(jìn)程(pid=0,也就是init_task)之外另一個(gè)比較特殊的進(jìn)程,它是Linu
    發(fā)表于 04-28 17:23 ?1003次閱讀

    進(jìn)程代碼合集免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是進(jìn)程代碼合集免費(fèi)下載。
    發(fā)表于 11-05 08:00 ?1次下載
    <b class='flag-5'>進(jìn)程</b>的<b class='flag-5'>代碼</b>合集免費(fèi)下載

    ADI-blackfin-PPI驅(qū)動(dòng)TFT屏的代碼-TFT-Init

    ADI-blackfin-PPI驅(qū)動(dòng)TFT屏的代碼-TFT-Init(電源技術(shù)投稿模版)-ADI-blackfin-PPI驅(qū)動(dòng)TFT屏的代碼-TFT-Init
    發(fā)表于 08-31 11:28 ?12次下載
    ADI-blackfin-PPI驅(qū)動(dòng)TFT屏的<b class='flag-5'>代碼</b>-TFT-<b class='flag-5'>Init</b>

    鴻蒙應(yīng)用實(shí)例代碼

    鴻蒙應(yīng)用實(shí)例代碼,僅供參考。
    發(fā)表于 09-27 14:56 ?12次下載