1. 程式人生 > >KERNEL_DIR、系統平臺、交叉編譯器的指定,以及核心模組驅動檔案的簽名

KERNEL_DIR、系統平臺、交叉編譯器的指定,以及核心模組驅動檔案的簽名

在為android編譯ko包並使用insmod載入過程中遇到兩個問題,記錄如下。

【問題一:KERNEL_DIR、系統平臺、交叉編譯器的指定】
android編譯ko包實際與linux編譯ko沒有區別,首先編寫.c .h檔案等,之後編寫makefile檔案,makefile中KERNEL_DIR為kernel編譯後產生的臨時資料夾的目錄,有些系統工程會重定向生成的核心臨時檔案目錄,所以不能簡單的吧KERNEL_DIR定義為kernel原始檔目錄。而是應該確定生成的臨時檔案的目錄後使用臨時檔案目錄。

例如本次使用的工程(高通平臺)就與之前的工程(聯芯平臺)不同,編譯後的臨時檔案目錄為out/target/product/xxxxxx/obj/KERNEL_OBJ/。所以設定KERNEL_DIR := xxx/out/target/product/xxxxxx/obj/KERNEL_OBJ/。
另外,在編寫編譯選項時本次的工程並沒有在頂層makefile裡指定使用的系統平臺等,所以編譯指令裡需要新增上對系統平臺的指定,以及交叉編譯器的使用。最終使用的Makefile檔案如下:

#********高通平臺裝置驅動Makefile********
CROSS_ARCH:=ARCH=arm CROSS_COMPILE="$(ARM_EABI_TOOLCHAIN)/arm-eabi-"
KERNEL_DIR:=$(ANDROID_PRODUCT_OUT)/obj/KERNEL_OBJ/
PWD:=$(shell pwd)

#這裡模組名為scull
obj-m += scull.o
scull-objs:= main.o pipe.o access.o

.PHONY: modules package clean
all:package
modules:
    @if [ "$(ANDROID_BUILD_TOP)_yes" = "_yes" ]; then echo "You have to run \". build/envsetup.sh\" to init enviroment first. \nAnd then you have to run \"choosecombo\" to setup the project."&&exit 1; fi
    @if [ ! -d $(KERNEL_DIR) ]; then echo "Build kernle first."&&cd $(ANDROID_BUILD_TOP)&&make bootimage&&cd -; fi
    $(MAKE) $(CROSS_ARCH) -C $(KERNEL_DIR) M=$(PWD) modules

package:modules
    @mkdir -p ./package
    @cp $(obj-m:.o=.ko) ./package

clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers package

#********聯芯平臺的裝置驅動Makefile********
EXTRA_CFLAGS += $(DEBFLAGS)
EXTRA_CFLAGS += -I$(LDDINC)

ifneq ($(KERNELRELEASE),)
# call from kernel build system
scull-objs := main.o pipe.o access.o
obj-$(CONFIG_SCULL) := scull.o
else
# KERNELDIR ?= /lib/modules/$(shell uname -r)/build
KERNELDIR ?= /home/zhouxiang/work/mpe168/android-4.4.4_r2/kernel/linux-3.10
PWD       := $(shell pwd)

modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules
endif

clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

depend .depend dep:
    $(CC) $(CFLAGS) -M *.c > .depend

ifeq (.depend,$(wildcard .depend))
include .depend
endif

【問題二:模組驅動檔案的簽名】
編譯生成module.ko後,push到android裝置的system/bin目錄,在insmod module.ko時提示:
insmod module.ko
insmod: init_module 'module.ko' failed (Required key not available)

根據提示應該是key的問題,查閱資料發現Linux從3.n(具體版本不清楚)開啟了對載入的module進行簽名認證的功能在這個功能使能之後,核心只允許安裝特定的key簽名的模組。
核心配置項(所在檔案:kernel/kernel/Makefile)中:
CONFIG_MODULE_SIG=y
表示開啟了簽名機制,但是這時候模組簽名或不簽名都可以使用。

CONFIG_MODULE_SIG_FORCE=y
如果上述配置項使能,則模組必須有正確的簽名才能正常使用。

CONFIG_MODULE_SIG_ALL=y
核心在編譯的時候,並不會主動去給模組簽名,除非你把上述配置項開啟。檢視核心配置檔案,發現上面3個配置項確實都打開了,因此肯定是ko簽名的問題。
對於核心簽名的理解參考文章:http://blog.csdn.net/hui872370036/article/details/69950869

如何為ko包簽名呢?
首先,找到signing_key.priv signing_key.x509檔案(在out/target/product/xxxxxx/obj/KERNEL_OBJ/目錄下),拷貝到module原始碼目錄。
然後,對module.ko進行簽名,使用命令:
perl ../../xxxx/kernel/scripts/sign-file sha512 signing_key.priv signing_key.x509 module.ko
簽名後檢視簽名信息,執行命令:hexdump -C module.ko | tail
00043680  9b 6f d3 d2 f6 71 27 15  73 38 d6 7b c1 c5 04 fb  |.o...q'.s8.{....|
00043690  a7 16 4c 19 01 76 b8 a5  de 90 b4 0a 10 db aa 2f  |..L..v........./|
000436a0  23 f4 97 5c a0 ce 70 c5  eb 87 95 92 5c e3 17 fd  |#..\..p.....\...|
000436b0  ef 88 9b 3e 0b db 78 38  ac ee 9c b7 ef 82 ba 97  |...>..x8........|
000436c0  24 a9 6a 7a e4 5e 75 a6  d3 9a 98 5f 50 1d 77 28  |$.jz.^u...._P.w(|
000436d0  9e 11 26 48 bb cd 79 51  82 26 05 fb 61 01 06 01  |..&H..yQ.&..a...|
000436e0  1e 14 00 00 00 00 00 02  02 7e 4d 6f 64 75 6c 65  |.........~Module|
000436f0  20 73 69 67 6e 61 74 75  72 65 20 61 70 70 65 6e  | signature appen|
00043700  64 65 64 7e 0a                                    |ded~.|
00043705
此時簽名正確
最後,安裝裝置驅動檔案。若又提示
insmod module.ko
insmod: init_module 'module.ko' failed (Required key not available)
重新編譯了一次kernel映象,並對裝置fastboot flash boot boot.img重新燒錄kernel映象,再進行push, 而後insmod此次模組載入成功。

總結簽名失敗問題:
解決方案:
1、關閉核心的模組簽名校驗問題
2、使用當前核心的簽名對模組進行簽名 (每次編譯後簽名祕鑰對會更新,所以在對上個版本或者更早之前的版本或者其他機器編譯的核心映象載入模組時,需要重新燒寫模組編譯時的當前核心映象,這樣才不會出現簽名仍然不一致問題。)

相關推薦

KERNEL_DIR系統平臺交叉編譯器指定以及核心模組驅動檔案簽名

在為android編譯ko包並使用insmod載入過程中遇到兩個問題,記錄如下。【問題一:KERNEL_DIR、系統平臺、交叉編譯器的指定】android編譯ko包實際與linux編譯ko沒有區別,首先編寫.c .h檔案等,之後編寫makefile檔案,makefile中KE

黑盒測試白盒測試單元測試集成測試系統測試驗收測試的區別與聯系

角色 同時 驗收 center 調試 需求 lan 說明書 錯誤 黑盒測試、白盒測試、單元測試、集成測試、系統測試、驗收測試的區別與聯系   接下來為大家細心講述一下各種測試應用的環境及作用。 一、測試環境和角色 黑盒測試、白盒測試、單元測試、集成測試、系統測試、

centos系統查看系統版本內核版本系統位數cpu個數核心線程數

article 包括 smp details info 名稱 edt .com dom centos查看系統版本 cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 1)查看centos內核的

rsync用服務同步文件系統日誌screen工具

20180515一、rsync通過服務同步 1?要編輯配置文件:/etc/rsyncd.conf2、啟動rsync --daemon (檢測是否啟動:ps aux |grep rsync)3、格式:rsync -av test1/192.168.133.11.130::module/dir/ 例:從b機用rs

OpenCV學習筆記(三十七)——實用函式系統函式巨集core

如果你想在OpenCV的基礎上自己開發一些演算法,我覺得core這部分內容不得不精啊,能熟練使用OpenCV的資料結構是開發的基礎,又是重中之重。最近就又拌在這上頭了,所以再重溫一下。這次分析一下Utility and System Functions and Macros

多媒體程式設計網路程式設計系統程式設計網路安全程式設計驅動程式設計

;編譯命令 ; ml /coff x86.asm /link /subsystem:windows /entry:main user32.lib kernel32.lib ;標準彙編頭 .386 .model flat,stdcall option casemap:non

軟體測試方法——單元測試整合測試系統測試確認測試

從整體的角度可以分為單元測試、整合測試、系統測試、確認測試。 下面內容來自網路相關資料的整理: 1.單元測試 (1)定義:單元測試(又稱為模組測試)是針對程式模組(軟體設計的最小單位)來進行正確性檢驗的測試工作。程式單元是應用的最小可測試部件。在過程化程式設計中,一個單元就

軟體測試 -- 比較一下黑盒測試白盒測試單元測試整合測試系統測試驗收測試的區別與聯絡

黑盒測試:已知產品的功能設計規格,可以進行測試證明每個實現了的功能是否符合要求。 白盒測試:已知產品的內部工作過程,可以通過測試證明每種內部操作是否符合設計規格要求,所有內部成分是否以經過檢查。 軟體的黑盒測試意味著測試要在軟體的介面處進行。這種方法是把測試物件看做一個黑盒子,測試人員完全不考慮程式內部的邏

軟體測試的四個階段單元測試整合測試系統測試驗收測試

軟體測試的物件包括軟體需求、概要設計、詳細設計、軟體執行環境、可執行程式和軟體原始碼等。軟體測試包括質量、人員、資源、技術和流程五大要素,以及測試覆蓋率和測試效率兩個目標。 軟體測試一般分為4個階段:單元測試、整合測試、系統測試、驗收測試。 一、單元測試  單元測試是

Zoho更新三款雲應用含優化工具整合平臺建站工具

線上軟體帝國Zoho又出兩個新品:網站優化工具PageSense,幫助市場人員視覺化跟蹤、測試、評估網站訪客對網頁的瀏覽、點選等行為,提高轉化率,和拖拽式整合平臺Zoho Flow幫助使用者可以在各個雲應用之間建立靈活的工作流。同時公司還推出了全新的自助式建站工具Zoho S

mysql:使用者變數系統變數區域性變數(儲存過程中的)

MySQL資料庫中的變數分為MySQL系統變數和MySQL使用者變數。 一、MySQL使用者變數:基於會話變數實現的, 可以暫存值, 並傳遞給同一連線裡的下一條sql使用的變數.當客戶端連線退出時,變

OpenVPN 安裝配置客戶端和服務端以及OpenVPN的使用 (Windows 平臺)

OpenVPN 開源,好用,而且免費,感謝 OpenVPN 團隊開發此產品。 簡介 OpenVPN允許參與建立VPN的單點使用公開金鑰、電子證書、或者使用者名稱/密碼來進行身份驗證。它大量使用了OpenSSL加密庫中的SSLv3/TLSv1協議函式庫。目前OpenVP

單體測試整合測試迴歸測試系統測試驗收測試等的比較

單元測試,英文是Unit Testing。 單元測試是最微小規模的測試;以測試某個功能或程式碼塊。典型地由程式設計師而非測試員來做,因為它需要知道內部程式設計和編碼的細節知識。這個工作不容易做好,除非應用系統有一個設計很好的體系結構; 還可能需要開發測試驅動器模組或測試套具。 整合測試,英文是Integr

單元測試整合測試確認測試系統測試驗收測試

單元測試 集中對用原始碼實現的每一個程式單元進行測試,檢查每個程式模組是否實現了規定的功能,保證其能正常工作。 整合測試是把已進行過單元測試的模組組裝起來進行測試,目的在於檢驗與軟體設計相關的程式結構問題。 確認測試是檢驗所開發的軟體是否滿足了需求規格說明中確定了的各種

獲取手機裝置型號系統版本手機型號等資訊

// 獲取當前App的基本資訊字典 NSDictionary *infoDictionary = [[NSBundlemainBundle] infoDictionary]; //app名稱

MySQL在高併發下的訂單撮合系統使用共享鎖與排他鎖保證資料一致性

前序 距離上次擇文發表,兩月餘久。2018年也即將要結束了,目前的工作依然是與區塊鏈應用相關的,也很榮幸在9月初受邀簽約出版暫

朱曄的網際網路架構實踐心得S2E7:漫談平臺架構的工作(基礎架構基礎服務基礎平臺基礎中介軟體等等)

前言 程式開發畢竟還不是搬磚這種無腦體力勞動,需要事先有標準,有架構,有設計,絕對不是新公司今天創立,明天就可以開始編碼的。其實很多公司在起步的時候沒有財力和資源建設獨立的基礎架構或平臺架構部門,甚至運維團隊都沒有,但是這不妨礙我們心中有一個藍圖知道努力的方向,本文我們就簡單聊聊平臺架構相關的工作內容(或者說

[視訊演示].NET Core開發的iNeuOS物聯網平臺實現從裝置&PLC平臺移動APP資料鏈路閉環

目       錄 1.      概述... 1 2.      登陸資訊... 2 3.    &n

深入理解mysql-進階知識點啟動項系統變數字符集介紹!

mysql資料庫是當前應用最為的廣泛的資料庫,在實際工作中也經常接觸到。真正用好mysql也不僅僅是會寫sql就行,更重要的是真正理解其內部的工作原理。本文先從巨集觀角度介紹一些mysql相關的知識點,目的是為了讓大家對mysql能有一個大體上的認知,後續再逐一對每個知識點的進行深入解讀。 > 本文主