<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="generator" content="pdf2htmlEX">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link rel="stylesheet" href="https://static.pudn.com/base/css/base.min.css">
<link rel="stylesheet" href="https://static.pudn.com/base/css/fancy.min.css">
<link rel="stylesheet" href="https://static.pudn.com/prod/directory_preview_static/6269de260990925c04684c75/raw.css">
<script src="https://static.pudn.com/base/js/compatibility.min.js"></script>
<script src="https://static.pudn.com/base/js/pdf2htmlEX.min.js"></script>
<script>
try{
pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});
}catch(e){}
</script>
<title></title>
</head>
<body>
<div id="sidebar" style="display: none">
<div id="outline">
</div>
</div>
<div id="pf1" class="pf w0 h0" data-page-no="1"><div class="pc pc1 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6269de260990925c04684c75/bg1.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x1 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">Android 10 <span class="ff2 sc1">开机流程</span></div><div class="t m0 x2 h4 y3 ff1 fs1 fc1 sc0 ls0 ws0">Android init <span class="ff2 sc2">启动进程主要分三个阶段分析<span class="sc0">:</span></span></div><div class="t m0 x2 h5 y4 ff3 fs2 fc2 sc0 ls0 ws0">1.<span class="ff2">概述,</span>Init<span class="_ _0"> </span><span class="ff2">如何被启动</span></div><div class="t m0 x2 h5 y5 ff3 fs2 fc2 sc0 ls0 ws0">2.Init<span class="_ _0"> </span><span class="ff2">进程启动的源码分析</span></div><div class="t m0 x2 h5 y6 ff3 fs2 fc2 sc0 ls0 ws0">3.rc<span class="_ _0"> </span><span class="ff2">语法分析</span></div><div class="t m0 x2 h6 y7 ff1 fs3 fc3 sc0 ls0 ws0">1. <span class="ff2 sc3">概述</span></div><div class="t m0 x2 h5 y8 ff3 fs2 fc2 sc0 ls0 ws0">init<span class="_ _0"> </span><span class="ff2">进程是<span class="_ _0"> </span></span>linux<span class="_ _0"> </span><span class="ff2">系统中用户空间的第一个进程,进程号为<span class="_ _1"> </span></span>1.</div><div class="t m0 x2 h5 y9 ff2 fs2 fc2 sc0 ls0 ws0">当<span class="_ _0"> </span><span class="ff3">bootloader<span class="_ _0"> </span></span>启<span class="_ _2"></span>动后<span class="_ _2"></span>,启动<span class="_ _3"> </span><span class="ff3">ke<span class="_ _4"></span>rnel<span class="ff2">,</span>ker<span class="_ _4"></span>nel<span class="_ _0"> </span><span class="ff2">启<span class="_ _2"></span>动完后<span class="_ _2"></span>,在<span class="_ _2"></span>用户空<span class="_ _2"></span>间启动<span class="_"> </span></span>i<span class="_ _4"></span>nit<span class="_ _0"> </span><span class="ff2">进程<span class="_ _2"></span>,再<span class="_ _2"></span>通过<span class="_ _0"> </span></span>init<span class="_ _0"> </span><span class="ff2">进<span class="_ _2"></span>程,来<span class="_ _2"></span>读取<span class="_ _3"> </span></span>init.rc<span class="_ _1"> </span><span class="ff2">中<span class="_ _2"></span>的相</span></span></div><div class="t m0 x2 h5 ya ff2 fs2 fc2 sc0 ls0 ws0">关配置,从而来启动其他相关进程以及其他操作。</div><div class="t m0 x2 h5 yb ff3 fs2 fc2 sc0 ls0 ws0">init<span class="_ _1"> </span><span class="ff2">进程被赋予了很多重要工作,</span>init<span class="_ _0"> </span><span class="ff2">进程启动主要分为两个阶段:</span></div><div class="t m0 x2 h5 yc ff2 fs2 fc2 sc0 ls0 ws0">第一个阶段完成以下内容:</div><div class="t m0 x2 h5 yd ff3 fs2 fc2 sc0 ls0 ws0">ueventd/watchdogd<span class="_ _1"> </span><span class="ff2">跳转及环境变量设置</span></div><div class="t m0 x2 h5 ye ff2 fs2 fc2 sc0 ls0 ws0">挂载文件系统并创建目录</div><div class="t m0 x2 h5 yf ff2 fs2 fc2 sc0 ls0 ws0">初始化日志输出、挂载分区设备</div><div class="t m0 x2 h5 y10 ff2 fs2 fc2 sc0 ls0 ws0">启用<span class="_ _1"> </span><span class="ff3">SELinux<span class="_ _0"> </span></span>安全策略</div><div class="t m0 x2 h5 y11 ff2 fs2 fc2 sc0 ls0 ws0">开始第二阶段前的准备</div><div class="t m0 x2 h5 y12 ff2 fs2 fc2 sc0 ls0 ws0">第二个阶段完成以下内容:</div><div class="t m0 x2 h5 y13 ff2 fs2 fc2 sc0 ls0 ws0">初始化属性系统</div><div class="t m0 x2 h5 y14 ff2 fs2 fc2 sc0 ls0 ws0">执行<span class="_ _1"> </span><span class="ff3">SELinux<span class="_ _0"> </span></span>第二阶段并恢复一些文件安全上下文</div><div class="t m0 x2 h5 y15 ff2 fs2 fc2 sc0 ls0 ws0">新建<span class="_ _1"> </span><span class="ff3">epoll<span class="_ _0"> </span></span>并初始化子进程终止信号处理函数</div><div class="t m0 x2 h5 y16 ff2 fs2 fc2 sc0 ls0 ws0">设置其他系统属性并开启属性服务</div><div class="t m0 x2 h4 y17 ff1 fs1 fc3 sc0 ls0 ws0">2.<span class="ff2 sc3">架构</span></div><div class="t m0 x2 h4 y18 ff1 fs1 fc3 sc0 ls0 ws0">2.1 Init<span class="_ _5"> </span><span class="ff2 sc3">进程如何被启动?</span></div><div class="t m0 x2 h7 y19 ff3 fs4 fc2 sc0 ls0 ws0">Init<span class="_ _1"> </span><span class="ff2">进程是在<span class="_ _1"> </span></span>K<span class="_ _4"></span>ernel<span class="_ _1"> </span><span class="ff2">启动后,启动的第一个用户空间进程,</span>PID<span class="_ _1"> </span><span class="ff2">为<span class="_ _1"> </span></span>1<span class="ff2">。</span></div><div class="t m0 x2 h7 y1a ff3 fs4 fc2 sc0 ls0 ws0">k<span class="_ _4"></span>ernel_init<span class="_ _1"> </span><span class="ff2">启动后,完成一<span class="_ _2"></span>些<span class="_ _1"> </span></span>init<span class="_ _1"> </span><span class="ff2">的初始<span class="_ _2"></span>化操作,然后去系<span class="_ _2"></span>统根目录下依次找<span class="_"> </span></span>ramdisk_ex<span class="_ _4"></span>ecute_command<span class="_ _1"> </span><span class="ff2">和<span class="_ _1"> </span></span>ex<span class="_ _4"></span>ecute_command<span class="_ _1"> </span><span class="ff2">设置的应</span></div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,0.000000,0.000000]}'></div></div>
</body>
</html>
<div id="pf2" class="pf w0 h0" data-page-no="2"><div class="pc pc2 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6269de260990925c04684c75/bg2.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x2 h7 y1b ff2 fs4 fc2 sc0 ls0 ws0">用程序,如<span class="_ _2"></span>果这两个目录都找<span class="_ _2"></span>不到,就依次去根<span class="_ _2"></span>目录下找 <span class="_ _6"> </span><span class="ff3">/sbin/init</span>,<span class="ff3">/etc/init</span>,<span class="_ _2"></span><span class="ff3">/bin/init,/bin/sh </span>这四个<span class="_ _2"></span>应用程序进行启动<span class="_ _2"></span>,只要这些应用程<span class="_ _2"></span>序</div><div class="t m0 x2 h7 y1c ff2 fs4 fc2 sc0 ls0 ws0">有一个启动了,其他就不启动了。</div><div class="t m0 x2 h7 y1d ff3 fs4 fc2 sc0 ls0 ws0">Android<span class="_ _6"> </span><span class="ff2">系统一般会在根目录下放一个<span class="_ _1"> </span></span>init<span class="_ _1"> </span><span class="ff2">的可执行文件,也就是说<span class="_ _1"> </span></span>Linux<span class="_ _1"> </span><span class="ff2">系统的<span class="_ _1"> </span></span>init<span class="_ _1"> </span><span class="ff2">进程在内核初始化完成后,就直接执行<span class="_ _1"> </span></span>init<span class="_ _1"> </span><span class="ff2">这个文件</span></div><div class="t m0 x2 h6 y1e ff1 fs3 fc3 sc0 ls0 ws0">2.2Init<span class="_ _3"> </span><span class="ff2 sc3">进程启动后,做了哪些事?</span></div><div class="t m0 x2 h5 y1f ff3 fs2 fc2 sc0 ls0 ws0">Init<span class="_ _0"> </span><span class="ff2">进程启<span class="_ _2"></span>动后,首<span class="_ _2"></span>先挂载文<span class="_ _2"></span>件系统、<span class="_ _2"></span>再挂载相<span class="_ _2"></span>应的分区<span class="_ _2"></span>,启动<span class="_ _7"> </span></span>SELinux<span class="_ _0"> </span><span class="ff2">安全策<span class="_ _2"></span>略,启动<span class="_ _2"></span>属性服务<span class="_ _2"></span>,解析<span class="_"> </span></span>rc<span class="_ _1"> </span><span class="ff2">文<span class="_ _2"></span>件,并启动<span class="_ _2"></span>相</span></div><div class="t m0 x2 h5 y20 ff2 fs2 fc2 sc0 ls0 ws0">应属性服务进程,初始化<span class="_ _0"> </span><span class="ff3">epoll</span>,依次设置<span class="_ _0"> </span><span class="ff3">signal<span class="_ _2"></span></span>、<span class="ff3">pr<span class="_ _4"></span>operty<span class="ff2">、</span>key<span class="_ _4"></span>chord<span class="_ _1"> </span><span class="ff2">这<span class="_ _0"> </span></span>3<span class="_ _1"> </span><span class="ff2">个<span class="_ _0"> </span></span>fd<span class="_ _0"> </span><span class="ff2">可读时相对应的回调函数。进入无线循环<span class="_ _2"></span>,</span></span></div><div class="t m0 x2 h5 y21 ff2 fs2 fc2 sc0 ls0 ws0">用来响应各个进程的变化与重建。</div><div class="t m0 x2 h6 y22 ff1 fs3 fc3 sc0 ls0 ws0">3.kernel<span class="_ _0"> </span><span class="ff2 sc3">启动<span class="_ _3"> </span></span>init<span class="_ _3"> </span><span class="ff2 sc3">进程 源码分析</span></div><div class="t m0 x2 h8 y23 ff1 fs3 fc3 sc0 ls0 ws0">3.1kernel_init</div><div class="t m0 x2 h5 y24 ff3 fs2 fc2 sc0 ls0 ws0">ke<span class="_ _4"></span>rnel/msm-4.19/init/main.c-------k<span class="_ _4"></span>ernel<span class="_ _4"></span>_init()<span class="_ _2"></span><span class="ff2">的分区,启动<span class="_ _1"> </span></span>SELinux<span class="_ _0"> </span><span class="ff2">安全策略,</span></div><div class="t m0 x2 h5 y25 ff3 fs2 fc2 sc0 ls0 ws0">run_init_process(ramdisk_e<span class="_ _4"></span>x<span class="_ _4"></span>ecute_command)//<span class="ff2">运行可执行文件,启动<span class="_ _0"> </span></span>init<span class="_ _0"> </span><span class="ff2">进程</span></div><div class="t m0 x2 h8 y26 ff1 fs3 fc3 sc0 ls0 ws0">3.2do_basic_setup</div><div class="t m0 x2 h5 y27 ff3 fs2 fc2 sc0 ls0 ws0">ke<span class="_ _4"></span>rnel_init_fr<span class="_ _4"></span>eeable<span class="ff2">()</span>----do_basic_setup<span class="ff2">()</span></div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,0.000000,0.000000]}'></div></div>
<div id="pf3" class="pf w0 h0" data-page-no="3"><div class="pc pc3 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6269de260990925c04684c75/bg3.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x2 h6 y28 ff1 fs3 fc3 sc0 ls0 ws0">4. Init <span class="ff2 sc3">进程启动源码分析</span></div><div class="t m0 x2 h5 y29 ff2 fs2 fc2 sc0 ls0 ws0">涉及源码文件:</div><div class="t m0 x2 h6 y2a ff1 fs3 fc3 sc0 ls0 ws0">4.1 Init <span class="ff2 sc3">进程入口</span></div><div class="t m0 x2 h5 y2b ff2 fs2 fc2 sc0 ls0 ws0">前面已经通过<span class="_ _1"> </span><span class="ff3">ker<span class="_ _4"></span>nel_init,<span class="ff2">启动了<span class="_ _0"> </span></span>init<span class="_ _1"> </span><span class="ff2">进程,</span>init<span class="_ _0"> </span><span class="ff2">进程属于一个守护进程,准确的说,它是<span class="_ _0"> </span></span>Linux<span class="_ _1"> </span><span class="ff2">系统中用户控制的第一个进</span></span></div><div class="t m0 x2 h5 y2c ff2 fs2 fc2 sc0 ls0 ws0">程,它的进程号为<span class="_ _1"> </span><span class="ff3">1</span>。它的生命周期贯穿整个<span class="_ _0"> </span><span class="ff3">Linux<span class="_ _0"> </span></span>内核运行的始终。<span class="ff3">Android<span class="_ _1"> </span></span>中所有其它的进程共同的鼻祖均为<span class="_ _0"> </span><span class="ff3">init<span class="_ _1"> </span></span>进程。</div><div class="t m0 x2 h5 y2d ff2 fs2 fc2 sc0 ls0 ws0">可以通过<span class="ff3">"adb shell ps |grep init" </span>的命令来查看<span class="_ _1"> </span><span class="ff3">init<span class="_ _0"> </span></span>的进程号。</div><div class="t m0 x2 h5 y2e ff3 fs2 fc2 sc0 ls0 ws0">Android Q(10.0) <span class="ff2">的<span class="_ _1"> </span></span>init<span class="_ _0"> </span><span class="ff2">入口函数由原先的<span class="_ _1"> </span></span>init.cpp <span class="ff2">调整到了<span class="_ _0"> </span></span>main.cpp<span class="ff2">,把各个阶段的操作分离开来,使代码更加简洁命</span></div><div class="t m0 x2 h5 y2f ff2 fs2 fc2 sc0 ls0 ws0">令,接下来我们就从<span class="_ _1"> </span><span class="ff3">main<span class="_ _0"> </span></span>函数开始学习。<span class="ff3">[system/core/init/main.cpp]</span></div><div class="t m0 x2 h9 y30 ff3 fs2 fc2 sc0 ls0 ws0">/*</div><div class="t m0 x2 h5 y31 ff3 fs2 fc2 sc0 ls0 ws0"> * 1.<span class="ff2">第一个参数<span class="_ _1"> </span></span>arg<span class="_ _2"></span>c<span class="_ _1"> </span><span class="ff2">表示参数个数,第二个参数是参数列表,也就是具体的参数</span></div><div class="t m0 x2 h5 y32 ff3 fs2 fc2 sc0 ls0 ws0"> * 2.main<span class="_ _1"> </span><span class="ff2">函数有四个参数入口,</span></div><div class="t m0 x2 h5 y33 ff3 fs2 fc2 sc0 ls0 ws0"> *<span class="ff2">一是参数中有<span class="_ _1"> </span></span>ueventd<span class="_ _2"></span><span class="ff2">,进入<span class="_ _1"> </span></span>ueventd_main</div><div class="t m0 x2 h5 y34 ff3 fs2 fc2 sc0 ls0 ws0"> *<span class="ff2">二是参数中有<span class="_ _1"> </span></span>subcon<span class="_ _2"></span>text<span class="ff2">,进入<span class="_ _1"> </span></span>InitLogging <span class="ff2">和<span class="_ _0"> </span></span>SubcontextMain</div><div class="t m0 x2 h5 y35 ff3 fs2 fc2 sc0 ls0 ws0"> *<span class="ff2">三是参数中有<span class="_ _1"> </span></span>selinu<span class="_ _2"></span>x_setup<span class="ff2">,进入<span class="_ _1"> </span></span>SetupSelinux</div><div class="t m0 x2 h5 y36 ff3 fs2 fc2 sc0 ls0 ws0"> *<span class="ff2">四是参数中有<span class="_ _1"> </span></span>second_<span class="_ _2"></span>stage<span class="ff2">,进入<span class="_ _1"> </span></span>SecondStageMain</div><div class="t m0 x2 h5 y37 ff3 fs2 fc2 sc0 ls0 ws0"> *3.main<span class="_ _0"> </span><span class="ff2">的执行顺序如下:</span></div><div class="t m0 x2 h5 y38 ff3 fs2 fc2 sc0 ls0 ws0"> * (1)ueventd_main init<span class="_ _0"> </span><span class="ff2">进程创建子进程<span class="_ _1"> </span></span>u<span class="_ _2"></span>eventd<span class="ff2">,</span></div><div class="t m0 x2 h5 y39 ff3 fs2 fc2 sc0 ls0 ws0"> * <span class="ff2">并将创建设备节点文件的工作托付给<span class="_ _0"> </span></span>ueventd<span class="ff2">,</span>ueventd<span class="_ _0"> </span><span class="ff2">通过两种方式创建设备节点文件</span></div><div class="t m0 x2 h5 y3a ff3 fs2 fc2 sc0 ls0 ws0"> * (2)FirstStageMain <span class="ff2">启动第一阶段</span></div><div class="t m0 x2 h5 y3b ff3 fs2 fc2 sc0 ls0 ws0"> * (3)SetupSelinux <span class="ff2">加载<span class="_ _0"> </span></span>selinux<span class="_ _1"> </span><span class="ff2">规则,并设置<span class="_ _0"> </span></span>selinux<span class="_ _0"> </span><span class="ff2">日志</span>,<span class="ff2">完成<span class="_ _0"> </span></span>SELinux<span class="_ _0"> </span><span class="ff2">相关工作</span></div><div class="t m0 x2 h5 y3c ff3 fs2 fc2 sc0 ls0 ws0"> * (4)SecondStageMain <span class="ff2">启动第二阶段</span></div><div class="t m0 x2 h9 y3d ff3 fs2 fc2 sc0 ls0 ws0"> */</div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,0.000000,0.000000]}'></div></div>
<div id="pf4" class="pf w0 h0" data-page-no="4"><div class="pc pc4 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6269de260990925c04684c75/bg4.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x2 ha y3e ff1 fs1 fc2 sc0 ls0 ws0">4.2 ueventd_main</div><div class="t m0 x2 h5 y3f ff2 fs2 fc2 sc0 ls0 ws0">代码路径:<span class="ff3">platform/system/core<span class="_ _4"></span>/init/ueventd.cpp</span></div><div class="t m0 x2 h5 y40 ff3 fs2 fc2 sc0 ls0 ws0">Android<span class="_ _1"> </span><span class="ff2">根文件系统的镜像中不存在“</span>/dev”<span class="ff2">目录,该目录是<span class="_ _0"> </span></span>init<span class="_ _1"> </span><span class="ff2">进程启动后动态创建的。</span></div><div class="t m0 x2 h5 y41 ff2 fs2 fc2 sc0 ls0 ws0">因此,建立<span class="_ _1"> </span><span class="ff3">Android<span class="_ _1"> </span></span>中设备节点文件的重任,也落在了<span class="_ _0"> </span><span class="ff3">init<span class="_ _0"> </span></span>进程身上。为此,<span class="ff3">init<span class="_ _1"> </span></span>进程创建子进程<span class="_ _0"> </span><span class="ff3">ueventd</span>,并将创建设备节</div><div class="t m0 x2 h5 y42 ff2 fs2 fc2 sc0 ls0 ws0">点文件的工作托付给<span class="_ _1"> </span><span class="ff3">ueventd</span>。</div><div class="t m0 x2 h5 y43 ff3 fs2 fc2 sc0 ls0 ws0">ueventd<span class="_ _1"> </span><span class="ff2">通过两种方式创建设备节点文件。</span></div><div class="t m0 x2 hb y44 ff2 fs2 fc2 sc0 ls0 ws0">第一种方式对应“冷插拔”(<span class="ff3">Cold Plug</span>),<span class="ff4">即</span>以<span class="ff4">预</span>先<span class="ff4">定义</span>的设备信<span class="ff4">息</span>为<span class="ff4">基础</span>,当<span class="_ _0"> </span><span class="ff3">ueventd<span class="_ _1"> </span></span>启动后,统一创建设备节点文件。这</div><div class="t m0 x2 hb y45 ff2 fs2 fc2 sc0 ls0 ws0">一<span class="ff4">类</span>设备节点文件也被<span class="ff4">称</span>为<span class="ff4">静</span>态节点文件。</div><div class="t m0 x2 hb y46 ff2 fs2 fc2 sc0 ls0 ws0">第二种方式对应“<span class="ff4">热</span>插拔”(<span class="ff3">Hot Plug</span>),<span class="ff4">即</span>在系统运行中,当有设备插入<span class="_ _0"> </span><span class="ff3">USB<span class="_ _1"> </span><span class="ff4">端</span></span>口时,<span class="ff3">ueventd<span class="_ _0"> </span></span>就会接<span class="ff4">收</span>到这一事件,为插</div><div class="t m0 x2 hb y47 ff2 fs2 fc2 sc0 ls0 ws0">入的设备动态创建设备节点文件。这一<span class="ff4">类</span>设备节点文件也被<span class="ff4">称</span>为动态节点文件。</div><div class="t m0 x2 h4 y48 ff1 fs1 fc2 sc0 ls0 ws0">4.3 init <span class="ff2 sc4">进程启动第一阶段</span></div><div class="t m0 x2 h5 y49 ff2 fs2 fc2 sc0 ls0 ws0">代码路径:<span class="ff3">platform\system\core<span class="_ _4"></span>\init\<rst_stage_init.cpp</span></div><div class="t m0 x2 hb y4a ff3 fs2 fc2 sc0 ls0 ws0">init<span class="_ _1"> </span><span class="ff2">进程第一阶段做的主要工作是挂载分区</span>,<span class="_ _2"></span><span class="ff2">创建设备节点和一些关<span class="ff4">键</span>目录</span>,<span class="ff2">初始化日志输出系统</span>,<span class="ff2">启用<span class="_ _1"> </span></span>SELinux<span class="_ _0"> </span><span class="ff2">安全策略</span></div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,0.000000,0.000000]}'></div></div>
<div id="pf5" class="pf w0 h0" data-page-no="5"><div class="pc pc5 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/6269de260990925c04684c75/bg5.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x2 h5 y4b ff2 fs2 fc2 sc0 ls0 ws0">第一阶段完成以下内容:</div><div class="t m0 x2 hb y4c ff3 fs2 fc2 sc0 ls0 ws0">/* 01. <span class="ff2">创建文件系统目录并挂载相关的文件系统 </span>*//* 02. <span class="ff4">屏蔽标<span class="ff2">准的输入输出</span></span>/<span class="ff2">初始化内核<span class="_ _0"> </span></span>log<span class="_ _0"> </span><span class="ff2">系统 </span>*/</div><div class="t m0 x2 h4 y4d ff1 fs1 fc2 sc0 ls0 ws0">4.4 <span class="ff2 sc4">加载<span class="_ _5"> </span></span>SELinux<span class="_ _3"> </span><span class="ff2 sc4">规则</span></div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,0.000000,0.000000]}'></div></div>