用户态中断请求的处理方法及装置与流程

文档序号:32929278发布日期:2023-01-14 05:48阅读:72来源:国知局
用户态中断请求的处理方法及装置与流程

1.本技术涉及通信技术领域,并具体涉及一种用户态中断请求的处理方法及装置。


背景技术:

2.中央处理器(central process unit,cpu)存在两种运行状态级别内核态和用户态,程序可以运行在这两种运行级别中,其中,内核态的执行级别高于用户态。目前大量第三方驱动代码质量良莠不齐,当驱动代码运行在内核态时,如果第三方驱动代码出现错误,会影响内核代码运行的安全性。为了提升系统的安全性,将第三方驱动置于用户态成了未来的发展趋势,也就是将第三方驱动与内核态隔离。现代微内核已经选用了用户态驱动的架构,例如,fuchsia操作系统、sel4操作系统均采用类似的设计。
3.驱动的运行离不开中断处理,用户态驱动需要用户态中断,因此用户态中断请求的处理时延会对用户态驱动产生很大的影响,并将直接影响产品的竞争力。例如,外围设备的输入输出、触屏、网络的收包发包等性能的保证都依赖于中断处理的低时延。因此,如何降低用户态中断处理的时延是亟待解决的问题。


技术实现要素:

4.本技术提供一种用户态中断请求的处理方法及装置,能够有效降低用户态中断处理时延,从而保证了用户态驱动性能。
5.第一方面,提供了一种用户态中断请求的处理方法,以中央处理器cpu为例,包括:中央处理器cpu在内核态对第一中断异常处理程序的内核地址进行脱敏处理,以获得第二中断异常处理程序;cpu在内核态获取用户态中断请求,并执行第二中断异常处理程序,以确定对应于用户态中断请求的用户态中断处理程序;cpu在内核态通过第一特权级切换,切换至用户态,其中,第一特权级切换为无上下文恢复的切换;cpu在用户态执行用户态中断处理程序;cpu在用户态通过第二特权级切换,切换至内核态,其中,第二特权级切换为无上下文存储的切换。
6.在本技术的技术方案中,无上下文恢复和存储的特权级切换可以大大减少用户态中断处理的时延,无内核地址等敏感信息的第二中断异常处理程序,在减少用户态中断处理时延的同时,保证了系统内核的安全性。
7.结合第一方面,在第一方面的某些实现方式中,cpu在内核态对第一中断异常处理程序的内核地址进行脱敏处理包括:覆盖或删除第一中断异常处理程序中的内核地址和内核地址中的信息。
8.结合第一方面,在第一方面的某些实现方式中,执行第二中断异常处理程序,以确定对应于用户态中断请求的用户态中断处理程序包括:唤醒用户态中断请求对应的用户态中断处理线程,其中,用户态中断处理线程包括用户态中断处理程序;或者获得用户态中断请求对应的用户态中断处理程序的地址。
9.结合第一方面,在第一方面的某些实现方式中,获得用户态中断请求对应的用户
态中断处理程序的地址包括:获得用户态中断请求对应的中断号;获得中断号对应的用户态中断处理程序的地址。
10.在本技术的技术方案中,对于单线程或者单进程的应用场景,可以直接获得中断号对应的用户态中断处理程序的地址,进一步缩短了cpu在内核态运行第二中断异常处理程序的时间,可以更大地提升用户态中断处理程序的响应速度,从而减少用户态中断处理的时延。
11.结合第一方面,在第一方面的某些实现方式中,获得用户态中断请求对应的中断号包括:cpu在内核态读取中断控制器的寄存器,以获得用户态中断请求对应的中断号,中断控制器获得应答消息,应答消息用于指示中断控制器屏蔽和用户态中断请求的优先级相同的中断请求,或者屏蔽低于用户态中断请求的优先级的中断请求。
12.结合第一方面,在第一方面的某些实现方式中,该方法还包括:cpu在内核态给中断控制器设置中断优先级组,中断优先级组包括第一中断优先级组和第二中断优先级组,其中,第一中断优先级组包括内核态中断请求,第二中断优先级组包括和用户态中断请求的优先级相同的中断请求,或者低于用户态中断请求的优先级的中断请求,第一中断优先级组的优先级高于第二中断优先级组;cpu在内核态给中断控制器设置抢占操作,抢占操作包括第一中断优先级组抢占第二中断优先级组。
13.在本技术的技术方案中,cpu在启动后的初始化过程中通过为中断控制器设置优先级组,使得用户态中断请求处理过程中不再需要禁用中断和重新使能中断的操作,可以大大减少cpu开始在用户态执行用户态中断处理线程之前的时延,进而使得用户态中断处理线程得到快速响应。
14.除此以外,cpu在启动后的初始化过程中通过为中断控制器设置抢占操作,内核态irq可以打断正在进行的用户态irq,优先得到服务和响应,内核态irq不需要等到用户态中断处理程序结束后,才可以被服务和响应,从而保证了内核态中断请求不会被用户态中断影响。
15.结合第一方面,在第一方面的某些实现方式中,cpu在用户态通过第二特权级切换,切换至内核态之后,cpu在内核态将结束中断eoi写入中断控制器的寄存器,中断控制器收到eoi,eoi用于指示中断控制器解除屏蔽和用户态中断请求的优先级相同的中断请求,或者屏蔽低于用户态中断请求的优先级的中断请求。
16.结合第一方面,在第一方面的某些实现方式中,该方法还包括:cpu在用户态执行用户态中断处理程序时,cpu在内核态并发检测用户态中断处理程序的结果状态。
17.结合第一方面,在第一方面的某些实现方式中,如果用户态中断处理程序的结果状态指示未结束,cpu在内核态中禁用用户态中断请求,并将结束中断eoi写入中断控制器的寄存器。
18.在本技术的技术方案中,cpu在用户态运行用户态中断处理程序时,通过并发检测用户态中断处理程序的状态结果,可以有效防止用户态中断处理程序处理过程中出现异常时,cpu卡死在用户态中执行用户态中断处理程序,进而保证cpu的正常运行。
19.第二方面,提供了一种用户态中断请求的处理装置,处理装置包括初始化模块、中断异常处理模块、特权级切换模块和用户态中断处理模块;初始化模块在内核态用于对第一中断异常处理程序的内核地址进行脱敏处理,以获得第二中断异常处理程序;中断异常
处理模块在内核态用于获取用户态中断请求,并执行第二中断异常处理程序,以确定对应于用户态中断请求的用户态中断处理程序;特权级切换模块在内核态用于通过第一特权级切换,切换至用户态;用户态中断处理模块在用户态用于执行用户态中断处理程序,其中,第一特权级切换为无上下文恢复的切换;特权级切换模块在用户态用于通过第二特权级切换,切换至内核态,其中,第二特权级切换为无上下文存储的切换。
20.在本技术的技术方案中,无上下文恢复和存储的特权级切换可以大大减少用户态中断处理的时延,无内核地址等敏感信息的第二中断异常处理程序,在减少用户态中断处理时延的同时,保证了系统内核的安全性。
21.结合第二方面,在第二方面的某些实现方式中,初始化模块在内核态用于对第一中断异常处理程序的内核地址进行脱敏处理包括:覆盖或删除中断异常处理程序中的内核地址和内核地址中的信息。
22.结合第二方面,在第二方面的某些实现方式中,执行第二中断异常处理程序,以确定对应于用户态中断请求的用户态中断处理程序包括:中断异常处理模块用于唤醒用户态中断请求对应的用户态中断处理线程,其中,用户态中断处理线程包括用户态中断处理程序;或者中断异常处理模块用于获得用户态中断请求对应的用户态中断处理程序的地址。
23.结合第二方面,在第二方面的某些实现方式中,中断异常处理模块用于获得用户态中断请求对应的用户态中断处理程序的地址包括:中断异常处理模块用于获得用户态中断请求对应的中断号;中断异常处理模块用于获得中断号对应的用户态中断处理程序的地址。
24.在本技术的技术方案中,对于单线程或者单进程的应用场景,可以直接获得中断号对应的用户态中断处理程序的地址,进一步缩短了cpu在内核态运行第二中断异常处理程序的时间,可以更大地提升用户态中断处理程序的响应速度,从而减少用户态中断处理的时延。
25.结合第二方面,在第二方面的某些实现方式中,中断异常处理模块用于获得用户态中断请求对应的中断号包括:中断异常处理模块用于在内核态读取中断控制器的寄存器,以获得用户态中断请求对应的中断号,中断控制器获得应答消息,应答消息用于指示中断控制器屏蔽和用户态中断请求的优先级相同的中断请求,或者屏蔽低于用户态中断请求的优先级的中断请求。
26.结合第二方面,在第二方面的某些实现方式中,初始化模块在内核态还用于:给中断控制器设置中断优先级组,中断优先级组包括第一中断优先级组和第二中断优先级组,其中,第一中断优先级组包括内核态中断请求,第二中断优先级组包括和用户态中断请求的优先级相同的中断请求,或者低于用户态中断请求的优先级的中断请求,第一中断优先级组的优先级高于第二中断优先级组;给中断控制器设置抢占操作,抢占操作包括第一中断优先级组抢占第二中断优先级组。
27.在本技术的技术方案中,cpu在启动后的初始化过程中通过为中断控制器设置优先级组,使得用户态中断请求处理过程中不再需要禁用中断和重新使能中断的操作,可以大大减少cpu开始在用户态执行用户态中断处理线程之前的时延,进而使得用户态中断处理线程得到快速响应。
28.除此以外,cpu在启动后的初始化过程中通过为中断控制器设置抢占操作,内核态
irq可以打断正在进行的用户态irq,优先得到服务和响应,内核态irq不需要等到用户态中断处理程序结束后,才可以被服务和响应,从而保证了内核态中断请求不会被用户态中断影响。
29.结合第二方面,在第二方面的某些实现方式中,装置还包括用户态中断处理结束模块:特权级切换模块在用户态通过第二特权级切换,切换至内核态之后,用户态中断处理结束模块在内核态用于将结束中断eoi写入中断控制器的寄存器,中断控制器收到eoi,eoi用于指示中断控制器解除屏蔽和用户态中断请求的优先级相同的中断请求,或者屏蔽低于用户态中断请求的优先级的中断请求。
30.结合第二方面,在第二方面的某些实现方式中,装置还包括用户态中断处理结果检测模块:用户态中断处理模块在用户态执行用户态中断处理程序时,用户态中断处理结果检测模块在内核态用于并发检测用户态中断处理程序的结果状态。
31.结合第二方面,在第二方面的某些实现方式中,用户态中断处理结果检测模块还用于:如果用户态中断处理程序的结果状态指示未结束,在内核态中禁用用户态中断请求,并且用户态中断处理结束模块用于将结束中断eoi写入中断控制器的寄存器。
32.在本技术的技术方案中,cpu在用户态运行用户态中断处理程序时,通过并发检测用户态中断处理程序的状态结果,可以有效防止用户态中断处理程序处理过程中出现异常时,cpu卡死在用户态中执行用户态中断处理程序,进而保证cpu的正常运行。
33.第三方面,提供一种计算机可读存储介质,计算机可读存储介质中存储有计算机指令,当计算机指令在计算机上运行时,使得计算机执行上述第一方面中任一种可能实现方式中的方法。
34.第四方面,提供一种计算机程序产品,计算机程序产品中包括计算机程序代码,当计算机程序代码在计算机上运行时,使得计算机执行上述第一方面中任一种可能实现方式中的方法。
附图说明
35.图1是本技术实施例提供的一种用户态中断请求的处理方法的应用场景示意图;
36.图2是目前一种执行用户态中断处理程序的通用流程示意图;
37.图3是目前另一种执行用户态中断处理程序的通用流程示意图;
38.图4是目前一种基于驱动的用户态中断处理示意图;
39.图5是目前另一种基于驱动的用户态中断处理示意图;
40.图6是目前一种基于回调的用户态中断处理示意图;
41.图7是本技术实施例提供的一种用户态中断处理流程示意图;
42.图8是本技术实施例提供的另一种用户态中断处理流程示意图;
43.图9是本技术实施例提供的一种在cpu启动后的中断初始化处理流程的示意图;
44.图10是本技术实施例提供的一种内核异常向量表对照示意图;
45.图11是本技术实施例提供的一种特权级切换流程示意图;
46.图12是本技术实施例提供的又一种用户态中断处理流程示意图;
47.图13是本技术实施例提供的又一种用户态中断处理流程示意图;
48.图14是本技术实施例提供的一种用户态中断请求的处理装置1400的示意图。
具体实施方式
49.下面将结合附图,对本技术中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
50.下面对本发明实施例涉及的几个基本概念进行简要地介绍。
51.中断请求(interrupt request,irq):中断请求是中断控制器发送给中央处理器(central process unit,cpu)的一种事件,当cpu收到irq时,cpu需要存储当前正在进行的程序,暂停该程序,转而执行该irq对应的程序。irq可能是硬件触发,也可能是软件触发硬件产生的,在本技术中中断请求可以简称为中断。
52.中断控制器:中断控制器设置在硬件和cpu之间,主要用于收集各个硬件产生的irq,并将这些irq发送给cpu。本技术中断控制器为一个总称,在不同的系统中有各自不同的名称以及不同的功能部件。例如,对于arm架构而言,该中断控制器的名称为通用中断控制器(generic interrupt controller,gic),gic中包括中断应答寄存器(interrupt acknowledge register,iar),gic和cpu之间存在一定的耦合,cpu在内核态可以读取gic中的iar。对于x86架构而言,该中断控制器的名称为高级可编程中断控制器(advanced programmable interrupt controller,(a)pic),(a)pic中包括中断服务寄存器(in-service register,isr)和中断标记寄存器(interrupt mask register,imr),(a)pic和cpu之间也存在一定的耦合,cpu在内核态可以读写(a)pic中的isr和imr。
53.当中断控制器收到来自硬件的irq时,形成中断触发,其中,中断触发有两种形式一种是电平触发,另一种是边缘触发。对于电平触发,gic/(a)pic识别到中断信号线的电平为低电平或者高电平后将irq发送给cpu,cpu将立即停止当前任务并跳转执行中断异常处理程序。对于边缘触发,gic/(a)pic识别到中断信号线的电平发生脉冲变化之后通知cpu,也就是gic/(a)pic识别到中断信号线的电平从高电平变成低电平,或者从低电平变成高电平之后,通知cpu,cpu将立即停止当前任务并跳转执行中断异常处理程序。
54.线程(thread):线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以包含多个线程,每条线程并行执行不同的任务。
55.进程(process):进程是计算机中正在运行的程序,是计算机管理运行程序的一种方式。程序本身只是指令和数据及其组织形式的描述,进程是程序的真正运行示例。在面向进程设计的系统中,进程是程序的基本执行实体;在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。
56.cpu在执行进程时,进程有五种基本的状态,分别如下。进程处于新建状态,也就是cpu注册了一个新的进程;进程处于就绪状态,也就是一个进程已经具备运行条件,等待系统分配cpu以便运行的状态;进程处于运行状态,即进程已经获得cpu,并且cpu正在运行该进程;进程处于等待状态,也叫阻塞状态或者睡眠状态,也就是一个进程不具备运行条件暂停运行,正在等待某一事件的发生的状态,例如进程等待使用资源,进程等待外设传输;进程处于终止状态,也就是一个进程完成任务正常结束,或者出现无法克服的错误而异常终止,或被操作系统及有终止权的进程终止时所处的状态。线程也有这五种基本状态,为简要
说明,在此不作赘述。
57.上下文(context):上下文是进程/线程运行这一动态过程中某一运行时刻的静态描述。进程/线程运行是时动态过程,如果被暂停,则上下文是与这一时刻的进程/线程相关的cpu状态,一般进程/线程相关的cpu状态包括通用寄存器的值、状态寄存器的值等。上下文被恢复时,cpu可以从被暂停的地方继续执行,进程/线程也可以继续运行。
58.上下文切换(context switch):用户态程序运行过程中,如果发生了系统调用、异常或者中断等,则需要内核态来进行处理,此时系统会下陷至内核态,内核态会保存用户态当前的上下文并恢复内核态原有的上下文,这个过程就是上下文切换的一种情况。
59.程序计数器(program counter,pc):用于存储当前cpu执行的指令地址寄存器,程序计数器所指地址的指令为cpu要执行的指令,通过修改程序计数器所指的指令,可以改变cpu的执行流,程序计数器也被称为指令指针(instruction pointer,ip)寄存器。
60.栈指针寄存器(stack pointer,sp):执行函数时,需要使用栈传递参数与存储函数的临时变量,栈指针寄存器存储当前的栈顶,通过栈指针寄存器可以读取栈内部的数据。
61.本技术实施例的方法可以应用在多种处理器架构中,例如可以应用于arm架构或者x86架构,也可以应用于其它已存在或将来可能出现的处理器架构中。下面结合图1简要说明本技术实施例中的用户态中断请求的处理方法的应用场景,图1是本技术实施例提供的一种用户态中断请求的处理方法的应用场景。
62.硬件中的中断控制器101向cpu发送中断请求,cpu在内核态中的内核态软件102接收该中断请求,并在内核态中执行中断异常处理程序,如果通过运行中断异常处理程序判断得知该中断请求为用户态中断请求,随后cpu在用户态的用户态驱动或者应用程序103获得用户态中断请求对应的中断信息,并根据中断信息运行用户态中断处理程序。
63.应理解,中断控制器可以是arm架构下的gic或者是x86架构下的apic,在本技术实施例中对中断控制器的类型不作限制。为了简要说明,以下中断控制器以arm架构中的gic为例。
64.下面将结合图2说明目前cpu在用户态执行用户态中断处理程序的通用流程,图2是目前一种执行用户态中断处理程序的通用流程示意图。
65.cpu在用户态执行用户态中断处理程序的通用流程是建立在cpu收到的irq是用户态irq的前提下执行的,因此,此处对图2进行阐述时,cpu收到的irq为用户态irq。
66.目前cpu在用户态执行用户态中断处理程序的通用流程可以分为两部分,一部分为cpu收到中断请求之后,中断控制器和cpu之间的交互,另一部分为cpu收到用户态中断请求之后,cpu要在用户态执行用户态中断请求对应的用户态中断处理程序时,cpu分别在内核态和用户态执行的步骤。
67.首先,cpu收到中断请求之后,中断控制器和cpu之间的交互具体为如下步骤s201至s208。
68.s201,gic收到中断请求irq。
69.gic可以收到不同的中断请求,此时可以使用irq
x
代表不同的中断请求,其中,中断请求可以为软件中断或者硬件中断。
70.s202,gic将irq发送给cpu中的内核态软件102。
71.s203,cpu收到irq之后会产生中断异常,如果cpu在用户态执行用户态进程a,cpu
下陷至内核态中执行第一中断异常处理程序。cpu下陷至内核态时,需要存储用户态进程a的上下文。cpu在内核态中执行第一中断异常处理程序时,cpu在内核态从gic中的iar读取irq对应的中断号,以获取irq对应的中断号。当中断控制器为x86架构下的(a)pic时,cpu在内核态从(a)pic中的isr读取irq对应的中断号。
72.s204,gic收到irq对应的应答。
73.当cpu在内核态从gic中的iar读取irq对应的中断号的同时,gic收到irq对应的应答。也就是cpu在内核态从gic中的iar读取irq对应的中断号时,这个步骤s204对于cpu而言,cpu获得了irq对应的中断号,而这个步骤s204对于gic而言,gic收到了irq对应的应答。
74.s205,gic收到irq对应的应答之后,屏蔽所有irq。所有irq包括当前cpu正在处理的irq在内的中断请求,例如,软件中断中的时钟中断、硬件中断中的i/o中断。gic在收到应答之后会拉高gic中的cpu接口(cpu interface)的优先级自动屏蔽所有irq,也就是gic会屏蔽包括正在响应的irq在内的所有irq。
75.当中断控制器为x86架构下的(a)pic时,(a)pic不会收到irq对应的应答,(a)pic实现屏蔽所有irq为,cpu在内核态将irq对应的中断号写入(a)pic的imr中,触发(a)pic屏蔽所有irq。
76.s206,在s203获取irq对应的中断号之后,cpu在内核态将结束中断(end of interrupt,eoi)写入中断控制器中,即cpu将eoi写入gic的寄存器中。
77.目前,cpu在内核态将eoi写入gic的寄存器,意味着cpu在内核态执行完第一中断异常处理程序。
78.s207,gic收到eoi。当cpu在内核态将eoi写入gic的寄存器中的同时,gic收到eoi。也就是cpu在内核态将eoi写入gic的寄存器时,这个步骤s206对于gic而言,gic收到了eoi。
79.s208,gic在收到eoi之后会解除屏蔽并等待所有irq。具体地,gic在收到eoi之后会拉低gic中的cpu接口的优先级,从而解除屏蔽并等待所有irq。
80.当中断控制器为x86架构下的(a)pic时,cpu修改(a)pic的imr中的位图,来解除对所有irq的屏蔽。
81.s204的应答ack操作和s206的结束中断eoi操作必须在内核态中进行,用户态没有读写s204和s206这两个步骤涉及的寄存器的权限。
82.以上步骤s201至s208实现了cpu收到中断请求之后,中断控制器和cpu之间的交互。这个交互仅仅是cpu获取了用户态irq对应的中断号,cpu需要在用户态运行用户态中断处理程序,s201至s208并未执行完用户态中断处理程序。所以,为了实现cpu在用户态执行用户态中断处理程序,接下来cpu需要从内核态切换至用户态,具体步骤如下s209-s214。
83.s209,cpu在s203获取irq对应的中断号之后,cpu在内核态禁用该irq,防止cpu在用户态执行该irq对应的用户态中断处理程序时,gic再次发送该irq给cpu,产生嵌套问题。
84.目前,对s209和s206的先后顺序不作限制。s209可以在s206之前,防止gic对所有屏蔽解除之后,cpu未及时禁用该irq,gic继续将该irq发送给cpu而产生的嵌套。s209也可以在s206之后,此时,通过关闭cpu上的本地irq来防止gic对所有屏蔽解除之后,cpu未及时禁用该irq,gic继续将该irq发送给cpu而产生的嵌套。
85.s210,cpu在内核态中根据s203获取的irq对应的中断号,唤醒irq对应的用户态中断处理线程。cpu将用户态中断处理线程加入被调度队列,使得用户态中断线程从新建状态
或者阻塞状态进入就绪状态。其中,irq对应的中断号也会在内核态中被写入寄存器,比如r0寄存器,还可以是其他寄存器。此处唤醒的对象也可以是irq对应的用户态中断处理进程。
86.s211,cpu通过上下文切换,从内核态切换至用户态。例如,cpu在内核态调度用户态中断处理线程,使得用户态中断处理线程从就绪状态进入运行状态,并且在内核态恢复用户态中断处理线程的上下文,以使得cpu从内核态切换至用户态,其中该切换过程中需要恢复用户态中断处理线程的上下文,因此也可以称为“有上下文恢复的切换”。
87.s212,cpu在用户态执行用户态中断处理线程中对应的用户态中断处理程序。
88.当用户态中断处理线程可以对应多个irq的中断号,也就是不同的irq对应的中断号可以唤醒同一个用户态中断处理线程时,同一个用户态中断处理线程中包括不同中断号对应的用户态中断处理程序。此时,cpu不能直接根据唤醒的用户态中断处理线程找到待执行的用户态中断处理程序。因此,在这种情况下,cpu在用户态需要读取r0寄存器中irq对应的中断号,根据该中断号找到对应的用户态中断处理程序,随后执行该用户态中断处理程序。其中,cpu还可以通过读取其他通用寄存器获得irq对应的中断号。
89.当用户态中断处理线程和irq对应的中断号是一一绑定的关系,也就是根据irq对应的中断号唤醒的用户态中断处理线程中,仅有该中断号对应的用户态中断处理程序,此时cpu直接执行唤醒的用户态中断处理线程中的用户态中断处理程序。
90.s213,cpu在用户态执行完该irq对应的用户态中断处理程序之后,cpu再次通过上下文切换,从用户态切换至内核态。例如,cpu存储该程序对应的用户态中断处理线程的上下文,使得用户态中断处理线程从运行态进入终止状态或者阻塞状态,以使得cpu从用户态切换至内核态,其中,该切换过程中需存储用户态中断处理线程的上下文,因此也可以称为“有上下文存储的切换”。
91.s214,cpu在内核态重新使能该irq,也就是cpu可以再次接收该irq。
92.以上为目前用户态中断处理的通用流程,必须经过s201至s214这一系列步骤,才能完成完整的用户态中断处理。
93.需要说明的是,目前用户态中断请求的通用处理流程在用户态中断处理程序还未执行前就结束中断的原因是,s205中屏蔽了所有irq,包括时钟中断和i/o中断等,如果cpu在用户态执行完用户态中断处理程序之后,从用户态切回内核态,再结束中断,一旦cpu在用户态执行用户态中断处理程序时出现异常,则cpu无法从用户态切回内核态,无法结束中断,从而cpu将无法响应所有irq。此时,cpu卡死在用户态中断处理程序中,这将影响cpu的正常运行。所以,cpu在用户态中断处理程序还未执行前,就进行s206和s207。虽然,这可以在一定程度上避免由于用户态中断处理程序的异常,而影响cpu的正常运行,但是该系统对用户态中断处理的响应速度还有待提升
94.另外,由于中断控制器只能屏蔽所有irq(s205)或者解除所有irq的屏蔽(s208),而cpu只希望屏蔽已经响应的irq,防止cpu在用户态执行该irq对应的用户态中断处理程序时,中断控制器再次发送该irq给cpu。因此cpu需要在内核态中禁用已经响应的irq(s209)。结合s206、s207和s209使得cpu在执行该irq对应的用户态中断处理程序时,只屏蔽该irq,而不影响cpu对其他irq的响应。cpu在内核态禁用已经响应的irq(s209)和使能该irq(s214)需要大量的时间去处理,也会产生较大的开销,这对用户态中断处理程序的响应速
度影响较大。
95.除此以外,cpu为了在用户态中执行用户态中断处理程序,cpu需要进行有上下文恢复的切换(s211),这也需要一定的时间去处理,也会影响用户态中断处理程序的响应速度。具体情况将结合图3对步骤s211影响用户态中断处理程序的响应速度进行详细说明。图3是目前另一种执行用户态中断处理程序的通用流程示意图。
96.cpu在收到irq之前,也就是在时间点1之前,cpu在用户态执行用户态线程a,cpu在时间点1,接收到用户态irq,此时,cpu下陷至内核态中,也就是在时间点1到时间点2这段时间内,cpu需要存储用户态线程a的上下文,以实现从用户态切换至内核态。随后,从时间点2开始,cpu在内核态执行第一中断异常处理程序,对应于s203、s204、s206和s207,执行完第一中断异常处理程序。cpu在内核态根据s203获得的中断号唤醒用户态irq对应的用户态中断处理线程。在时间点3到时间点4这段时间内,cpu恢复了用户态中断处理线程的上下文,以实现从内核态切换至用户态,对应s211。随后,从时间点4开始,cpu在用户态执行用户态中断处理程序,对应s212。
97.从图3中可以看出,cpu在用户态执行用户态中断处理程序之前,也就是用户态中断处理程序的响应之前,需要经过一段时间的有上下文恢复的切换,来实现cpu从内核态切换至用户态,时间点3至时间点4这段时间直接影响着用户态中断处理程序的响应速度。
98.在时间点5,cpu在用户态执行完用户态中断处理程序,cpu开始存储用户态中断处理线程的上下文,以实现从用户态切换至内核态,对应s213。在时间点6,cpu在内核使能用户态irq,对应s214。除此以外,在时间点6,cpu在内核态可以通过调度其他线程来唤醒其他线程,例如可以唤醒线程a,使得线程a从阻塞状态进入就绪状态。在时间点7,cpu开始恢复线程a的上下文,以实现从内核态切换至用户态。在时间点8,cpu在用户态开始继续执行用户态进程a。
99.为了实现上述用户态中断请求的通用处理流程,存在使用linux驱动来实现用户态中断处理的方案,具体流程如图4所示,图4是一种基于传统驱动的用户态中断处理示意图。
100.此处用户态中断处理的方案是上述步骤s210、s211、s212和s213的一种具体实现的方式。具体步骤为在linux内核态插入一个驱动,该驱动和用户态之间存在接口,用户态中断处理线程可以通过该接口进行中断注册。cpu在用户态,用户态应用程序通过读取该驱动暴露给用户态的接口文件,经过read()、write()和ioctl()等接口,cpu下陷至内核态中,用户态中断处理线程在内核态中阻塞等待。当内核态驱动收到用户态中断请求后,将唤醒处于阻塞状态的用户态中断处理线程,使得用户态中断处理线程进入就绪状态。随后cpu在内核态调度用户态中断处理线程,使得用户态中断处理线程从就绪状态进入运行状态,并且在内核态恢复用户态中断处理线程的上下文,cpu从内核态切换至用户态(s211)。cpu在用户态运行用户态中断处理线程中的用户态中断处理程序(s212)。cpu在用户态执行完用户态中断处理程序之后,通过接口文件回到内核态。
101.基于驱动的用户态中断处理方案虽然可以实现用户态处理中断,但是在唤醒用户态线程时,存在大量非中断相关的逻辑处理,例如,信号处理、统计、负载均衡等。除此以外,并未对目前的用户态中断处理流程有任何改进,因此,此方案的用户态中断处理过程依旧冗长耗时,开销巨大,无法满足用户态中断对时延的高性能要求。
102.为了减少用户态中断处理过程中的内核态唤醒用户态线程存在的大量非中断相关的逻辑处理,可以对图4中基于传统驱动的用户态中断处理方案进行改进,下面结合图5对该方案进行说明。图5是另一种基于驱动的用户态中断处理示意图。
103.当用户态中断处理进程注册中断后,cpu在内核态通过将用户态irq对应的中断号和该中断号对应的用户态中断处理进程记录在进程与中断(process-interrupt request,process-irq)的映射表中。当cpu在内核态收到用户态irq之后,运行第一中断异常处理程序时,cpu在内核态中依旧需要进行应答(s204)和结束中断(s206)的处理,处理到禁用用户态irq(s209)并唤醒用户态中断处理进程(210)时,cpu在内核态中直接从process-irq的映射表中获取用户态中断处理线程的信息。这样可以绕过负载均衡和信号处理等与中断无关的逻辑处理,直接实现上下文切换,从而提升用户态中断请求的处理效率。但是,图5的方案仅仅改善了获取用户态中断处理进程的信息的过程,依旧没有改变用户态中断处理流程,即,cpu在用户态执行用户态中断处理程序之前,在内核态中依旧需要一定的处理时间,图5的方案依然无法满足用户态中断请求处理的高性能要求。
104.随着内核的发展,用户态驱动的需求越来越多,微内核将用户态驱动和用户态中断纳入系统的整体设计中,也就是在用户态中断处理中不再使用目前已有的接口文件唤醒用户态中断处理线程,而是为用户态中断处理设计了专用的通信机制。下面结合图6对该方案进行说明,图6是一种基于回调的用户态中断处理示意图。
105.如图6所示,在调度唤醒用户态和上下文切换之前,存在一个通信机制,该通信机制的作用和图5中process-irq的映射表作用类似,当用户态irq发生后,cpu在内核态禁用该用户态irq,cpu在内核态中可以通过该通信机制直接获取该用户态irq对应的中断号和用户态中断处理线程的信息,并这些信息传递给用户态,从而减少了内核态通知用户态中断处理线程的代价。例如,在zircon内核中使用port机制,在sel4内核中使用notification机制。图6的方案可以在实现用户态中断时减少一部分开销,但是图6的方案的中断处理逻辑依然遵循图1的通用处理流程,仍然无法满足用户态中断请求的处理的高性能要求。
106.虽然上述方案均可以实现用户态中断,但是上述方案的用户态中断处理流程均遵循了图1所示的用户态中断处理流程,内核态都必须经过应答irq(s204)、结束中断(s206)、禁用irq(s209)、唤醒用户态中断处理线程(s210)、上下文切换(s211、s212)、使能irq(s214)等一系列操作。这一系列cpu在内核态中的操作将直接影响用户态中断响应的速度。因此,如何降低用户态中断处理的时延是亟待解决的问题。
107.本技术实施例提供了一种用户态中断请求的处理方法,能够降低用户态中断处理的时延。下面将结合图7说明本技术实施例的方案。图7是本技术实施例提供的一种用户态中断请求处理流程示意图。
108.s701,cpu在内核态对第一中断异常处理程序的内核地址进行脱敏处理,以获得第二中断异常处理程序。
109.脱敏处理是为了脱除敏感的信息,特别是与安全性有关的信息,例如中断异常处理程序中与内核地址相关的信息,如内核地址本身和内核地址中的信息,其中,内核地址中的信息是指可以通过内核地址获得的信息。
110.例如,脱敏处理可以通过覆盖或删除等方式实现,即脱敏处理可以从第一中断异常处理程序中删除或者覆盖内核地址及其相关的信息,从而得到第二中断异常处理程序。
111.换句话说,第二中断异常处理程序为经过脱敏处理后的第一中断异常处理程序,也就是第二中断异常处理程序中不再包括内核地址及其相关的信息。
112.s702,cpu在内核态获取用户态中断请求,并执行第二中断异常处理程序,以确定对应于用户态中断请求的用户态中断处理程序。
113.第二中断异常处理程序用于cpu在内核态确定对应于用户态中断请求对应的用户态中断处理程序,进而在cpu从内核态切换至用户态之后,可以直接运行用户态中断处理程序。
114.s703,cpu在内核态通过第一特权级切换,切换至用户态,其中,第一特权级切换为无上下文恢复的切换。
115.第一特权级切换过程中,不需要恢复用户态中断处理线程的上下文,这样能够节省cpu的处理时间。具体地,如图3所示的过程中,cpu从内核态切换至用户态运行用户态中断处理程序,需要对用户态中断处理线程的上下文进行恢复,即图3中时间点3至时间点4,cpu需要一定处理时间去恢复用户态中断处理线程的上下文。而本技术的第一特权级切换不需要恢复用户态中断处理线程的上下文,从而能够节省时间点3至时间点4的处理时间。
116.s704,cpu在用户态执行用户态中断处理程序。
117.s705,cpu在用户态通过第二特权级切换,切换至内核态,其中,第二特权级切换为无上下文存储的切换。
118.同样,第二特权级切换过程中,不需要存储用户态中断处理线程的上下文,这样能够直接从用户态切换回内核态,节省了用户态中断处理线程的整体处理时间。具体地,如图3所示的过程中,cpu从用户态切换回内核态,需要对用户态中断处理线程的上下文进行存储,即图3中时间点5至时间点6,cpu需要一定处理时间去存储用户态中断处理线程的上下文。而本技术的第二特权级切换不需要存储用户态中断处理线程的上下文,从而能够节省时间点5至时间点6的处理时间。
119.本技术的技术方案,无上下文恢复和存储的特权级切换可以大大减少用户态中断处理的时延,无内核地址等敏感信息的第二中断异常处理程序,在减少用户态中断处理时延的同时,保证了系统内核的安全性。
120.下面将结合图8至图14对本技术提出的用户态中断请求的处理方法及装置做详细介绍,其中图8至图13为本技术实施例的用户态中断请求的处理方法详细说明,图14是本技术实施例的用户态中断请求的处理装置的详细说明,其中,以下具体方案阐述中的中断控制器以arm架构下的gic为例进行详细说明。
121.图8是本技术实施例提供的一种用户态中断处理流程示意图,首先本技术的用户态中断处理流程作简要整体说明。需要说明的是,图8为本技术用户态中断处理的整体流程,图8中的步骤包括图7中的步骤。
122.s801,gic收到用户态中断请求irq,应理解,gic可以收到不同的中断请求,此时可以使用irq
x
代表不同的中断请求。例如,中断请求可以为软件中断或者硬件中断,本技术实施例对此不作限制。
123.s802,gic将用户态irq发送给cpu,cpu在内核态获取用户态irq,对应于s702。
124.s803,cpu获取用户态irq对应的中断号。应理解,cpu收到用户态irq之后会产生中断异常,如果cpu在用户态执行用户态进程a,cpu下陷至内核态中执行第二中断异常处理程
序,以确定对应于用户态中断请求的用户态中断处理程序,对应于s702。示例性地,cpu可以在内核态中执行第二中断异常处理程序时,cpu在内核态从gic中的iar读取用户态irq对应的中断号,以获取用户态irq对应的中断号。再例如,当中断控制器为x86架构下的(a)pic时,cpu可以在内核态从(a)pic中的isr读取irq对应的中断号。本技术实施例对cpu获取中断号的方式不作限制。
125.应理解,在本技术方案中的第二中断异常处理程序为cpu在内核态对第一中断异常处理程序的内核地址进行脱敏处理后得到的,第二中断异常处理程序中不包含内核敏感信息,例如内核地址和内核地址中的信息。cpu在内核态对第一中断异常处理程序的内核地址进行脱敏处理的具体步骤在cpu启动后的中断初始化流程中,这将在后面结合图9详细说明。
126.s804,gic收到用户态irq对应的应答。示例性地,当cpu在内核态从gic中的iar读取用户态irq对应的中断号的同时,gic收到irq对应的应答。也就是cpu在内核态从gic中的iar读取irq对应的中断号时,这个步骤s803对于cpu而言,cpu获得了用户态irq对应的中断号,而这个步骤s803对于gic而言,gic收到了用户态irq对应的应答。本技术实施例对gic收到用户态irq对应的应答的方式不作限制。
127.s805,gic收到用户态irq对应的应答之后,屏蔽和该用户态irq的优先级相同的中断请求或者屏蔽低于该用户态irq的优先级的中断请求。
128.应理解,屏蔽和该用户态irq的优先级相同的中断请求或者屏蔽低于该用户态irq的优先级的中断请求的实现,离不开cpu启动后的中断初始化流程中的cpu给gic设置优先级组,这将在后面结合图9详细说明。
129.s806,cpu在内核态中执行第二中断异常处理程序时,唤醒s803获得的中断号对应的用户态中断处理线程或者获得s803获得的中断号对应的用户态中断处理程序的地址。
130.应理解,cpu在内核态可以根据中断号唤醒用户态中断处理线程,还是获得用户态中断处理程序的地址,这取决于cpu启动后处于用户态中的用户态驱动或者应用程序103在注册用户态中断请求时的具体步骤,cpu注册用户态中断请求的具体步骤将在后续结合图9详细说明。
131.作为一种可能的实现方式,cpu在内核态根据用户态irq对应的中断号,唤醒用户态中断处理线程,使得用户态中断处理线程从阻塞状态进入就绪状态。
132.需要说明的是,cpu在内核态唤醒用户态中断处理线程也就是将用户态中断处理线程加入被调度队列。其中,irq对应的中断号也会在内核态中被写入寄存器,比如r0寄存器,还可以是其他通用寄存器,例如r1寄存器、r2寄存器等,在此不作限制。应理解,此处也可以唤醒的也可以是irq对应的用户态中断处理进程,在本技术中主要使用用户态中断处理线程进行说明。
133.作为一种可能的实现方式,cpu在内核态根据用户态irq对应的中断号,获得用户态中断处理程序的地址。应理解,cpu可以通过该地址找到用户态中断处理程序,并运行该程序。
134.s807,cpu在内核态可以通过第一硬件切换指令,进行第一特权级切换,实现从内核态切换至用户态,其中第一特权级切换为无上下文恢复的切换,对应于s703。
135.应理解,在本技术实施例中,cpu可以通过第一特权级切换,实现从内核态切换至
用户态,而不需要恢复在s806中唤醒的用户态中断处理线程,这是因为在cpu启动后的中断初始化流程中获得了不包括内核地址的第二中断异常处理程序,使得cpu在内核态执行第二中断异常处理程序(s803和s806)时不会留下如内核地址这样的内核敏感信息,在一定程度上避免了cpu直接从内核态切换至用户态后,cpu在用户态执行用户态中断处理程序时不会因为任何内核敏感信息的泄露而产生的安全问题。第一特权级切换的具体过程后续会结合图11详细说明。
136.s808,cpu在用户态执行用户态中断处理程序,对应于s704。
137.如果在s806,cpu在内核态根据用户态irq对应的中断号,唤醒用户态中断处理线程,随后,cpu在内核态调度用户态处理线程,在s807之后,cpu从内核态切换至用户态后,执行该线程中对应的用户态中断处理程序。
138.作为一种可能的实现方式,当用户态中断处理线程中可以对应多个用户态irq的中断号时,也就是不同的用户态irq对应的中断号可以唤醒同一个用户态中断处理线程,同一个用户态中断处理线程中包括不同中断号对应的用户态中断处理程序。此时,cpu不能直接根据唤醒的用户态中断处理线程找到待执行的用户态中断处理程序。因此,在这种情况下,cpu在用户态需要读取r0寄存器中用户态irq对应的中断号,根据该中断号找到对应的用户态中断处理程序,随后执行该用户态中断处理程序。其中,cpu还可以通过读取其他通用寄存器获得irq对应的中断号,例如r1寄存器、r2寄存器等,在此不作限制。
139.作为一种可能的实现方式,当用户态中断处理线程和用户态irq对应的中断号是一一绑定的关系,也就是根据用户态irq对应的中断号唤醒的用户态中断处理线程中,仅有该中断号对应的用户态中断处理程序,此时cpu直接执行唤醒的用户态中断处理线程中的用户态中断处理程序。
140.如果在s806,cpu在内核态根据用户态irq对应的中断号,获得用户态中断处理程序的地址,经过s807之后,cpu从内核态切换至用户态之后,pc指向用户态中断处理程序的地址,cpu在用户态直接运行用户态中断处理程序。
141.s809,cpu在用户态执行用户态中断处理程序的同时,cpu在内核态并发进行用户态中断处理程序的结果状态检测。
142.应理解,为了防止cpu在用户态执行用户态中断处理程序中出现异常后,cpu卡死在用户态中执行用户态中断处理程序,影响cpu的正常运行。此时,cpu在内核态并发进行用户态中断处理程序的结果状态检测,从而使得cpu可以实时检测用户态中断处理程序的结果状态,如果用户态中断处理程序的处理结果异常,cpu有相应的操作后续将进行详细说明。
143.除此以外,cpu能够实现在内核态并发进行用户态中断处理程序的结果状态的检测,离不开cpu启动后中断初始化流程中的抢占操作,这将在后面结合图9详细说明。
144.s810,cpu在用户态可以通过第二硬件切换指令,进行第二特权级切换,实现从用户态切换至内核态,其中第二特权级切换为无上下文存储的切换,对应于s705。
145.应理解,在本技术实施例中,cpu可以通过第二特权级切换实现从用户态切换至内核态,而不需要存储用户态中断处理线程的上下文,是因为cpu内核态不需要已经完成的用户态中断处理线程的上下文。第二特权级切换的具体过程后续会结合图11详细说明。
146.s811,cpu在内核态将结束中断eoi写入gic的寄存器中。
147.s812,gic收到eoi。例如,当cpu在内核态将eoi写入gic的寄存器中的同时,gic收到eoi,也就是cpu在内核态将eoi写入gic的寄存器中时,这个步骤s811对于gic而言,gic收到了eoi。
148.s813,gic在收到eoi之后会解除在s805中屏蔽的中断请求,并等待所有中断请求。例如,gic在收到eoi之后会拉低gic中的cpu接口的优先级,从而实现对s805中屏蔽的中断请求的解除。本技术实施例对gic解除中断请求的具体实现方式不作限制。
149.需要说明的是,当用户态irq使用结束时,cpu通过内核态提供的接口释放用户态中断服务。
150.上述步骤是对本技术实施例提出的用户态中断处理方法的整体描述,下面将结合图9具体说明在cpu收到用户态irq之前,cpu需要进行中断初始化处理流程,主要包括cpu在内核态中的初始化流程s901、s902、s903、注册用户态irq时,cpu在用户态和内核态的操作以及需要gic配合的步骤。图9是本技术实施例提供的一种在cpu启动后的中断初始化处理流程的示意图。
151.s901,cpu启动后,cpu在内核态给gic设置中断优先级组,中断优先级组包括第一中断优先级组和第二中断优先级组,第一中断优先级组包括内核态中断请求,第二中断优先级组包括用户态中断请求,或者包括低于用户态中断请求的优先级的中断请求,第一中断优先级组的优先级高于第二中断优先级组。
152.应理解,中断优先级组中包括不同的优先级的中断请求,其中,内核态中断请求为被内核态注册的中断请求,并且后续在内核态中运行该中断请求对应的内核态中断处理程序。用户态中断请求为被用户态驱动或者应用程序注册的中断请求,并且后续在用户态中运行该中断请求对应的用户态中断处理程序。其中,在本技术实施例中,对于低于用户态中断请求的优先级的中断请求的具体中断请求类型不作限制。
153.作为一种可能的实现方式,cpu给gic设置中断优先级组的具体实现可以为,cpu通过配置每个中断请求在gic中对应的中断优先级寄存器(interrupt priority register,ipriorityr)的值来实现中断优先级组的设置。例如,将内核态中断请求对应的ipriorityr设置为高的值,将用户态中断请求对应的ipriorityr设置为低的值。本技术实施例对中断优先级组的具体实现方式不作限制。
154.cpu在内核态给gic设置中断优先级组用于辅助gic在收到用户态irq对应的应答之后,屏蔽属于第二优先级组的中断请求。
155.例如,在后续cpu收到irq(s801)后,cpu在内核态通过读取gic的iar获得该irq对应的中断号(s803),gic可以知道该irq是属于第一中断优先级组还是第二中断优先级组,当gic收到属于第二中断优先级组的irq对应的ack之后(s804),gic可以拉高gic中的cpu接口的优先级,从而来屏蔽属于第二中断优先级组的irq,也就是在s805中屏蔽和该用户态irq的优先级相同的中断请求或者屏蔽低于该用户态irq的优先级的中断请求。
156.通过在cpu启动后的中断初始化流程中的设置中断优先级组,可以辅助gic在收到用户态irq对应的应答消息之后,屏蔽属于第二中断优先级组的irq,从而实现防止该用户态irq正在被服务时,cpu再次收到该用户态irq而产生的嵌套问题。因此,本技术实施例中不再需要禁用中断和重新使能中断的操作,来实现上述效果,可以大大减少cpu开始在用户态执行用户态中断处理线程之前的时延,进而使得用户态中断处理线程得到快速响应。除
此以外,通过设置中断优先级组,屏蔽属于第二中断优先级组的irq,还可以使得正在被服务的用户态irq不被同优先级或者低优先级的irq影响。
157.作为一种可能实现的方式,还可以通过不可屏蔽中断(non-maskable interrupt,nmi)等技术来实现屏蔽和用户态irq优先级相同或者更低的中断请求,本技术实施例对实现屏蔽和用户态irq优先级相同或者更低的中断请求的具体方式不作限制。
158.s902,cpu在内核态给gic设置抢占操作,抢占操作包括第一中断优先级组抢占第二中断优先级组。
159.应理解,在本技术的方案中,cpu正在响应和服务属于第二中断优先级组的用户态irq时(s808),gic还未收到结束中断eoi(s811)。虽然s801中给gic设置了中断优先级组,gic可以向cpu发送属于第一中断优先级组的内核态irq,但是此时,cpu无法响应和服务该内核态irq,也就是cpu无法从用户态下陷至内核态,在内核态中无法读取gic的iar中内核态irq对应的中断号。内核态irq无法得到响应和服务而造成的一系列问题。例如,时钟中断请求和调度核间中断(inter-processor interrupts,ipi)等内核态irq无法的到响应和服务而产生的无法调度和计时的问题。
160.因此,在cpu启动后的中断初始化流程中,cpu需要在内核态给gic设置抢占操作。第一中断优先级组抢占第二中断优先级组表示,在gic还未收到结束中断eoi时,gic给cpu发送属于第一中断优先级组的内核态irq后,cpu可以下陷至内核态,读取gic的iar中内核态irq对应的中断号,内核态irq得到服务和响应。此时,cpu可以打断正在进行的用户态irq,优先得到服务和响应。也就是,内核态irq不需要等到用户态中断处理程序结束后,才可以被服务和响应,从而保证了内核态中断请求不会被用户态中断影响,保证系统运行的稳定性。
161.在s809中就需要使用该抢占操作,才能实现cpu在内核态并发进行用户态中断处理程序的结果状态检测,具体实现步骤将在后续对s809的详细说明中给出。
162.需要说明的是,cpu给gic设置抢占操作可以通过以下任意一种方式实现。
163.作为一种可能实现的方式,cpu在内核态通过结合软件驱动,给gic设置抢占操作。例如,除gic,具有发送中断能力的控制器可以通过并联、级联的方式与gic相连,这些具有发送中断能力的控制器自身具有给gic设置中断优先级组和设置抢占操作的能力。因此,cpu在内核态,通过软件驱动这类具有发送中断能力的控制器给gic设置优先级组或者设置抢占操作。其中,这类具有发送中断能力的控制器可以为扩展中断和事件控制器(extended interrupt and event controller,exti),应理解,具有发送中断能力的控制器还可以为除exti之外的其他控制器,本技术实施例对此不作限制。
164.作为一种可能实现的方式,cpu在内核态直接给gic设置抢占操作,具体的,cpu可以通过配置二进制点寄存器(binary point register,bpr)和ipriorityr实现给gic设置抢占操作。例如,bpr可以决定每个中断请求对应的ipriorityr的值的高n位被用于抢占,bpr可以配置最高位用于抢占。随后,在中断请求进行注册时,内核态中断请求对应的ipriorityr的最高位可以被设置为0,内核态中断请求对应的ipriorityr的最高位可以被设置为1。根据brp的配置,priorityr的最高位为0的内核态中断请求可以抢占priorityr的最高位为1的用户态中断请求,这就实现了gic的抢占操作。本技术实施例对gic设置抢占操作的具体方式不作限制。
165.通过cpu在内核态给gic设置抢占操作,内核态irq可以打断正在进行的用户态irq,优先得到服务和响应,内核态irq不需要等到用户态中断处理程序结束后,才可以被服务和响应,从而保证了内核态中断请求不会被用户态中断影响。当用户态中断处理程序出现异常时,内核态irq依旧可以得到cpu的服务和响应,进一步保证了cpu的正常运行。
166.s903,cpu在内核态对第一中断异常处理程序的内核地址进行脱敏处理,以获得第二中断异常处理程序,对应于s701。
167.应理解,第二中断异常处理程序中不包括内核地址以及通过内核地址可以获得的信息。
168.需要说明的是,在本技术的方案中,在s806后,也就是cpu在内核态根据用户态irq对应的中断号,唤醒用户态中断处理线程之后,cpu直接进行s807,cpu不需要恢复用户态中断处理线程的上下文,直接通过第一硬件切换指令,从内核态切换至用户态。cpu可以实现无用户态中断处理线程恢复的上下文切换的原因是,cpu在启动后的中断初始化流程中经过了s903,也就是cpu在内核态运行完第二中断异常处理程序之后,该程序所在的cpu寄存器中无内核地址以及通过内核地址可以获得的信息。cpu直接从内核态切换至用户态,s903可以保证cpu在用户态运行用户态中断处理程序时不会由于内核地址的泄露而产生的安全问题。
169.需要说明的是,cpu在内核态对第一中断异常处理程序的内核地址进行脱敏处理可以通过以下任意一种方式实现。
170.作为一种可能的实现方式,将第一中断异常处理程序中的内核地址和通过内核地址可以获得的信息进行覆盖,例如,通过修改编译器或者手写汇编等方式,来获得第二中断异常处理程序。在s803和s806中,cpu在内核态运行完第二中断异常处理程序后,该程序所在的cpu寄存器中不包括内核地址以及通过内核地址可以获得的信息。本技术实施例对覆盖第一中断异常处理程序中的内核地址和通过内核地址可以获得的信息的方式不作限制。
171.作为一种可能的实现方式,将第一中断异常处理程序中的内核地址和通过内核地址可以获得的信息删除,例如,通过复用寄存器或者清零等方式,来获得第二中断异常处理程序。在s803和s806中,cpu在内核态运行完第二中断异常处理程序后,该程序所在的cpu寄存器中不包括内核地址以及通过内核地址可以获得的信息。本技术实施例对删除第一中断异常处理程序中的内核地址和通过内核地址可以获得的信息的方式不作限制。
172.通过对第一中断异常处理程序的内核地址进行脱敏处理可以保证cpu的寄存器中不存在影响内核安全性的信息,进一步保证了无上下文恢复的第一特权级切换后,cpu在用户态执行用户态中断处理程序时,cpu内核的安全性,从而大大减少了响应用户态中断处理程序的时延。
173.应理解,s901至s903均为cpu启动后,在内核态进行的初始化操作,也就是s901至s903为后续响应和处理用户态中断请求的预操作。其中,s901和s903之间没有先后顺序,可以先执行s901,再执行s903,还可以先执行s903,再执行s901,本技术实施例对此不作限制。
174.s904,cpu启动后,cpu在用户态时,用户态驱动或者应用程序103创建用户态irq对应的用户态中断处理线程,或者创建用户态irq对应的用户态中断处理程序的地址。
175.需要说明的是,如果用户态仅有一个线程或者进程,则用户态驱动或者应用程序103可以创建用户态irq对应的用户态中断处理程序的地址。
176.s905,cpu通过内核接口,在内核中记录用户态irq的中断号和用户态中断处理线程之间的对应关系,或者在内核中将用户态irq的中断号对应的用户态中断处理程序的地址记录在内核中。
177.s906,在gic中通过中断使能寄存器(interrupt set-enable register,isenabler)使能该用户态irq。
178.另外,s904、s905和s906这三个步骤分别是,为了实现用户态irq的注册,cpu在用户态、内核态以及gic需要执行的步骤。这个过程也就是用户态驱动或者应用程序103注册用户态irq,将用户态irq的相关信息传递给cpu的内核以及gic的过程,这是为了在cpu收到用户态irq(s802)之后,进一步执行后续步骤。
179.下面将结合图10至图12,对图8中的一些步骤做详细说明。
180.首先,对s803进行详细说明,cpu收到用户态irq之后会产生中断异常,如果cpu在用户态执行用户态进程a,cpu下陷至内核态中执行第二中断异常处理程序。
181.作为一种可能的实现方式,cpu收到用户态irq之后会根据内核异常向量表中相应的地址,跳转运行第二中断异常处理程序,如图10所示。图10是本技术实施例提供的一种内核异常向量表对照示意图。
182.需要说明的是,cpu发生内核异常除了cpu收到中断请求irq或者快速中断请求fiq以外,还可能出现同步异常、系统错误等异常情况。当这些异常发生时,cpu可以根据内核异常向量表获得不同异常情况对应的处理地址,随后cpu通过获得的处理地址,跳转处理对应的异常情况,在本技术实施例中,主要针对的是用户态irq,相应地cpu跳转运行第二中断异常处理程序。
183.其次,对s807和s810进行详细说明,s807,cpu在内核态通过第一硬件切换指令,进行第一特权级切换,实现从内核态切换至用户态,其中第一特权级切换为无上下文恢复的切换。
184.作为一种可能的实现方式,第一硬件切换指令可以为eret/sysret。
185.s810,cpu在用户态可以通过第二硬件切换指令,进行第二特权级切换,实现从用户态切换至内核态,其中第二特权级切换为无上下文存储的切换。
186.作为一种可能的实现方式,第二硬件切换指令可以为svc/syscall。
187.下面将结合图11对s807和s810的切换流程作具体说明,图11是本技术实施例提供的一种特权级切换流程示意图。
188.在进行第一特权级切换以前,pc指向内核态的地址,也就是pc指向s705第二中断异常处理程序的最后一句,sp指向当前的内核栈,根据第一硬件切换指令eret/sysret,将sp指向用户栈,pc指向用户态地址,完成第一特权级切换,使得控制流跳转至用户态调用用户态中断处理线程,使得用户态中断处理线程从就绪状态进入运行状态,使得cpu执行该线程中对应的用户态中断处理程序(s808)。
189.cpu在用户态运行完用户态中断处理程序之后,pc指向用户态地址,sp指向用户栈,根据第二硬件切换指令svc/syscall,将sp指向内核栈,pc指向内核态地址,完成第二特权级切换使得控制流回到内核态,结束该用户态irq(s811)。
190.最后,对s809做详细说明,s809,cpu在用户态执行用户态中断处理程序的同时,cpu在内核态并发进行用户态中断处理程序的结果状态检测。
191.由于cpu启动后,cpu在内核态给gic设置了抢占操作(s902)。虽然此时cpu在用户态执行用户态中断处理程序,但是属于第一中断优先级组的内核态irq可以打断该用户态irq对应的用户态中断处理程序的执行。因此,此时cpu收到内核态irq时,原本处于用户态的cpu会下陷至内核态,响应和服务该内核态irq。这个过程也就是cpu在内核态并发检测用户态中断处理程序的结果状态,需要说明的是,在本技术中的并发检测不是时域上的同时进行,而是需要通过内核态中断请求来抢占正在运行的用户态中断处理程序,以此来实现cpu在内核态并发检测用户态中断处理程序的结果状态。
192.作为一种可能的实现方式,在本技术实施例中,cpu可以使用属于内核态irq的时钟中断请求,来实现cpu在内核态并发进行用户态中断处理程序的结果状态检测。
193.示例性的,cpu在用户态执行某个用户态irq对应的用户态中断处理程序时,cpu会周期性地收到时钟中断请求。此时,cpu会周期性地下陷至内核态检测cpu是否已经将eoi写入gic的寄存器中,也就是cpu会检测是否已经执行了s811和s812。其中,周期性的时钟中断请求可以是n个时钟周期,其中,n为正整数。
194.如果cpu下陷至内核态检测gic的iar中没有针对该用户态irq的eoi,则用户态中断处理程序的结果状态指示未结束,cpu在内核态禁用该用户态irq,并将eoi写入中断控制器的寄存器。
195.随后,cpu按照目前的用户态中断处理流程(图2)接收其他新的用户态irq,当被cpu禁用的用户态irq经过长时间后恢复,可以通过重新使能该用户态irq。其中,该用户态irq经过长时间恢复有两种恢复方式。第一种,该用户态irq对应的用户态中断处理程序执行时间较长,执行完成之后,将通过特权级切换切回内核态,cpu在内核态重新使能该用户态irq。第二种,cpu在用户态的用户态驱动或者应用程序自行发现该用户态irq对应的用户态中断处理程序异常后,重新初始化该用户态irq,重新使能该用户态irq。
196.作为一种可能实现的方式,在本技术实施例中,cpu可以通过性能检测计数器(performance monitor counter,pmc)或者通过看门狗(watchdog)咬狗触发等方法,来实现cpu在内核态并发进行用户态中断处理程序的结果状态检测。
197.示例性的,cpu在用户态执行某个用户态irq对应的用户态中断处理程序时,通过pmc检测用户态是否在m条指令内完成用户态中断处理程序,其中m为正整数。
198.如果pmc检测到cpu在用户态没有在m条指令内完成用户态中断处理程序,则用户态中断处理程序的结果状态指示未结束,cpu在内核态禁用该用户态irq,并将eoi写入中断控制器的寄存器。随后的操作和上述利用时钟中断请求实现用户态中断处理程序的结果状态的检测中的操作一致,为避免重复,在此不作赘述。
199.上述说明是对本技术实施例的用户态中断处理流程作了详细的描述,下面将结合图12和图13说明本技术实施例的用户态中断处理方法相较于目前的用户态中断处理流程如何实现减少时延,提高用户态中断处理程序的响应速度。
200.当用户态驱动和应用程序创建的是用户态中断处理线程时,图12是本技术实施例提供的另一种用户态中断处理流程示意图。
201.cpu在收到irq之前,也就是在时间点1’之前,cpu在用户态执行用户态线程a。cpu在时间点1’,接收到用户态irq,此时,cpu下陷至内核态中,使得用户态线程a从运行状态进入阻塞状态,也就是在时间点1’到时间点2’这段时间内,cpu需要存储用户态线程a的上下
文,以实现从用户态切换至内核态。
202.随后,从时间点2’开始,cpu在内核态执行第二中断异常处理程序,对应于s803、s804和s806,唤醒s803获取的中断号对应的用户态中断处理线程,使得用户态中断处理线程从阻塞状态进入就绪状态。
203.在时间点3’,cpu通过第一特权级切换,实现从内核态切换至用户态,对应s807。
204.通过第一特权级切换,第一特权级切换为无用户态中断处理线程的上下文恢复的切换,可以减少cpu从内核态切换至用户态执行用户态中断处理线程的时间,促使用户态中断处理线程可以得到快速响应,有效减少了时延。
205.cpu从内核态切换至用户态后,从时间点3’开始,cpu在用户态调用用户态中断处理线程,随后开始运行用户态中断处理线程中的用户态中断处理程序,对应s808。
206.在时间点4’,cpu在用户态执行完用户态中断处理线程,通过第二特权级切换,实现从用户态切换至内核态,对应于s810。cpu从时间点4’开始调度用户态线程a,以唤醒用户态线程a。
207.通过第二特权级切换,第二特权级切换为无用户态中断处理线程的上下文存储的切换,可以减少cpu从用户态切换至内核态的时间,有效减少了cpu服务用户态irq的整体时间。
208.在时间点5’,cpu在内核态唤醒了用户态线程a,使得用户态线程a从阻塞状态进入就绪状态。在时间点5’到时间点6’这段时间内,cpu需要恢复用户态线程a的上下文,以实现从内核态切换至用户态,在时间点6’,cpu在用户态继续执行用户态线程a。
209.当用户态驱动和应用程序103创建的是用户态中断处理程序的地址时,图13是本技术实施例提供的又一种用户态中断处理流程示意图。
210.图13中时间点2”到时间点3”这个时间段,短于图12时间点2’到时间点3’这个时间段,这是因为在图13的这段时间cpu在内核态运行第二中断异常处理程序时,可以直接得到用户态irq对应的用户态中断处理程序的地址。cpu在内核态通过第一特权级切换之后,可以直接开始运行用户态中断处理程序,不需要调用用户态中断处理线程。
211.因此,当用户态驱动和应用程序103创建的是用户态中断处理程序的地址时,通过本技术的用户态中断处理方法,可以更大地提升用户态中断处理程序的响应速度,从而减少用户态中断处理的时延。
212.相比于目前的用户态中断处理方法的流程,通过在cpu启动后对第一中断异常处理程序进行脱敏处理,实现cpu从内核态切换至用户态进行用户态中断处理程序时,不需要进行用户态中断处理线程的上下文恢复,提升了用户态中断处理程序的响应速度。
213.相比于目前的用户态中断处理方法的流程,本技术通过在cpu启动后给中断控制器设置中断优先级组和设置抢占操作,可以使得本技术方案在达到防止同一用户态中断请求再次发送给内核态产生嵌套的效果的同时,减少了禁用用户态中断请求和重新使能用户态中断请求这两个步骤,也可以提升用户态中断请求的响应速度,从而大大减少用户态中断请求的处理时延。
214.本技术实施例的方案可以大大减少用户态中断请求的处理时延,如表1所示,表1给出了目前的用户态中断方案、本技术实施例中技术方案在通用场景和单线程/单进程场景下的用户态中断时延对比表。
215.表1
216.用户态中断时延(cycles)目前用户态中断方案6000-8000本技术实施例通用场景方案2000-3000本技术实施例单线程/单进程场景方案200-400
217.根据表1可知,本技术实施例在通用场景下的用户态中断处理方案,相比于目前的用户态中断处理方案可以达到60%以上的优化效果,如果是在单线程或者单进程的场景下,也就是当用户态驱动和应用程序103创建的是用户态中断处理程序的存储地址时,本技术实施例的用户态中断处理方案,相比于目前的用户态中断处理方案可以达到90%的时延优化效果。
218.上面结合图7至图13详细介绍了本技术实施例中的用户态中断请求的处理方法,下面结合图14详细介绍本技术实施例中的用户态中断请求的处理装置。
219.参见图14,图14是本技术实施例提供的一种用户态中断请求的处理装置1400的示意图。如图14所示,用户态中断请求的处理装置1400包括cpu,该cpu包括初始化模块1401、中断异常处理模块1402、特权级切换模块1403、用户态中断处理模块1404、用户态中断处理结束模块1405和用户态中断处理结果检测模块1406。
220.初始化模块1401在内核态用于对第一中断异常处理程序的内核地址进行脱敏处理,以获得第二中断异常处理程序;中断异常处理模块1402在内核态用于获取用户态中断请求,并执行第二中断异常处理程序,以确定对应于用户态中断请求的用户态中断处理程序;特权级切换模块1403在内核态用于通过第一特权级切换,切换至用户态;用户态中断处理模块1404在用户态用于执行用户态中断处理程序,其中,第一特权级切换为无上下文恢复的切换;特权级切换模块1403在用户态用于通过第二特权级切换,切换至所述内核态,其中,所述第二特权级切换为无上下文存储的切换。
221.需要说明的是,上述模块是从功能逻辑上的划分,并非限定上述模块必须是独立的硬件单元。
222.初始化模块1401还用于执行前述方法实施例中的给中断控制器设置中断优先级组和设置抢占操作,用户态中断处理结束模块1405用于将结束中断eoi写入中断控制器的寄存器中,用户态中断处理结果检测模块1406用于用户态中断处理程序过程中,并发检测用户态中断处理程序的结果状态,详细过程可参考方法实施例,在此不作赘述。
223.图14中各个模块的连接关系仅为一种示例,本技术任意实施例提供的方法也可以应用在其它连接方式的终端设备中,例如所有模块通过总线连接。图14中各个模块的划分仅是逻辑上的划分,并不代表硬件上一定是分开的。图14中各个模块在本技术的其他实施例中未必是必要的。
224.另外,本技术还提供与本技术提供的方案相关的存储介质、计算机程序产品、计算机程序等。具体实现可参考前述实施例。
225.需要说明的是,为了方便应用和理解,本技术实施例为提到的一些系统、模块、器件、元素、数据结构以及指令等进行了命名,这些命名的大写或小写在无特殊说明的情况下均是相同的含义。同时,这些命名可以根据需求变更,不应作为对本技术所提供方案的限定。
226.需要说明的是,本实施例提供的方案可以应用于终端设备或服务器等。这里的终端设备包括但不限于智能手机、车载装置(例如自动驾驶设备)、个人计算机、人工智能设备、平板电脑、个人数字助理、智能穿戴式设备(例如智能手表或手环、智能眼镜)、智能语音设备(例如智能音箱等)、虚拟现实/混合现实/增强现实设备或网络接入设备(例如网关等)等。服务器可以包括存储服务器或计算服务器等。
227.需要说明的是,前述实施例中提出模块或单元的划分仅作为一种示例性的示出,所描述的各个模块的功能仅是举例说明,本技术并不以此为限。本领域普通技术人员可以根据需求合并其中两个或更多模块的功能,或者将一个模块的功能拆分从而获得更多更细粒度的模块,以及其他变形方式。
228.以上描述的各个实施例之间相同或相似的部分可相互参考。本技术中的“多个”若无特殊说明,指两个或两个以上,或“至少两个”。本技术中的“a/b”包括三种情况:“a”、“b”和“a和b”。本技术中一个对象的“标识(id)”指的是唯一标识该对象的信息,该“标识”可以直接标识该对象,例如对象的名称,也可以间接指示该对象,例如对象的存储地址。本技术中“第一”、“第二”、“第三”等仅为了区分表述,没有限定顺序的意思;另外,第一对象和第二对象在某些情况下有可能合并或指同一对象;再者,由于没有限定顺序,所以没有第一,也可以有第二或第三。
229.所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
230.在本技术所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
231.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
232.另外,在本技术各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
233.所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本技术各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。
234.以上所述,仅为本技术的具体实施方式,但本技术的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到变化或替换,都应涵
盖在本技术的保护范围之内。因此,本技术的保护范围应以所述权利要求的保护范围为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1