Smack在Android核心的編譯

來源:互聯網
上載者:User

首先 Smack適合嵌入式裝置--請閱讀smack
in Embedded Computing --Casey Schaufler
  這一篇文章來揭秘如何將smack編譯到Android核心中,
  首先,smack是Linux上的一個安全補丁,如果下載Linux-2.6.38核心後,會發現在shell中輸入make menuconfig會有簡單存取控制smack這一項,選中它,則smack被配置到Linux核心中,然後執行編譯即可,編譯完畢後,在shell中輸入
cd /smack,會切換到smack的虛擬檔案系統(假檔案系統)中,裡面有load,cipso,ambient等幾個虛擬檔案(其實這些檔案以鏈表形式存在於核心空間),在shell中輸入 cd /etc/smack,會發現有accesses檔案,vim accesses,我們可以輸入一行 aa(主體標籤) bb(客體標籤) w(訪問模式),這樣這一行被smack代碼解析成規則,以結構體的形式加入到存放於核心的規則鏈表/smack/load,這比selinux的複雜的TE簡單太多了,稍後我會詳細揭秘smack技術
其次,如何將smack編譯到android核心中去呢?android核心中有個 /security的子目錄,存放著與安全有關的模組,其中就包含了LSM,Selinux,Smack等模組。Google並沒有把LSM移除Android核心。那麼這就為我們編譯smack提供了有利的條件。
那麼怎樣編譯smack?我們可以看下/security/smack中的檔案,我們發現,casy已經把smack的設定檔Kconfig和makefile檔案都寫好了,Kconfig檔案很重要,它是關於模組配置的,在編譯時間需要用到,其中就有一項 bool "simplified ...." depend on NETLABEL
& SECURITY_NETWORK,要想編譯出smack,首先我們必須讓android核心的設定檔能夠支援NETLABEL和SECURITY_NETWORK,那麼具體怎麼做呢?
我們首先選擇panda核心,解壓後會有panda/kernel-ics-chipsee-panda,我們在shell中進行操作,

cd panda/kernel-ics-chipsee-panda

cd arch/arm/configs/
找到該目錄下的預設設定檔vim panda_chinese_def
觀察下發現NETLABEL和SECURITY_NETWORK都沒有配置,我們進行配置,CONFIG_NETLABEL=y,CONFIG_SECURITY_NETWORK=y
然後配置 CONFIG_SECURITY_SMACK=y CONFIG_DEFAULT_SECURITY_SMACK=y CONFIG_DEFAULT_SECURITY="smack"
這樣我們已經把smack需要的配置都寫好了
回到核心主目錄kernel-ics-chipsee-panda/,執行

    cd kernel-ics-chipsee-panda/
    export PATH=/usr/local/arm-2010q1/bin:$PATH
    export CROSS_COMPILE=arm-none-linux-gnueabi-
    export ARCH=arm
    make distclean
    make panda_chipsee_defconfig

  這樣我們在shell中輸入make menuconfig,會有驚喜的發現


這樣smack就被配置到android核心中了


接下來要編譯核心,make uImage
輸入上面命令後,編譯一會就有錯誤提示,沒關係,我們可以按照提示的錯誤,重新修改設定檔(就像上述做法),就行了
編譯成功會如:



新編譯好的核心是uImage
那麼怎麼運行核心呢?我之前也納悶了很久,當時下載android 4.0.3源碼時,就已經有核心,但此核心是編譯好的核心,即巨大的二進位鏡像檔案,存放於android源碼的/prebuilt目錄下,應該是bzImage(具體我記不得了),我們想讓android運行在我們編譯好的核心panda上,輸入命令:
emulator -kernel /host/panda3/kernel-ics-chipsee-panda/arch/arm/boot/uImage
但是會有錯誤提示:



此時我懷疑是記憶體空間問題,因為android4.0.3的模擬器不能在我們新編譯的核心上運行。不管怎樣,我們已經能夠將smack編譯到android核心中了
還有一點要說明下,我們知道LSM是對一些核心對象進行改造,加入了一些安全欄位,代表主客體的安全屬性,為此,要想利用LSM的特性,就要求檔案系統支援檔案的擴充屬性,擴充屬性可以表示檔案的安全屬性,我們可以利用getfattr和setfattr兩個命令擷取和設定檔案的擴充屬性,
請參見:http://blog.csdn.net/ganggexiongqi/article/details/7661024
我們知道android是利用了yaffs2檔案系統,它適合NAND嵌入式裝置,但它不支援檔案的擴充屬性,那麼問題就來了,我們知道smack核心機制是利用Linux 的LSM,這就要求Android的檔案系統必須支援擴充屬性, SEAndroid團隊修改了yaffs2的製作yaff2鏡像檔案--mkyaffs2image.c,在yaffs2的檔案對象頭加入了安全上下文--char
*secontext,它代表了主客體的安全屬性。其實問題很簡單,新版本的Android已經採用了ext4檔案系統,它支援檔案的擴充屬性,
ext4:http://www.baidu.com/link?url=nyUYGJqjJ4zBBpC8yDF8xDhiqDSn1JZjFWsHhEoSNd85PkV8Xil7rskjOH3ijGKNNq
我們再次在回到shell,cd kernel-ics-chipsee-panda,輸入make menuconfig,找到檔案相關配置選項,我們驚奇得發現:





也就是說panda核心已經配置了ext4,並且支援擴充屬性,太好了,接下來的問題是怎麼讓此核心在panda開發板上跑起來?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.