zoukankan      html  css  js  c++  java
  • Android x86 镜像分析之四

    init文件是一个二进制文件,其源码在system/core/init/目录下,文件的函数入口在init.c文件。首先看看其主函数:

     1 int main(int argc, char **argv)
     2 {
     3     //...
     4  umask(0);
     5 
     6      /* Get the basic filesystem setup we need put
     7       * together in the initramdisk on / and then we'll
     8       * let the rc file figure out the rest.
     9       */
    10  mkdir("/dev", 0755);
    11  mkdir("/proc", 0755);
    12  mkdir("/sys", 0755);
    13 
    14  mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");
    15  mkdir("/dev/pts", 0755);
    16  mkdir("/dev/socket", 0755);
    17  mount("devpts", "/dev/pts", "devpts", 0, NULL);
    18  mount("proc", "/proc", "proc", 0, NULL);
    19  mount("sysfs", "/sys", "sysfs", 0, NULL);
    20  //...
    21 }

    在上面的代码中我们省略了部分声明代码,在函数的初始执行执行目录挂载,权限设置等工作。umask函数为进程设置文件模式创建屏蔽字。接着代码如下:

    1 // ...
    2 open_devnull_stdio();
    3 klog_init();
    4 property_init();
    5 
    6 get_hardware_name(hardware, &revision);
    7 
    8 process_kernel_cmdline();
    9 //...

    其中第二行的代码主要是将系统的输出定向到/dev/null 设备。第三行的代码初始化内核日志系统。第四行的代码出要是初始化系统服务,具体的实现在于init.c文件的同层目录下的property_service.c文件中实现。第六行获得硬件信息,具体的实现是在util.c文件中。第8行用来处理内核参数。

    1 initrc_path = property_get("ro.boot.initrc");
    2 if (!initrc_path)
    3     initrc_path = "/init.rc";
    4 INFO("reading config file %s
    ", initrc_path);
    5 init_parse_config_file(initrc_path);

    以上的代码解析加载init.rc 文件,系统首先会尝试获得系统的“ro.boot.initrc”属性,如果获得属性为空那将加载根目录下的init.rc文件,该文件包含在ramdisk.img文件中。第五行解析这个文件,该函数的具体实现在init_parser.c文件中。

  • 相关阅读:
    CDH环境搭建及部署
    Window 安装Sqoop 环境
    软件——keil的查找,错误,不能跳转到相应的行
    软件——机器学习与Python,输入输出的用法
    软件——机器学习与Python,聚类,K——means
    软件——机器学习与Python,if __name__ == '__main__':函数
    硬件——STM32,ADC篇
    生活的开始
    硬件——nrf51822第三篇,按键控制小灯
    硬件——nrf51822第二篇,如何设置keil用来下载程序
  • 原文地址:https://www.cnblogs.com/jjxxjnzy/p/3374120.html
Copyright © 2011-2022 走看看