詳細看一下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(); //如果啓動第二階段,調用該函數 } }