armv8-armv9中断系列详解-硬件基础篇

发表于 2年以前  | 总阅读数:984 次

目录

一 序言

1、序言

2、学习目标

二、硬件基础篇

1 中断的定义

2 FIQ和IRQ

3 中断术语的介绍

4 gic中断控制器的介绍

5 Core中的中断控制器接口的介绍

6 同步异常和异步异常的概念

6.1、同步异常和异步异常的定义

6.2、系统中有哪些异步异常?

6.3、系统中有哪些同步异常?

7 软件对中断的处理流程

8 向量表基地址寄存器的介绍

9 中断向量表的介绍

10 中断进入和中断退出时的硬件自动行为

10.1 当异常进来之后ARM CORE的硬件自动的行为(Exception entry)

10.2 当异常退出时ARM CORE的硬件自动的行为(Exception return)

11 中断的标记

12 中断的路由

13 中断的MASK(屏蔽)

14 中断路由(信号流)的总结

一、序言

1、序言

带着问题去学习,关于异常/中断的一些思考:

  • (1)、在如下的一个大系统种,cpu正在optee os中运行,突然来了一个想给Linux Kernel处理的中断(如一个蓝牙中断),那么此时的软硬件流程是怎样的?
  • (2)、在上述的大系统中,你的Linux Kernel、optee os、hypervisor、ATF系统中都有异常向量表,那么当一个中断到来时,是跳转到哪个系统中的向量表呢
  • (3)、什么是中断嵌套?怎样可以支持中断嵌套?什么是中断抢占?什么是中断优先级?什么是运行中断优先级?
  • (4)、什么是FIQ?FIQ和IRQ的关系是什么?
  • (5)、当来了一个中断,是如何跳转到向量表的?中间经过了怎样的路由?
  • (6)、当你调用了svc/hvc/smc指令后,cpu是如何跳转到你期望的目标地址的?
  • (7)、同步异常有哪些,异步异常有哪些,哪些优先级是一样的,哪些优先级是不一样的?
  • (8)、异常向量表存放在哪里?为什么会有人说放在0x00000000处?
  • (9)、什么是interrupt is asserted ?什么是interrupt is taken ?什么是PE Acknowledge this interrupt ?target 、routing又是什么意思?target from和target to呢?

做为一名底层安全工程师、一名一线支持客户的FAE,工作的内容涉及到TF-A、TEE、Linux Kernel、hypervisor、SPM等众多模块,cpu(或PE或core或PC)也会在这众多模块之间跳来跳去,由于这些代码大多数都是开源的,都是别人写好的,其实很多时候,也无需去看其底层的设计原理。但做为一名FAE,会遇到客户的灵魂一问,为了给客户一个专业的感觉,不得不去弄懂底层深层次的原理. 另外,有些时候遇到了性能相关问题,不懂底层的设计原理,也许就无法分析这类问题。

本人不是什么专家,也不是什么的大佬,也就是看了一些arm文档,加上自己的理解,然后总结出如下文章,当然我在总结的时候,一切都以官方资料为准,尽量不瞎说不乱说。。

最后,希望这系列文章,能够对大家有所帮助。好好学习、天天向上,卷起来同志们。

说明:

  • 本系列所讲述的,都是以armv8-aarch64/armv9架构位基基础,Linux Kernel 5.10、optee3.16、TF-A 2.5
  • 大多数内容来自arm官方文档、很小很小部靠猜测,再加上部分自己的理解...

2、学习目标

  • 理解整个中断的数据流,从peripheral到gic到core再到操作系统软件
  • 了解中断的产生、中断的标记、中断的路由、中断的Master,以及操作系统对中断的处理
  • 了解从peripheral产生中断后,有哪些是硬件自动的行为,有哪些是架构推荐定义的软件流程,以及各类操作系统软件中的处理流程
  • 本系列文章主要讲述图中的34 ,主要包含以下文章:01-armv8/armv9中断系列详解-序言 02-armv8/armv9中断系列详解-硬件基础篇 03-armv8/armv9中断系列详解-中断示例展示(不含虚拟化部分) 04-armv8/armv9中断系列详解-中断示例展示(虚拟化部分) 05-armv8/armv9中断系列详解-optee运行时来了一个REE(linux)中断–代码导读 06-armv8/armv9中断系列详解-软件篇-Linux kernel中断相关软件导读

二、硬件基础篇

1 中断的定义

有人说,中断就包含IRQ和FIQ,其实这是不准确的,准确的说法应该是:产生到aarch64的异步异常(包括IRQ, FIQ, SError) 可看作中断。官方文档原话 :IntheArmv8-A architecture,asynchronous exceptions that are taken toAArch64state are also knownasinterrupts.

2 FIQ和IRQ

有人说FIQ是快速中断, FIQ比IRQ具有较高的优先级,而且他还能提出ARM官方文档来证明他说的正确性:

其实,这也是错误的!

正确的说法是FIQ和IRQ具有同样的优先级(默认的情况下,我们只讨论armv8-aarch64和armv9)

3 中断术语的介绍

SPIs(Share Periphral Interrupts)中断进来之后,由inactive状态变成pending,此时中断标记为IRQ/FIQ,这是也就是中断assert了,然后该中断会根据HCR/SCR等的配置进行路由(路由到哪个Exception Level等),这个过程也就target,也可以叫做routing。路由之后,在部分场景下还会再检查PSTATE的MASK位,接下来就是PE acknowledge了,此时也就是中断被taken了。PE acknowledge后,cpu interface会将该中断置为Active.

4 gic中断控制器的介绍

(注意:本文重点介绍armv8/armv9异常中断,不会展开介绍gic,这里只是带一下简单概念) gic中断控制器有众多版本,gicv2/gicv3/gicv4是gic的架构,gic500/gic600是具体的gic IP。而在armv8/armv9中,基本都是使用的gicv3/gicv4。如下图所示,每一个core都定义了,它说使用的gic架构。

gic中断控制器与core连接的硬件框图

5 Core中的中断控制器接口的介绍

在gicv2中,gic中断控制器将中断信号(irq,fiq,serror)直接以signal的方式发送给core。而在gicv3中,gic的组件发生变化,将gic的cpu internface接口做到了core中,在这种情况下,gic将中断信号通过AXI Stream发送给core(cluster),然后cpu interface再继续发送irq/fiq/serror信息。

6 同步异常和异步异常的概念

6.1、同步异常和异步异常的定义

具备以下3个行为的称之为同步异常:• The exception is generated as a result of direct execution or attempted execution of an instruction. • The return address presented to the exception handler is guaranteed to indicate the instruction that caused the exception. • The exception is precise

其实就是说:

  • 异常是由执行或尝试执行指令产生的
  • 产生异常的那个位置是确定的,即每次执行到“那个指令处”就会产生
  • 异常是precise的

具备以下3个行为的称之为异步异常::• The exception is not generated as a result of direct execution or attempted execution of the instruction stream. • The return address presented to the exception handler is not guaranteed to indicate the instruction that caused the exception. • The exception is imprecise.

其实就是说:

  • 异常不是由执行或尝试执行指令产生的
  • 产生异常的那个位置不是确定的,即不知道执行到哪里,就产生了异常
  • 异常是imprecise的

那么precise 和 imprecise 又是什么意思呢??

比较绕、比较难懂,咱们换一个说法:按照预期产生的异常称之precise,反之imprecise

6.2、系统中有哪些异步异常?

其实主要就是:irq, fiq, SError

Physical interrupts Are signals sent to the PE from outside the PE. They are:

  • SError. System Error.
  • IRQ.
  • FIQ.

Virtual interrupts Are interrupts that software executing at EL2 can enable and make pending. A virtual interrupt is taken from EL0 or EL1 to EL1. Virtual interrupts have names that correspond to the physical interrupts:

  • vSError.
  • vIRQ.
  • vFIQ
6.3、系统中有哪些同步异常?
  • 尝试执行UNDEFINED指令产生的任何异常,包括:(1)、尝试在不适当的异常级别执行指令。(2)、当指令被禁用时尝试执行指令。(3)、尝试执行尚未分配的指令位模式。
  • 非法执行状态异常。这些是由尝试执行指令引起的 PSTATE.IL 为 1,(详细可参考D1-2486 页上的AArch64 状态的非法返回事件)
  • 使用未对齐的 SP 导致的异常。
  • 尝试使用未对齐的 PC 执行指令导致的异常。
  • 由异常生成指令SVC、HVC或SMC引起的异常。
  • 尝试执行系统寄存器定义为被捕获到更高的异常级别。(详细可参考可配置的指令使能和禁止,在D1-2510 页)
  • 由内存地址转换系统生成的指令中止与尝试相关联从产生故障的内存区域执行指令。
  • 内存地址转换系统生成的数据中止与尝试读取或写入产生故障的内存。
  • 由地址未对齐引起的数据中止。
  • 如果实施FEAT_MTE2,则由标记检查故障引起的数据中止。。
  • 所有调试异常:(1)、Breakpoint Instruction exceptions. (2)、Breakpoint exceptions. (3)、Watchpoint exceptions. (4)、Vector Catch exceptions. (5)、Software Step exceptions.
  • 在支持捕获浮点异常的实现中,由捕获的IEEE 浮点异常引起的异常
  • 在某些实现中,外部中止。外部中止是失败的内存访问,包括访问地址转换期间发生的内存系统的那些部分。

7 软件对中断的处理流程

正常情况下,当一个中断(异常)进来之后,PE(cpu)跳转到中断向量表,在中断向量表中会再次调用C语言函数,完成中断的处理,流程图如下所示:

ARM Core支持中断抢占,当一个中断正常处理的时候,可能又触发了一个高优先级的中断,示例如下所示:

思考你所用的操作系统就真的支持中断嵌套吗?如果想支持中断嵌套,需要满足哪些条件呢?后文会有详细介绍。

8 向量表基地址寄存器的介绍

armv8定义了VBAREL1、VBAREL2、VBAR_EL3三个基地址寄存器

思考:1、VBAREL1、VBAREL2、VBAREL3写入的基地址,是物理地址还是虚拟地址?2、基地址不再放0x00000000的位置吗?3、异常向量表中,没有reset offset了?4、异常向量表中的每一个offset为啥是0x80(128)地址空间?以前是多少?5、VBARELx中,为啥末尾11个bit是reserved?

9 中断向量表的介绍

我们可以看出,实际上有四组表,每组表有四个offset,分别对应sync,IRQ,FIQ和serror。

  • 如果发生异常后并没有exception level切换,并且发生异常之前使用的栈指针是SP_EL0,那么使用第一组异常向量表。
  • 如果发生异常后并没有exception level切换,并且发生异常之前使用的栈指针是SP_EL1/2/3,那么使用第二组异常向量表。
  • 如果发生异常导致了exception level切换,并且发生异常之前的exception level运行在AARCH64模式,那么使用第三组异常向量表。
  • 如果发生异常导致了exception level切换,并且发生异常之前的exception level运行在AARCH32模式,那么使用第四组异常向量表。

另外我们还可以看到的一点是,每一个异常入口不再仅仅占用4bytes的空间,而是占用0x80 bytes空间,也就是说,每一个异常入口可以放置多条指令,而不仅仅是一条跳转指令

注意,到了armv9上,增加了 FEAT_DoubleFault之后,异常向量表稍微变化了一丁点变化,如图中的标注所示:

也就是说,当 FEAT_DoubleFault开启之后,且 SCR_EL3.EASE比特设置为1, 那么此时target到EL3的 Synchronous External abort将会跳转到Serror offset。

在中断产生之后,PC(或PE 或 Core 或 cpu)将跳转到VBAR + 中断offset处。事实上在armv8-aarch64或armv9体系中,有3个VBARELx寄存器,另外对于VBAREL1虽然只有一个,但是在不同Security状态的操作系统中,有着不同的cpu context,即也是可以看做成两份。如果是要考虑虚拟化,那么VBAREL2可能也会有两份,VBAREL1可能会有多份。

如下,是在不考虑EL2/虚拟化的时候,画的一张向量表总截图,即当一个中断来时,硬件会自动选择哪一个VBAR_ELx寄存器,硬件会自动选择哪一组向量表,硬件会自动选择哪一个offset

10 中断进入和中断退出时的硬件自动行为

10.1 当异常进来之后ARM CORE的硬件自动的行为(Exception entry)

[for common]

  • PE(即当前PSTATE)状态保存在目标异常级别的SPSR_ELx中
  • 返回地址保存在目标异常级别的ELR_ELx中
  • 所有PSTATE .{D, A, I, F} 都设置为 1。 ---即关闭了所有中断
  • 所选的堆栈指针寄存器是目标异常级别的专用堆栈指针寄存器 ---即使用sp_elx
  • 执行移动到目标异常级别,并从异常向量定义的地址开始 ---即跳转到VBAR_ELx

[for 同步异常]

  • 如果异常是同步异常或 SError 中断,则描述原因的信息, 异常保存在目标异常级别的ESR_ELx中。
  • 如果指令中止异常、数据中止异常、PC 对齐错误异常或Watchpoint异常,且目标异常是aarch64, 错误的虚拟地址保存在FAR_ELx 中。(Instruction Abort exception, Data Abort exception, PC alignment fault exception, or a Watchpoint exception )
  • 如果指令中止异常,或数据中止异常被带到 EL2 并且故障是与第 2 阶段转换,故障 IPA 保存在HPFAR_EL2 中

[for Serror]

  • 对于物理 SError 中断异常,在以下任一情况下,物理 SError 的挂起状态将被清除 SError 中断是边沿触发的。 FEAT_DoubleFault已实现 如果Reliability, Availability, and Serviceability Extension被实施,并且在采取 SError 时中断,记录在ESR_ELx 中的综合症指示除IMPLEMENTATION之外的 SError定义或未分类的 SError 中断综合症
  • 对于虚拟 SError 中断异常,虚拟 SError 的挂起状态, HCR_EL2.VSE位清零

[for FEAT]

  • PSTATE .SSBS 设置为SCTLR_ELx .DSSBS的值
  • 如果FEAT_UAO实现,PSTATE .UAO被设置为0
  • 如果FEAT_MTE实现,PSTATE .TCO设置为1
  • 如果实现了FEATBTI,从 AArch64 到 AArch64 的异步异常,PSTATE .BTYPE 被复制到SPSRELx .BTYPE,然后设置为 0
  • 如果实现了FEATBTI,在将某些类型的同步异常从 AArch64 转移到 AArch64 时,PSTATE .BTYPE 复制到SPSRELx .BTYPE 然后设置为 0 这些类型的同步异常是:软件步骤异常。PC 对齐错误异常。指令中止异常。断点异常或地址匹配向量捕获异常。非法执行状态异常。软件断点异常。分支目标异常。
  • 如果FEATIESB被实现,当有效数值的的SCTLRELx .IESB位在目标异常level为1,PE插入错误同步事件
10.2 当异常退出时ARM CORE的硬件自动的行为(Exception return)

(On executing an Exception return instruction at ELx)

  • PC从ELR_ELx恢复
  • PSTATE从SPSR_ELx恢复

11 中断的标记

在gicv3中断控制器中,对中断进行了分组:Group0、Secure Group1、Non-secure Group1。当一个中断进来的时候,cpu interface会根据中断的分组类型和当前PE的security状态来决定是标记为IRQ还是FIQ

12 中断的路由

我们知道系统中有三个基地址VBAREL1、VBAREL3、VBAREL1(secure),那么到底是使用哪一个呢?由Routing when both EL3 and EL2 are implemented 表来决定,中断routing到了EL1则使用VBAREL1,routing到了EL3则使用VBAREL3,routing到了secure EL1则使用VBAREL1(secure)

为了更直观的理解,总结成了下面的一个流程图:

13 中断的MASK(屏蔽)

在PSTATE中,A/I/F比特分别可以对SError、IRQ、FIQ进行MASK

  • SError :PSTATE.A
  • IRQ :PSTATE.I
  • FIQ :PSTATE.F

但是在有些场景下,MASK将会失效,如在一些中断被强制target到EL3的配置下,中断的taken就不在关心PSTATE的mask位了。

以下表格做出了详细的说明:

其中:

  • A 表示 中断的taken 将忽略 PSTATE的MASK位
  • B 表示 中断的taken 不会忽略 PSTATE的MASK位,如果MASK了,就不会taken了。
  • C 表示 中断不会被
  • A/B是 描述serror且和 FEAT_DoubleFault相关的,暂不介绍

14 中断路由(信号流)的总结

当peripheral产生一个中断后,PE是如何跳转到某个系统中的向量表的?如下框图展示了这一切:当一个中断到来后,中断信号交给gic,gic会进行中断的识别、优先级、affinity路由等,然后通过AXI stream将信号交给core(cpu internface),cpu interface负责标记中断是irq还是fiq,这就是中断断言了(assert了),然后就是中断的路由规则,target到相应的EL级别,然后再检查Mask标记位,然后该中断就被taken了(即PE acknowledge了),接下来PE还会根据EL是否发生改变、SPELx使用的哪一个等信息来决定是跳转到哪一组向量表 最后PE跳转到相应的VBARELx + xxx offset了。

本文由哈喽比特于2年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/NvK-xwAKOJmDL_N91jzCfg

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237227次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8063次阅读
 目录