RK3128系統&驅動開發分享——(三)、系統啟動
RK3128系統啟動大致流程分三個階段
1、boot啟動,即rk3128MiniLoaderAll(L)_V2.31.bin和uboot.img啟動
2、linux核心啟動,即kernel.img的啟動
3、android系統的啟動,即ramdisk.img、system.img的啟動。
這裡講解第三步。
android系統啟動過程是從init程序開始的。(原始碼在/system/core/init/init.c,linux核心啟動完成最後就會跳轉到這個檔案的main函式裡)
Android的init程序主要功能:
1)、分析init.rc啟動指令碼檔案,根據檔案內容執行相應的功能;
init會 根據啟動指令碼中的配置啟動各個service程序(入下圖)。
2)、當一些關鍵程序死亡時,重啟該程序;
3)、提供Android系統的屬性服務;
init.rc指令碼是一個初始化的配置檔案,非常關鍵。
因為android採用ramdisk的方式掛載根檔案系統,而init.rc檔案就放在ramdisk裡,所以系統啟動後修改init.rc檔案是無法儲存住的。
可以採用兩種方法修改:
(1) 有android原始碼的話從原始碼裡直接修改,然後重新編譯即可,直接修改/system/core/rootdir/init.rc
下面詳細說明第二種方法的步驟:
(1) 將ramdisk.img拷貝到某個目錄下,如tmpdir。
(2) 進入tmpdir將ramdisk.img重新命名為ramdisk.img.gz
命令:mv ramdisk.img ramdisk.img.gz
(3) 使用gunzip 解壓ramdisk.img.gz
命令:gunzip ramdisk.img.gz
(4) 在tmpdir目錄下建立新目錄,如ramdisk
命令:mkdir ramdisk
(5) 進入ramdisk目錄
命令:cd ramdisk
(6) 解包
命令:cpio -i -F ../ramdisk.img
(7) 修改init.rc檔案,並儲存
(8) 打包
命令:cpio -i -t -F ../ramdisk.img > list
命令:cpio -o -H newc -O ../new.img < list
命令:gzip new.img
(9) 重新命名new.img
命令:mv new.img ramdisk.img