深入解析Android属性系统之SeLinux上下文节点(ContextNode)生成

113 阅读1分钟

0 引言

  在我的前一篇博客讲到了字典树的实现,这里最后讲到字典树的数据最后会写入到/dev/__properties__/property_info文件中去。接下来就是读取这个文件并映射到内存中,并将其中的SeLinux上下文信息生成一系列的ContextNode节点。整个流程如下图所示:

image.png

  在源码PropertyInit()中,完成这一功能的函数是__system_property_area_init()。

image.png

1 解析属性上下文文件

  要想解析属性上下文文件,首先得将数据读取进来。Android源码中/dev/__properties__/property_info文件中的数据读取并初始化到ContextsSerialized对象中。

image.png

  将读取的文件映射到内存中,由PropertyInfoArea对象对它进行管理(反序列化数据)

image.png

2 生成上下文节点(ContextNode)

  利用PropertyInfoArea对象可以很好地获取到SeLinux上下文数据,将这些数据保存到一系列的ContextNode节点中去。这一步同样使用了mmap内存映射,专门开辟了一块匿名内存来存储ContextNode节点。

image.png

  生成一系列的ContextNode节点后,调用它们内部的Open函数,可以生成一系列的属性文件(以它们的context命名)。

image.png

image.png

3 总结

  得到的属性文件如下图所示:

image.png

  这是我上一篇文章举例的两个SeLinux属性。