偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

OpenHarmony富設(shè)備移植指南(四)第三方內(nèi)核適配與定制

系統(tǒng) OpenHarmony
為什么OpenHarmony的移植這么久才出來,安卓手機(jī)廠商開源了內(nèi)核代碼之后LineageOS可以很快跟進(jìn),這應(yīng)該是廣大網(wǎng)友都疑惑的事情,我這里可以簡單解釋一下,這個(gè)跟內(nèi)核與驅(qū)動有著直接關(guān)系。

??想了解更多關(guān)于開源的內(nèi)容,請?jiān)L問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

一、OpenHarmony移植為什么這么難?

為什么OpenHarmony的移植這么久才出來,安卓手機(jī)廠商開源了內(nèi)核代碼之后LineageOS可以很快跟進(jìn),這應(yīng)該是廣大網(wǎng)友都疑惑的事情,我這里可以簡單解釋一下,這個(gè)跟內(nèi)核與驅(qū)動有著直接關(guān)系。

下面是我總結(jié)的一個(gè)簡單解釋:

Linux設(shè)備:標(biāo)準(zhǔn)Linux內(nèi)核 + 硬件驅(qū)動

安卓設(shè)備:安卓內(nèi)核(標(biāo)準(zhǔn)內(nèi)核+安卓定制)+ 硬件驅(qū)動(調(diào)用部分定制接口)

OH設(shè)備:OH內(nèi)核(標(biāo)準(zhǔn)內(nèi)核+OH定制)+ 硬件驅(qū)動(調(diào)用部分定制接口)

如果安卓設(shè)備的驅(qū)動調(diào)用了安卓內(nèi)核特有的接口,安卓的驅(qū)動就不能用到標(biāo)準(zhǔn)內(nèi)核上,也不能用在OH內(nèi)核上,如果安卓的驅(qū)動調(diào)用的是標(biāo)準(zhǔn)Linux內(nèi)核的接口,這就可以用到OH設(shè)備上,但是這個(gè)很少,這也是為什么你們會在pmOS看到有些設(shè)備的支持狀況是這樣的。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

很多網(wǎng)友都期待OpenHarmony移植到自己的手機(jī)能打電話,以為只要開發(fā)者堅(jiān)持就能成功,這里我可以潑一盆冷水,因?yàn)榛鶐酒尿?qū)動廠商是不開源的,沒有驅(qū)動源碼就不可能有適配OH內(nèi)核的驅(qū)動,廠商也不可能花力氣去基于OH內(nèi)核幫你適配驅(qū)動,所以移植適配評估的時(shí)候我參考的是pmOS,因?yàn)閜mOS是用標(biāo)準(zhǔn)Linux內(nèi)核,Ubuntu Touch的內(nèi)核為什么不能用?了解過的同學(xué)應(yīng)該知道,Ubuntu Touch用的是安卓內(nèi)核,它能用安卓驅(qū)動,所以小米6得Ubuntu Touch支持打電話,但是pmOS不行。

另外Linux內(nèi)核版本每次變更都會頻繁改動代碼,這導(dǎo)致了同樣的代碼很可能無法編譯通過,這也是為什么SOC廠商和驅(qū)動廠商都對升級內(nèi)核版本不積極,可用內(nèi)核和可用驅(qū)動的缺少導(dǎo)致了這么長時(shí)間,移植OpenHarmony都是吃力不討好的事情,并且只能開機(jī)點(diǎn)亮,沒有驅(qū)動,上限被卡死,所以移植這件事不是有人努力移植就行的,希望大家能多多理解。

二、OH內(nèi)核特性移植

在OH官方的doc倉中,標(biāo)準(zhǔn)內(nèi)核介紹里有OH內(nèi)核特性的部分講解(如下圖),可惜這個(gè)只是部分,一些更基礎(chǔ)的驅(qū)動沒有列出來,接下來我們先移植基礎(chǔ)的部分,保證能開機(jī)亮屏,更高級一點(diǎn)的特性先不移植。

???zh-cn/device-dev/kernel · OpenHarmony/docs - 碼云 - 開源中國 (gitee.com)??

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

1、添加設(shè)備內(nèi)核編譯配置文件

上篇文章【OH編譯框架適配與定制】中我們已經(jīng)把源碼下載到kernel/linux/linux-sagit目錄下,接下來我們找到【從postmarketOS獲取移植資源】文章中解包出的config配置,把config放到device/board/xiaomi/sagit/kernel/configs下并重命名為sagit_oh_defconfig,因?yàn)槲沂嵌ㄖ七^Linux編譯流程的,我的編譯腳本把會把sagit_oh_defconfig復(fù)制到linux-sagit/arch/arm64/configs下。

熟悉Linux內(nèi)核編譯的同學(xué)也可以按照自己的思路做,這一部只是簡單的添加移植設(shè)備的編譯配置。

2、移植staging下OH添加的hilog,hievent,hisysevent,zerohung,hungtask,blackbox驅(qū)動

(1)更新最新內(nèi)核代碼

移植驅(qū)動前,我們先更新官方內(nèi)核到最新版,盡量保證驅(qū)動沒有bug

cd ~/ohos_beta3/kernel/linux/linux-5.10/
git fetch origin
git checkout origin/master1.2.3.

(2)復(fù)制代碼,修正Kconfig,Makefile

復(fù)制linux-5.10/driver/staging/下的hilog,hievent,hisysevent,zerohung,hungtask,blackbox源碼到linux-sagit/driver/staging/目錄下。

修改linux-sagit/driver/staging/下的Kconfig文件,在末尾添加如下信息。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

修改linux-sagit/driver/staging/下的Makefile文件,在末尾添加如下信息。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

只是復(fù)制staging下的文件還不行,編譯的時(shí)候會報(bào)錯,還有些頭文件缺失。

復(fù)制linux-5.10/include下的dfx文件夾到linux-sagit/include下。

同時(shí)linux-5.10/include/linux/下的三個(gè)頭文件。

blackbox.h,blackbox_storage.h,blackbox_common.h。

也需要復(fù)制到對應(yīng)的linux-sagit/include/linux/下,補(bǔ)全頭文件。

(3)修復(fù)get_fs(),set_fs()函數(shù)缺失問題

頭文件補(bǔ)全之后編譯仍會報(bào)錯,我調(diào)查發(fā)現(xiàn)這是因?yàn)閙m_segment_t,get_fs(),set_fs()等結(jié)構(gòu)體跟函數(shù)已經(jīng)在新版內(nèi)核中移除了,而且是在5.10內(nèi)核中標(biāo)記移除的,不懂為什么OH的內(nèi)核維護(hù)者不移除掉,這個(gè)操作因?yàn)闀?dǎo)致安全問題,現(xiàn)代cpu已經(jīng)不支持了,所以我們可以大膽的去掉這部分代碼,我實(shí)際驗(yàn)證也是不影響內(nèi)核運(yùn)行,所以搜索我們移植的文件,把這些都刪掉吧。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

這是我的改動,注釋掉的部分就是已經(jīng)無用的代碼。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

(4)修復(fù)inode_permission(),vfs_mkdir(),vfs_unlink()函數(shù)參數(shù)問題

因?yàn)閍pi改動,上記三個(gè)函數(shù)參數(shù)增加了,我參考了內(nèi)核其他代碼的調(diào)用,確認(rèn)添加【&init_user_ns】參數(shù)可以解決問題。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

修改如下圖所示:

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

把下面的配置加到內(nèi)核編譯sagit_oh_defconfig的末尾,編譯一次內(nèi)核看看能否成功。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

3、移植accesstokenid驅(qū)動

(1)復(fù)制驅(qū)動代碼,修正Kconfig,Makefile

復(fù)制linux-5.10/drivers下的accesstokenid文件夾到linux-sagit/drivers文件夾下.

同樣的做法,把Kconfig,Makefile修正添加進(jìn)accesstokenid驅(qū)動。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)


OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

(2)修改accesstokenid驅(qū)動關(guān)聯(lián)文件

通過【CONFIG_ACCESS_TOKENID】進(jìn)行搜索,發(fā)現(xiàn)紅框中的文件有accesstokenid相關(guān)聯(lián)的改動,需要手動處理。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

官方linux-5.10內(nèi)核的改動是在【FORBIDDEN_MMAP_FLAGS】后面添加代碼。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

我們同樣把【CONFIG_ACCESS_TOKENID】包含的代碼復(fù)制到linux-sagit的內(nèi)核中,同時(shí)【ACCESS_TOKENID_FEATURE_VALUE】跟【BINDER_CURRENT_FEATURE_SET】是依賴【ENABLE_ACCESS_TOKENID】的,也一并復(fù)制。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

接下來就是捉迷藏游戲,把這些改動找出來,然后再根據(jù)插入位置的上一行代碼或者下一行代碼進(jìn)行搜索,把他們都轉(zhuǎn)移到對應(yīng)的位置,手動合并改動。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

有些找不到對應(yīng)位置的,有可能是把聲明移到.h頭文件了,比如binder_thread這個(gè)結(jié)構(gòu)體5.10版本的時(shí)候是放在binder.c文件,6.0抽到binder_internal.h里面了。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

還有一些改動是加到switch里面的,直接放到default前面就行。

linux-5.10:

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

linux-sagit:

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

這里需要注意【BINDER_FEATURE_SET】也要一起復(fù)制過來,因?yàn)槎际荗H添加的,我一開始沒復(fù)制,導(dǎo)致開機(jī)時(shí)log里面一直報(bào)binder錯誤,后面通過gitee的按行查看功能,查看了binder.c的代碼才確定這段代碼也是OH團(tuán)隊(duì)添加的,屬于ACCESS_TOKENID的相關(guān)功能。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

還有一些是上游代碼優(yōu)化了寫法的,這個(gè)要讀懂代碼才能改,比如binder_init下面這段。

kernel-5.10的binder_init中,OH在【debugfs_create_file("failed_transaction_log"】后面添加了一段代碼。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

在我們的linux-sagit中是linux6.0的代碼,已經(jīng)優(yōu)化掉了,不能像之前那樣直接找到插入的位置。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

新版直接用for循環(huán)簡化掉了大段的代碼。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

為了保證移植的正確,這時(shí)我們要分析代碼運(yùn)行了。

舊版:

1.debugfs_create_dir("binder", NULL);

2.debugfs_create_dir("proc",binder_debugfs_dir_entry_root);

3.debugfs_create_file("state"/"transactions"...

4.(OH)proc_create_data("transaction_proc"...

新版:

1.debugfs_create_dir("binder", NULL);

2.debugfs_create_file("state"/"transactions"..

3.debugfs_create_dir("proc",binder_debugfs_dir_entry_root);

根據(jù)函數(shù)名可以得知OH新加的時(shí)進(jìn)程相關(guān)的(proc),而且是在2.debugfs_create_dir("proc",binder_debugfs_dir_entry_root);的后面,所以我們參照這個(gè)邏輯,新版的改動可以對應(yīng)為

新版:

1.debugfs_create_dir("binder", NULL);

2.debugfs_create_file("state"/"transactions"..

3.debugfs_create_dir("proc",binder_debugfs_dir_entry_root);

4.(OH)proc_create_data("transaction_proc"...

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

至此我移植時(shí)遇到的問題以及解決的辦法已經(jīng)講完了,各位按照上面的這些辦法把需要移植代碼找到,添加到對應(yīng)的位置即可。

4、逆移植ashmem驅(qū)動

后續(xù)我在點(diǎn)亮后發(fā)現(xiàn)桌面圖標(biāo)無法顯示,hilog瘋狂提示db方面的錯誤,定位發(fā)現(xiàn)需要ashmem驅(qū)動,但是這個(gè)驅(qū)動在Linux5.18的時(shí)候被移除了,我們需要把它重新移植回來,我參考網(wǎng)上SoulInfernoDE發(fā)布的方法進(jìn)行了ashmem驅(qū)動的還原

wget -O remove_ashmem.patch 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/patch/?id=721412ed3d819e767cac2b06646bf03aa158aaec
interdiff -q remove_ashmem.patch /dev/null > enable_ashmem.patch
patch -p1 -i enable_ashmem.patch1.2.3.

同時(shí)【CONFIG_ANDROID】這個(gè)標(biāo)志已經(jīng)移除了,我們還需要一些修改以便ashmem驅(qū)動能正常編譯。

在staging下的Makefile中。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

obj-$(CONFIG_ANDROID) 改成obj-y。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

在staging/android下的Kconfig中。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

去掉if ANDROID的判斷。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

至此內(nèi)核代碼方面的改動講解完成。

三、內(nèi)核編譯配置修改

1、添加設(shè)備必要內(nèi)核驅(qū)動

在之前我們解包的文件中,有個(gè)deviceinfo的文件,里面可以看到,啟動的時(shí)候,內(nèi)核需要加載以下這些模塊:

panel-jdi-fhd-r63452 msm i2c-qup rmi_i2c qcom_spmi_fg qcom_spmi_haptics。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

我們直接把他們編譯進(jìn)內(nèi)核,這樣后續(xù)不需要修改gn處理ko模組文件,也不需要寫init配置文件添加啟動時(shí)模組加載的語句。

運(yùn)行命令進(jìn)入內(nèi)核配置菜單

make -C /home/diemit/OpenHarmony/out/KERNEL_OBJ/kernel/src_tmp/linux-sagit 
ARCH=arm64
CC="/home/diemit/OpenHarmony/prebuilts/clang/ohos/linux-x86_64/llvm/bin/clang"
HOSTCC="/home/diemit/OpenHarmony/prebuilts/clang/ohos/linux-x86_64/llvm/bin/clang"
PERL=/usr/bin/perl
CROSS_COMPILE="/home/diemit/OpenHarmony/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-"menuconfig1.

按鍵盤的【/】鍵進(jìn)行搜索,輸入【r63452】

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

得到驅(qū)動的狀態(tài)和菜單位置,我之前已經(jīng)該過,所以現(xiàn)在時(shí)y(編譯進(jìn)內(nèi)核),默認(rèn)是m(編譯成模組)。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

2、添加相關(guān)聯(lián)相關(guān)驅(qū)動

把上面列出的這些必要的驅(qū)動全部編譯進(jìn)內(nèi)核,同時(shí)關(guān)聯(lián)的驅(qū)動也一并編譯進(jìn)內(nèi)核,比如:

觸摸屏?xí)鶬nput device support里面的這個(gè)event interface有關(guān)聯(lián),不一起編譯進(jìn)內(nèi)核的話觸摸屏驅(qū)動無法正常工作。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

添加ashmem驅(qū)動。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

3、添加OH定制驅(qū)動

添加accestoken驅(qū)動,hdf可以不選。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

添加關(guān)聯(lián)的binder ipc驅(qū)動。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

添加hilog,hievent等驅(qū)動。

OpenHarmony富設(shè)備移植指南(4)第三方內(nèi)核適配與定制-開源基礎(chǔ)軟件社區(qū)

4、添加調(diào)試所需驅(qū)動

根據(jù)pmOS的指導(dǎo),添加usb串口驅(qū)動

Serial debugging/Serial Gadget - postmarketOS
CONFIG_USB_G_SERIAL=y
CONFIG_U_SERIAL_CONSOLE=y
CONFIG_USB_U_SERIAL=y1.2.3.

按照pmOS給出的配置,在menuconfig界面搜索對應(yīng)驅(qū)動進(jìn)行選擇,或者直接編輯defconfig文件加入。

至此內(nèi)核相關(guān)定制適配講解完成,下篇講解打包刷機(jī)調(diào)試,敬請期待。

??想了解更多關(guān)于開源的內(nèi)容,請?jiān)L問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

責(zé)任編輯:jianghua 來源: 51CTO 開源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2023-02-07 15:52:50

2023-04-06 09:10:13

設(shè)備移植鴻蒙

2023-02-07 15:43:13

三方庫適配鴻蒙

2015-11-05 16:44:37

第三方登陸android源碼

2023-02-06 16:21:48

2023-03-10 09:47:45

OpenGL渲染設(shè)備移植

2022-01-14 09:57:14

鴻蒙HarmonyOS應(yīng)用

2023-03-06 16:11:00

設(shè)備移植開源GPU驅(qū)動

2023-02-14 17:06:31

設(shè)備移植打包刷機(jī)

2011-03-14 10:33:19

2024-04-03 12:57:29

2023-05-16 14:49:25

鴻蒙內(nèi)核移植

2023-03-23 16:02:07

樹莓派4GPU調(diào)試

2023-02-28 15:40:16

鴻蒙CPU渲染

2014-07-23 08:55:42

iOSFMDB

2019-07-30 11:35:54

AndroidRetrofit

2021-04-27 15:30:54

鴻蒙HarmonyOS應(yīng)用

2022-04-25 09:00:46

npm包管理器

2012-04-03 13:42:03

iPhone

2009-12-31 14:38:34

Silverlight
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號