<small id='5rGIcV'></small> <noframes id='puTyPILRg'>

  • <tfoot id='mnjERud3t'></tfoot>

      <legend id='sxp1f0'><style id='VlYPz'><dir id='AEYLqBI2xi'><q id='UeD03WrkHc'></q></dir></style></legend>
      <i id='YzQcy'><tr id='IiQlVLZ'><dt id='qeJR'><q id='Ih2pNE'><span id='6TJkhoIVx'><b id='h9cBrQV'><form id='qnILj'><ins id='fSNlHPE'></ins><ul id='XrfWN0CT2G'></ul><sub id='ZQIrcVvdzJ'></sub></form><legend id='AjfBikG'></legend><bdo id='msEgJ2v3DY'><pre id='58gH0Y'><center id='0cyx6IXj'></center></pre></bdo></b><th id='I1S98d'></th></span></q></dt></tr></i><div id='FWTEHb'><tfoot id='HXfjD'></tfoot><dl id='Kz2WHM'><fieldset id='y1PGUnRz'></fieldset></dl></div>

          <bdo id='g264b5l'></bdo><ul id='sWcTdD'></ul>

          1. <li id='xuGVqh9Pz'></li>
            登陆

            Linux PSCI结构

            admin 2019-07-18 142人围观 ,发现0个评论

            布景

            • Read the fucking source code!  --By 鲁迅

            • A picture is worth a thousand words. --By 高尔基

            阐明:

            1. Kernel版别:4.14

            2. ARM64处理器

            3. 运用东西:Source Insight 3.5, Visio

            1. 介金姝雅绍

            PSCI, Power State Coordination Interface,由ARM界说的电源办理接口标准,一般由Firmware来完结,而Linux体系能够经过smc/hvc指令来进入不同的Exception Level,然后调用对应的完结。

            那问题来了?为什么要把这个放到Firmware中去完结呢?原因是ARMv8架构,引入了Virtualization,Security等概念,CPU boot、shutdown、suspend/resumen等操作不再如传统那样单纯了。咱们不再是咱们,咱们依然是咱们。

            2. 剖析

            代码途径:arch/arm64/kernel/psci.c drivers/firmware/psci.c

            2.1 整体结构

            Linux对CPU core的操作笼统出了结构struct cpu_operations,开放给上层软件调用,struct cpu_operations一致对底层的CPU及power等资源进行一致操作,完美。今日咱们的故事就从struct cpu_operations开端。

            话不多说,直接上图剖析

            • CPU Operation有两种方法:spin-tablepsci,这个由Device Tree来指定,明显咱们今日说的是psci,以cpu_psci_ops为中心;

            • cpu_psci_ops中的函数Linux PSCI结构指针在arch/arm64/kernel/psci.c中进行赋值,而实践的完结中去调用了psci_ops中的完结;

            • psci_ops中会依据实践的Function ID找到对应的函数,然后经过hvc/smc指令调用Firmware接口;说一个实践的用例吧:比方你现在需要把体系Suspend,在用户输入echo mem > /sys/power/state时,终究会调用到cpu_suspend函数,由上图可知,终究也能调用到底层的Firmware,当然,条件是Firmware中现已完结了该接口。

            所以,现在看起来PSCI其实便是去完结调用底层Firmware的接口,而且填充到对应的数据结构中就行了。

            现在在内核中有三个版别的PSCI,分别是:PSCI V0.1/, PSCI V0.2/, PSCI V1.0,对应的psci_of_match[]一望而知:

            static const struct of_device_id psci_of_match[] __initconst = { { .compatible = "arm,psci", .data = Linux PSCI结构psci_0_1_init}, { .compatible = "arm,psci-0.2", .data = psci_0_2_init}, { .compatible = "arm,psci-1.0", .data = psci_0_2_init}, {},};

            2.1 PSCI v0.1剖析

            下边剖析下PSCI v0.1吧

            咱们从哪里来?要到哪里去?老规矩,直接上图

            • setup_arch开端盯梢,能看到进口为psci_dt_init(),然后跳转到driver/firmware/psci.c中的函数中;

            • psci_dt_init()会去读取并解析Device Tree中的内容,然后挑选版别(psci_0_1_init/psci_0_2_init),挑选指令(hvc/smc)等;

            • psci_0_1_init()函数完结的主要内容其实是填充对应的函数指针,以及psci_function_id[]数组;

            那么怎么从Device Tree到实践的解析和装备中来的呢?下面以arch/arm/boot/dts/xenvm-4.2.dts为例:

            • 设备树是这姿态的


            • 解析的结构是这姿态的

            2.2 PSCI v0.2及以上与PSCI v0.1的差异

            • 代码差异:PSCI v0.2支撑 CPU Suspend,CPU Migrate等操作,也便是功用更全,明显我说的这个是废话,代码阐明全部;

            • DeviceTree的差异:


            Case 1: PSCI v0.1 only.
            psci { compatible = "arm,psci"; method = "smc"; cpu_suspend = <0x95c10000>; cpu_off = <0x95c10001>; cpu_on = <0x95c10002>; migrate = <0x95c10003>; };
            Case 2: PSCI v0.2 only
            psci { compatible = "arm,psci-0.2"; method = "smc"; };
            Case 3: PSCI v0.2 and PSCI v0.1.
            Linux PSCI结构 A DTB may provide IDs for use by kernels without PSCI 0.2 support, enabling firmware and hypervisors to support existing and new kernels. These IDs will be ignored by kernels with PSCI 0.2 support, which will use the standard PSCI 0.2 IDs exclusively.
            psci { compatible = "arm,psci-0.2", "arm,psci"; methLinux PSCI结构od = "hvc";
            cpu_on = < arbitrary value >; cpu_off = < arbitrary value >;
            ... };

            说了是结构剖析,不盼望贴代码了,收工。


            请关注微信公众号
            微信二维码
            不容错过
            Powered By Z-BlogPHP