zoukankan      html  css  js  c++  java
  • Android 的 ramdisk.img、system.img、userdata.img 作用说明,以及UBoot 系统启动过程

    首先通過編譯,先將android內核編譯成功。正常情況下,在目錄out/target.product/generic/(但是有的就沒有generic文件,如freescale和iriver;但是lonshinetech下面就有這個文件,依據情況而定,只要能找到生成的三個文件就可以。例如:~/freescale/R9.2/out/target/product/imx51_bbg$ )下會生成三個文件:ramdisk.img,system.img,userdata.img。這三個文件的作用如下:

    (1) ramdisk.img

    一個分區影像文件,它會在kernel 啟動的時候,以只讀的方式被 mount , 這個文件中只是包含了 /init 以及一些配置文件,這個ramdisk 被用來調用init,以及把真正的root file system mount 起來。
    #其實ramdisk.img的內容就是/out/target/product/generic/root目錄的壓縮而已。

    方法1: android編譯生成後的ramdisk.img是一個gzip格式的文件,輸入命令 # file ramdisk.img, 會得到 =>ramdisk.img: gzip compressed data, from Unix

    那麼先解壓ramdisk.img,因為後綴不是.gz,所以用—S選項, # gunzip -S .img ramdisk.img
    這樣就得到一個新文件ramdisk.img,用 # file ramdisk 查看格式 , 得到 => ramdisk: ASCII cpio archive (SVR4 with no CRC)

    可以看出解壓生成的ramdisk是cpio格式的文件,再次解壓,為了防止解壓後文件混亂,
    首次建立一個目錄如: # mkdir rfs //rfs可以用來放ramdisk解壓後的文件, 進入 # cd rfs
    解壓 # cpio -i -F ../ramdisk

    方法2: 將ramdisk.img復制一份到任何其他目錄下,將其改名為ramdisk.img.gz,然後使用命令 # gunzip ramdisk.img.gz,
    然後新建一個文件夾ramdisk,進入,輸入命令 # cpio -i -F ../ramdisk.img


    得到結果如下:
    drwxr-xr-x 8 root root 4096 2011-01-12 11:36 ./
    drwxr-xr-x 13 root root 4096 2011-01-12 11:35 ../
    drwxrwx--x 2 root root 4096 2011-01-12 11:36 data/
    -rw-r--r-- 1 root root 118 2011-01-12 11:36 default.prop
    drwxr-xr-x 2 root root 4096 2011-01-12 11:36 dev/
    -rwxr-x--- 1 root root 107784 2011-01-12 11:36 init*
    -rwxr-x--- 1 root root 492 2011-01-12 11:36 init.freescale.rc*
    -rwxr-x--- 1 root root 1677 2011-01-12 11:36 init.goldfish.rc*
    -rwxr-x--- 1 root root 18263 2011-01-12 11:36 init.rc*
    drwxr-xr-x 2 root root 4096 2011-01-12 11:36 proc/
    drwxr-x--- 2 root root 4096 2011-01-12 11:36 sbin/
    drwxr-xr-x 2 root root 4096 2011-01-12 11:36 sys/
    drwxr-xr-x 2 root root 4096 2011-01-12 11:36 system/

    #可以看出這寫文件是和root目錄下的內容完全一樣,其實就是對root目錄的打包和壓縮。可以是用tree -L 1來查看root的目錄

    (2) system.img

    它包含了整個系統,android 的framework,application 等等,會被掛接到 "/" 上,包含了系統中所有的二進制文件
    # system.img是out/target.product/generic/目錄下system目錄的一個映射,類似與根文件系統的映像,放著android 的應用程序、配置文件和字體等。

    root@root-OptiPlex-380:~/lonshinetech/src/SPU_B0_R0_0/out/target/product/generic/system$ tree -L 1
    .
    |-- bin
    |-- build.prop
    |-- etc
    |-- fonts
    |-- framework
    |-- lib
    |-- usr
    -- xbin

    重新打包system.img 具體辦法
    a) 在android編譯後生成的out目錄中查找這個工具 mkyaffs2image
    # find out/ -name mkyaffs2image
    得到=>out/host/linux-x86/bin/mkyaffs2image
    b) android編譯後會生成system/ 這個目錄,而這個目錄就是用來生成system.img的
    # mkyaffs2image system/ system.img

    (3) userdata.img

    將會被掛接到 /data 下,包含了所有應用相關的配置文件,以及用戶相關的數據 。



    (4) Android啟動過程

    Android啟動過程使,會由UBOOT傳入一個init參數,這個init參數制定了開機的時候運行的第一個運行的程序,默認就是init程序,這個程序就在ramdisk.img中,可以分析一下它的代碼,看看在其中到底做了一些什麼樣的初始化任務,它的源文件在system/core/init/init.c中。

    它會調用init.rc初始化這個文件,這個文件在out/target/product/generic/root下。
    android啟動時首先加載的是ramdisk.img鏡像,並掛載到/目錄下,並進行一系列的初始化動作,包括創建各種需要的目錄,初始化console,開啟服務等。system.img是在init.rc中指定一些腳本命令,通過init.c進行解析並掛載到根目錄下的/system目錄下的。
  • 相关阅读:
    @RequestParam注解使用:Name for argument type [java.lang.String] not available, and parameter name information not found in class file either.
    cglib动态代理导致注解丢失问题及如何修改注解允许被继承
    springboot Autowired BeanNotOfRequiredTypeException
    git根据用户过滤提交记录
    不同包下,相同数据结构的两个类进行转换
    How to use Jackson to deserialise an array of objects
    jooq实践
    java如何寻找main函数对应的类
    Python--matplotlib
    Python 和 Scikit-Learn
  • 原文地址:https://www.cnblogs.com/LoongEmbedded/p/5298415.html
Copyright © 2011-2022 走看看