详细看一下selinux_initialize()函数:
static void selinux_initialize(bool in_kernel_domain) { // 区分内核态和用户态 Timer t; //使用Timer计时,计算selinux初始化耗时 selinux_callback cb; cb.func_log = selinux_klog_callback; // 用于打印Log的回调函数 selinux_set_callback(SELINUX_CB_LOG, cb); cb.func_audit = audit_callback; // 用于检查权限的回调函数 selinux_set_callback(SELINUX_CB_AUDIT, cb); if (in_kernel_domain) { // 内核态处理流程,第一阶段in_kernel_domain为true INFO("Loading SELinux policy...\n"); // 该行log打印不出,INFO级别 // 用于加载sepolicy文件。该函数最终将sepolicy文件传递给kernel,这样kernel就有了安全策略配置文件 if (selinux_android_load_policy() < 0) { ERROR("failed to load policy: %s\n", strerror(errno)); security_failure(); } bool kernel_enforcing = (security_getenforce() == 1); // 内核中读取的信息 bool is_enforcing = selinux_is_enforcing(); // 命令行中得到的信息 if (kernel_enforcing != is_enforcing) { // 用于设置selinux的工作模式。selinux有两种工作模式: // 1、”permissive”,所有的操作都被允许(即没有MAC),但是如果违反权限的话,会记录日志 // 2、”enforcing”,所有操作都会进行权限检查。在一般的终端中,应该工作于enforing模式 if (security_setenforce(is_enforcing)) { //设置selinux的模式,是开还是关 ERROR("security_setenforce(%s) failed: %s\n", is_enforcing ? "true" : "false", strerror(errno)); security_failure(); // 将重启进入recovery mode } } if (write_file("/sys/fs/selinux/checkreqprot", "0") == -1) { security_failure(); } NOTICE("(Initializing SELinux %s took %.2fs.)\n", is_enforcing ? "enforcing" : "non-enforcing", t.duration()); //输出selinux的模式,与初始化耗时
} else { selinux_init_all_handles(); //如果启动第二阶段,调用该函数 } }