深入剖析Android中init进程实现的C语言源码

2020-01-06 13:38:30丽君

property_init函数中只是简单的调用了init_property_area方法,接下来我们看一下这个方法的具体实现:

 

 
  1. static int property_area_inited = 0;  static workspace pa_workspace; 
  2. static int init_property_area(void)  { 
  3. // 属性空间是否已经初始化  if (property_area_inited) 
  4. return -1;   
  5. if (__system_property_area_init())  return -1; 
  6.   if (init_workspace(&pa_workspace, 0)) 
  7. return -1;   
  8. fcntl(pa_workspace.fd, F_SETFD, FD_CLOEXEC);   
  9. property_area_inited = 1;  return 0; 

从init_property_area函数,我们可以看出,函数首先判断属性内存区域是否已经初始化过,如果已经初始化,则返回-1。如果没有初始化,我们接下来会发现有两个关键函数__system_property_area_init和init_workspace应该是跟内存区域初始化相关。那我们分别分析一下这两个函数具体实现。

 

 
  1. __system_property_area_init   
  2. __system_property_area_init函数位于/bionic/libc/bionic/system_properties.c文件中,具体代码实现如下:   
  3. struct prop_area {  unsigned bytes_used; 
  4. unsigned volatile serial;  unsigned magic; 
  5. unsigned version;  unsigned reserved[28]; 
  6. char data[0];  }; 
  7. typedef struct prop_area prop_area;  prop_area *__system_property_area__ = NULL;