欧博在线
热门标签

亚新龙虎斗博彩平台注册送彩金(www.crownedsportsnation.com)

时间:2023-10-30 08:31    点击次数:176
亚新龙虎斗博彩平台注册送彩金(www.crownedsportsnation.com)[[437706]]  沙巴炸金花PIC假造化

计较机系统有许多的外设需要处事,显豁,CPU采取轮询的款式逐一盘考外设是否需要处事,怀念常铺张CPU的计较的,尤其是对那些并不是日常需要处事的建设。因此,计较机科学家们瞎想了外设主动向CPU发起处事肯求的款式,这种款式即是中断。采取中断款式后,在莫得外设肯求时,CPU就不错不竭其他计较任务,而不是进行许多不必要的轮询,极地面擢升了系统的蒙眬[1] 在每个教导周期闭幕后,若是CPU关中断美艳(IF)莫得被设立,那么其会去查抄是否有中断肯求,若是有中断肯求,则运行对应的中断处事规范,然后复返被中断的计较任务不竭实行。

CPU不可能为每个硬件皆瞎想特意的管脚汲取中断,管脚数目的畛域、电路的复杂度、纯真度等方方面面皆不现实,因此,需要瞎想一个特意处分中断的单位。由中断处分单位领受来自外围建设的肯求,细则肯求的优先级,并向CPU发出中断。1981年IBM推出的第1代个东谈主电脑PC/XT使用了一个孤苦的8259A看成中断适度器,自此,8259A就成为了单核时期中断芯片事实上的尺度。因为不错通过软件编程对其进行适度,比如当管脚收到建设信号时,不错编程适度其发出的中断向量号,因此,中断适度器又称为可编程中断适度器(programmable interrupt controller),简称PIC。单片8259A不错怒放8个外设的中断信号线,不错多片级联搭救更多外设。

8259A和CPU的怒放如图5所示。

图5 8259A和CPU怒放

近期,NBA巨星勒布朗·詹姆斯在皇冠体育上下了一场惊天的赌注,最终赢得了巨额奖金,引起了广泛关注。

片选和地址译码器衔接,当CPU准备走访8259A前,需要向地址总线发送8259A对应的地址,经过译码器后,译码器发现是8259A对应的地址,因此会拉低与8259A的CS怒放的管脚的电平,从而选中8259A,报告8259A,CPU准备与其交换数据了。

8259A的D0~7管脚与CPU的数据总线衔接。从CPU向8259A发送ICW和OCW,从8259A向CPU传送8259A的状况以及中断向量号,皆是通过数据总线传递的。

当CPU向8259A发送ICW、OCW时,当把数据奉上数据总线后,需要报告8259A读数据,CPU通过拉低WR管脚的电平的款式报告8259A,当8259A的WR管脚收到低电平后,读取数据总线的数据。访佛的,CPU准备好读取8259A的状况时,拉低RD管脚报告8259A。

8259A和CPU之间的中断信号的报告使用专用的连线,8259A的管脚INTR(interrupt request)和INTA(interrupt acknowledge)离别与处理器的INTR和INTA管脚衔接。8259A通过管脚INTR向CPU发送中断肯求,CPU通过管脚INTA向PIC发送中断阐明,告诉PIC其收到中断何况入手处理了。8259A与CPU之间的具体中断进程如下:

1)8259A的IR0~7管脚高电平灵验,是以当中断源肯求处事时,拉高怒放IR0~7的管脚,产生中断肯求。

2)8259A需要将这些信号记载下来,因此其里面有个寄存器IRR(Interrupt Request Register),进展记载这个中断肯求,针对这个例子,IRR的bit 0将被设立为1。

3)有的期间,咱们会屏蔽掉某个建设的中断。换句话说,即是确当这个中断源向8259A发送信号后,8259A并不将这个中断信号发送给CPU。读者不要将屏蔽和CPU通过cli号召关中断污染,CPU关中断时,中断还会发送给CPU,仅仅在关中断期间CPU不处理中断。8259A中的寄存器IMR(Interrupt Mask Register)进展记载某个中断源是否被屏蔽,比如0号中断源被建设了屏蔽,那么IMR的bit 0将被设立。那么这个IMR是谁设立的呢?虽然是CPU中的操作系统。因此这一步,8259A将会查抄收到的中断肯求是否被屏蔽。

4)在某一个时刻,可能有多个中断肯求,好像是之前存在IRR中的中断并莫得被处理,8259A中积存了一些中断。某一个时刻,8259A只可向CPU发送一个中断肯求,因此,当存在多个中断肯求时,8259A需要判断一下中断优先级,这个单位叫作念priority resolver,priority resolver将在IRR中选出优先级最高的中断。

5)选出最高优先级的中断后,8259A拉高管脚INTR的电平,向CPU发出信号。

6)当CPU实行完现时教导周期后,其将查抄寄存器FLAGS的中断使能位IF(Interrupt enable flag),若是允许中断,那么将查抄INTR是否有中断,若是有中断,那么将通过管脚INTR报告8259A处理器将入手处理中断。

7)8259A收到CPU发来的INTA信号后,将置位最高优先级的中断在ISR(In-Service Register)中对应的位,并清空IRR中对应的位。

8)日常,x86 CPU会发送第2次INTA,在收到第2次INTA后,8259A会将中断向量号(vector)奉上数据总线D0~D7。

9)若是8259A设立为AEOI(Automatic End Of Interrupt)模式,那么8259A复位ISR中对应的bit,不然ISR中对应的bit一直保执到收到系统的中断处事规范发来的EOI号召。

咱们知谈,中断处事规范保存在一个数组中,数组中的每一项对应一个中断处事规范。在实模式下,这个数组称为IVT(interrupt vector table);在保护模式下,这个数组称为IDT(Interrupt descriptor table)。

这个数组中保存的处事规范,并不是一齐皆是外部中断,还有处理CPU里面格外的以及软中断处事规范。x86CPU前32个中断号(0-31)留给处理器格外的,比如第0个中断号,是处理器出现除0(Divide by Zero)格外的,不可被占用。因此,假定咱们贪图IVT数组中第32个元素存放管脚IR0对应的ISR,那么咱们运行化8259A时,通过ICW,设立肇端的irq base为32,那么当8259A发出管脚IR0的中断肯求时,则发出的值是32,管脚IR1对应的是33,以此类推。这个32、33即是所谓的中断向量(vector)。换句话说,中断向量即是中断处事规范在IVT/IDT中的索引。底下即是设立irq_base的代码,在运行化时,通过第2个运行化号召字(ICW2)设立:

commit 85f455f7ddbed403b34b4d54b1eaf0e14126a126 KVM: Add support for in-kernel PIC emulation linux.git/drivers/kvm/i8259.c static void pic_ioport_write(void *opaque, u32addr, u32 val) {   …     switch(s->init_state) {     …     case 1:       s->irq_base = val & 0xf8;     …     } } 

自后,跟着APIC和MSI的出现,中断向量设立的更为纯真,不错为每个PCI设立其中断向量,这个中断向量存储在PCI建设的成立空间中。

内核中概述了一个结构体kvm_kpic_state来记载每个8259A的状况:

commit 85f455f7ddbed403b34b4d54b1eaf0e14126a126 KVM: Add support for in-kernel PIC emulation struct kvm_kpic_state {   u8last_irr;  /* edge detection */   u8 irr;  /* interrupt request register */   u8imr;   /* interrupt mask register */   u8isr;   /* interrupt service register */   … };   struct kvm_pic {   structkvm_kpic_state pics[2]; /* 0 is master pic, 1 is slave pic*/  irq_request_func *irq_request;   void*irq_request_opaque;   intoutput;   /* intr from master PIC */   structkvm_io_device dev; }; 

1片8259A只可怒放最多8个外设,若是需要搭救更多外设,需要多片8259A级联。在结构体kvm_pic中,咱们看到有2片8259A:pic[0]和pic[1]。KVM界说了结构体kvm_kpic_state记载8259A的状况,其中包括咱们之前提到的IRR、IMR、ISR等等。

1 假造建设向PIC发送中断肯求

如同物理外设肯求中断时拉高与8259A怒放的管脚的电压,假造建设肯求中断的款式是通过一个API告诉假造的8259A芯片中断肯求,以kvmtool中的virtio blk假造建设为例:

commit 4155ba8cda055b7831489e4c4a412b073493115b kvm: Fix virtio block device support some more kvmtool.git/blk-virtio.c static bool blk_virtio_out(…) {   …   caseVIRTIO_PCI_QUEUE_NOTIFY: {     …     while(queue->vring.avail->idx != queue->last_avail_idx) {       if(!blk_virtio_read(self, queue))        return false;     }    kvm__irq_line(self, VIRTIO_BLK_IRQ, 1);       break;   }   … } 

当Guest内核的块建设驱动发出I/O报告VIRTIO_PCI_QUEUE_NOTIFY时,将触发CPU从Guest模式切换到Host模式,KVM中的块模拟建设入手I/O操作,比如走访保存Guest文献系统的镜像文献。virtio blk这个提交,块建设的I/O处理是同步的,也即是说,一直要比及文献操作完成,才会向Guest发送中断,复返Guest。虽然同步壅塞在这里是分歧理的,而是应该随即复返Guest,这么Guest不错实行其他的任务,假造建设完成I/O操作后,再报告Guest,这是kvmtool初期的已矣,自后也曾矫正为异步的款式。代码中在一个while轮回处理完建设驱动的I/O肯求后,调用了函数kvm__irq_line,irq_line对应8259A的管脚IR0~7,其代码如下:

commit 4155ba8cda055b7831489e4c4a412b073493115b kvm: Fix virtio block device support some more kvmtool.git/kvm.c void kvm__irq_line(struct kvm *self, int irq, intlevel) {   structkvm_irq_level irq_level;     irq_level= (struct kvm_irq_level) {     {      .irq    = irq,     },    .level    = level,   };     if(ioctl(self->vm_fd, KVM_IRQ_LINE, &irq_level) < 0)    die_perror("KVM_IRQ_LINE failed"); } 函数kvm__irq_line将irq number和管脚电平信息,这里是1,默示拉高电平了,封装到结构体kvm_irq_level中,传递给内核中的KVM模块: commit 85f455f7ddbed403b34b4d54b1eaf0e14126a126 KVM: Add support for in-kernel PIC emulation linux.git/drivers/kvm/kvm_main.c static long kvm_vm_ioctl(…) {   …   caseKVM_IRQ_LINE: {     …         kvm_pic_set_irq(pic_irqchip(kvm),          irq_event.irq,          irq_event.level);     …     break;   }   … } 

KVM模块将kvmtool中组织的中断信息从用户空间复制到内核空间中,然后调用假造8259A的模块中提供的API kvm_pic_set_irq,向8259A发出中断肯求。

2 记载中断到IRR

中断处理需要一个进程,从外设发出肯求,一直到ISR处理完成发出EOI。而且可能中断来了并不可随即处理,好像之前也曾累加了一些中断,人人需要列队次第肯求CPU处理,等等,因此,需要一些寄存器来记载这些状况。当外设中断肯求到来时,8259A当先需要将他们记载下来,这个寄存器即是IRR(Interrupt Request Register),8259A用他来记载有哪些pending的中断需要处理。

皇冠网址

当KVM模块收到外设的肯求,调用假造8259A的API kvm_pic_set_irq是,其第1件事即是将中断记载到IRR寄存器中:

commit 85f455f7ddbed403b34b4d54b1eaf0e14126a126 KVM: Add support for in-kernel PIC emulation linux.git/drivers/kvm/i8259.c void kvm_pic_set_irq(void *opaque, int irq, intlevel) {   structkvm_pic *s = opaque;    pic_set_irq1(&s->pics[irq >> 3], irq & 7, level);   …… }   static inline void pic_set_irq1(structkvm_kpic_state *s, int irq, int level) {   int mask;   mask = 1<< irq;   if(s->elcr & mask) /* level triggered */     …   else  /* edge triggered */     if(level) {       if((s->last_irr & mask) == 0)        s->irr |= mask;      s->last_irr |= mask;     } else      s->last_irr &= ~mask; } 

信号有角落触发和水平触发,在物理上不错领会为,8329A在前一个周期检测到管脚信号是0,现时周前检测到管脚信号是1,若是是飞腾沿触发模式,那么8259A就以为外设有肯求了,这种触发模式即是角落触发。对于水平触发,以高电平触发为例,当8259A检测到管脚处于高电平,则以为外设来肯求了。

在假造8259A的结构体kvm_kpic_state中,寄存器elcr即是用来记载8259A被设立的触发模式的。参数level即相当于硬件层面的电信号,0默示低电平,1默示高电平。以角落触发为例,当管脚收到一个低电平时,即level的值为0,代码干涉else分支,结构体kvm_kpic_state中的字段last_irr中会断根该IRQ对应IRR的位,即相当于设立该中断管脚为低电平状况。当管脚收到高电平时,即level的值为1,代码干涉if分支,此时8259A将判断之前该管脚的状况,也即是判断结构体kvm_kpic_state中的字段last_irr中该IRQ对应IRR的位,若是为低电平,那么则以为中断源有中断肯求,将其记载到IRR中。虽然,同期需要在字段last_irr记载下现时该管脚的状况。

3 设立中断美艳

当8259A将中断肯求记载到IRR中后,下一步即是开启一个中断评估(evaluate)进程了,包括中断是否被屏蔽,多个中断肯求的优先级等等,终末将通过管脚INTA报告CPU处理外部中断。咱们看到这里是8259A主动发起中断进程,然而假造中断有些不同,中断的发起的时机不再是假造中断芯片主动发起,而是在每次准备切入Guest时,KVM查询中断芯片,若是有pending的中断,则实行中断注入。模拟8259A在收到中断肯求后,在记载到IRR后,设立一个变量,背面在切入Guest前KVM会查询这个变量:

皇冠客服飞机:@seo3687
commit 85f455f7ddbed403b34b4d54b1eaf0e14126a126 KVM: Add support for in-kernel PIC emulation linux.git/drivers/kvm/i8259.c void kvm_pic_set_irq(void *opaque, int irq, intlevel) {   structkvm_pic *s = opaque;    pic_set_irq1(&s->pics[irq >> 3], irq & 7, level);  pic_update_irq(s); }   static void pic_update_irq(struct kvm_pic *s) {   …   irq =pic_get_irq(&s->pics[0]);   if (irq>= 0)    s->irq_request(s->irq_request_opaque, 1);   else    s->irq_request(s->irq_request_opaque, 0); }   static void pic_irq_request(void *opaque, intlevel) {   struct kvm*kvm = opaque;    pic_irqchip(kvm)->output = level; } 

在函数vmx_vcpu_run中,在准备切入Guest之前将调用函数vmx_intr_assist去查抄假造中断芯片是否有恭候处理的中断,计划代码如下:

www.crownedsportsnation.com
commit 85f455f7ddbed403b34b4d54b1eaf0e14126a126 KVM: Add support for in-kernel PIC emulation linux.git/drivers/kvm/vmx.c static int vmx_vcpu_run(…) {   …    vmx_intr_assist(vcpu);   … }   static void vmx_intr_assist(struct kvm_vcpu*vcpu) {   …   has_ext_irq= kvm_cpu_has_interrupt(vcpu);   …   if(!has_ext_irq)     return;  interrupt_window_open =    ((vmcs_readl(GUEST_RFLAGS) & X86_EFLAGS_IF) &&     (vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & 3) == 0);   if(interrupt_window_open)    vmx_inject_irq(vcpu, kvm_cpu_get_interrupt(vcpu));   … } 

其中函数kvm_cpu_has_interrupt查询8259A设立的变量output:

commit 85f455f7ddbed403b34b4d54b1eaf0e14126a126 KVM: Add support for in-kernel PIC emulation linux.git/drivers/kvm/irq.c int kvm_cpu_has_interrupt(struct kvm_vcpu *v) {   structkvm_pic *s = pic_irqchip(v->kvm);     if(s->output)  /* PIC */     return1;   return 0; } 

若是有output设立了,就讲明有外部中断恭候处理,然后接着判断Guest是否不错被中断,包括Guest是否中断了,Guest是否正在实行一些不可被中断的教导,若是不错注入,则调用vmx_inject_irq完成中断的注入。其中,传递给函数vmx_inject_irq的第2个参数是函数kvm_cpu_get_interrupt复返的服从,该函数取得需要注入的中断,这个进程即是中断评估进程,咱们下一节运筹帷幄。

4 中断评估

在上一节咱们看到在实行注入前,vmx_inject_irq调用函数kvm_cpu_get_interrupt取得需要注入的中断。函数kvm_cpu_get_interrupt的中枢逻辑即是中断评估(evaluate),包括:这个pending的中断有莫得被屏蔽?pending的中断的优先级是否比CPU正在处理的中断优先级高?代码如下:

皇冠hg86a

commit 85f455f7ddbed403b34b4d54b1eaf0e14126a126 KVM: Add support for in-kernel PIC emulation linux.git/drivers/kvm/irq.c int kvm_cpu_get_interrupt(struct kvm_vcpu *v) {   ……   vector =kvm_pic_read_irq(s);   if (vector!= -1)     returnvector;   … }   linux.git/drivers/kvm/i8259.c int kvm_pic_read_irq(struct kvm_pic *s) {   int irq,irq2, intno;     irq =pic_get_irq(&s->pics[0]);   if (irq>= 0) {     …       intno = s->pics[0].irq_base + irq;   } else {   …   returnintno; } 

kvm_pic_read_irq调用函数pic_get_irq取得评估后的中断,如上头黑体美艳的,咱们不错走漏的看到中断向量和中断管脚的干系,相易了一个irq_base,这个irq_base即是通过运行化8259A时通过ICW设立的,完成从IRn到中断向量的更始。

一个中断芯片日常怒放有多个外设,是以在某一个时刻,可能会有多个建设肯求到来,这时就有一个优先处理哪个肯求的问题,因此,中断就有了优先级的主见。以8259A为例,典型的有2种中断优先级模式:

1)固定优先级(Fixedpriority),即优先级是固定的,从IR0到IR7次第镌汰,IR0的优先级永远最高,IR7的优先级永远最低。

2)轮回优先级(rotatingpriority),即现时处理完的IRn其优先级颐养为最低,现时处理的优先级下个,即IRn+1,颐养为优先级最高。比如,现时处理的中断是irq 2,那么紧接着irq3的优先级设立为是最高,然后次第是irq4、irq5、irq6、irq7、irq1、irq2、irq3。假定此时irq5和irq2同期来了中断,那么irq5显豁会被优先处理。然后irq6被设立为优先级最高,接下来次第是irq7、irq1、irq2、irq3、irq4、irq5。

领会了轮回优先级算法后,从8259A中取得最高优先级肯求的代码就很容易领会了:

commit85f455f7ddbed403b34b4d54b1eaf0e14126a126 KVM: Add support for in-kernel PIC emulation linux.git/drivers/kvm/i8259.c static int pic_get_irq(struct kvm_kpic_state *s) {   int mask,cur_priority, priority;     mask =s->irr & ~s->imr;   priority =get_priority(s, mask);   if(priority == 8)     return-1;   …   mask =s->isr;   …  cur_priority = get_priority(s, mask);   if(priority < cur_priority)     /*      *higher priority found: an irq should be generated      */     return(priority + s->priority_add) & 7;   else     return-1; }   static inline int get_priority(structkvm_kpic_state *s, int mask) {   intpriority;   if (mask== 0)     return8;   priority =0;   while((mask & (1 << ((priority + s->priority_add) & 7))) == 0)    priority++;   returnpriority; } 

函数pic_get_irq分红2部分,第1部分是从现时pending的中断中取得最高优先级的中断,现时之前需要滤掉被被屏蔽的中断。第2部分是取得正在被CPU处理的中断的优先级的中断的优先级,通过这里,读者更能具体的领会了8259A为什么需要这些寄存器记载中断的状况。然后相比2个中断的优先级,若是pending的优先级高,那么就通过拉低INTR管脚电压,向CPU发出中断肯求。

再来看一下计较优先级的函数get_priority。其中变量priority_add记载的是现时最高优先级的管脚,是以逻辑上即是从现时最高的优先级管脚入手,从高向低次第查抄是否有pending的中断。比如现时IR4最高,那么priority_add的值即是4。while轮回,从管脚IR(4+0)入手,次第查抄管脚IR(4+1)、IR(4+2),以此类推。

5 中断ACK

在物理上,CPU在准备处理一个中断肯求后,将通过管脚INTA向8259A发出阐明脉冲。雷同,软件模拟上,也需要访佛处理。在完成中断评估后,准备注入Guest前,需要向假造8259A实行阐明状况的操作,代码如下:

commit 85f455f7ddbed403b34b4d54b1eaf0e14126a126 KVM: Add support for in-kernel PIC emulation linux.git/drivers/kvm/i8259.c int kvm_pic_read_irq(struct kvm_pic *s) {   int irq,irq2, intno;     irq =pic_get_irq(&s->pics[0]);   if (irq>= 0) {    pic_intack(&s->pics[0], irq);   … }   static inline void pic_intack(structkvm_kpic_state *s, int irq) {   if(s->auto_eoi) {     …   } else    s->isr |= (1 << irq);   /*    * Wedon't clear a level sensitive interrupt here    */   if(!(s->elcr & (1 << irq)))    s->irr &= ~(1 << irq); } 

在中断评估中,在调用函数kvm_pic_read_irq取得评估的中断服从后,随即就调用函数pic_intack完成了中断阐明的动作。在收到CPU发来的中断阐明后,8259A需要更新我方的状况,包括,因为中断也曾入手得到处事了,是以从IRR中断根恭候处事肯求。另外,需要设立ISR位,记载正在被处事的中断,然而这里略微有少量点复杂。

设立ISR默示正在处事的位,默示处理器正在处理中断。设立ISR的一个典型作用是中断的作用是当ISR处理完中断,向8259A发送EOI时,8259A知谈正在处理的IRn,比如说若是8259A使用的是轮回优先级,那么需要最高优先级为现时处理的IRn的下一个。

若是8259A是AEOI模式,那么就不必设立ISR了,因为中断处事规范实行已矣后不会发送EOI号召。是以在AEOI模式下(上头代码的if分支),需要将收到EOI时8259A需要处理的逻辑完成,这部天职容咱们鄙人一节会运筹帷幄。

对于角落触发的,干涉到ISR阶段后,需要复位对于IRR。对于level trigger的,在收到中断肯求后8259A处理,不外多运筹帷幄了,若是读者有兴趣,不错阅读函数pic_set_irq1中对于水平触发部分的逻辑。

6 对于EOI的处理

中断处事规范实行完成后,会向8259A发送EOI,见知8259A中断处理完成。8259A在收到这个EOI时,复位ISR,若是是采取的轮回优先级,还需要设立变量priority_add,使其指向现时处理IRn的下一个:

看到这里,很多人都感觉到不可思议,内心也开始变得紧张起来。究竟是什么样的椰子能有如此大的毒性?是不是以后就不能喝椰子汁了?千万不要着急,其实并不是所有的椰子都有毒性,只是部分叶子会出现此类情况而已,比如预开口的椰子。喝过椰子汁的人都知道,虽然椰子汁好喝,但椰子壳又硬又难开。

博彩平台注册送彩金皇冠体育APP

根据通报内容可知,2023年4月12日早上5点40分,沈海高速公路翔安出口匝道处,一辆大货车追尾一辆小型轿车,撞击的巨大冲力使小轿车的车尾完全变形,现场画面显示小轿车的车尾已经完全凹陷,车身面目全非,整个后排座位已经被完全压扁。

commit85f455f7ddbed403b34b4d54b1eaf0e14126a126 KVM: Add support for in-kernel PIC emulation linux.git/drivers/kvm/i8259.c static void pic_ioport_write(void *opaque, u32addr, u32 val) {   …       case1: /* end of interrupt */       case5:        priority = get_priority(s, s->isr);         if(priority != 8) {          irq = (priority + s->priority_add) & 7;          s->isr &= ~(1 << irq);           if(cmd == 5)            s->priority_add = (irq + 1) & 7;          pic_update_irq(s->pics_state);         }        break;   … } 

若是8259A被设立为AEOI模式,不会再收到后续中断处事规范的EOI号召,那么8259A在收到CPU的ACK后,就必须把收到EOI号召时实行的逻辑咫尺处理,前边看到AEOI模式不必设立ISR,是以这里也无需复位ISR,只需要颐养变量priority_add,记载最高优先级位置即可:

commit 85f455f7ddbed403b34b4d54b1eaf0e14126a126 KVM: Add support for in-kernel PIC emulation static inline void pic_intack(structkvm_kpic_state *s, int irq) {   if(s->auto_eoi) {     if(s->rotate_on_auto_eoi)      s->priority_add = (irq + 1) & 7;      } else   … } 
7 中断注入

对于外部中断,每个CPU在教导周期闭幕后,将会去查抄INTR是否有中断肯求。那么对于处于Guest模式的CPU,其若何知谈有中断肯求呢?Intel在VMCS中设立了一个字段:VM-entry interruption-information,在VM entry时CPU将会查抄这个字段,这个字段时势表3-1所示。

表3-1 VM-entry interruption-information时势(部分)

亚新龙虎斗

履行

7:0

澳门新葡京酒店图片

中断或格外向量

10:8

中断类型:

0: External  interrupt

1: Reserved

2: Non-maskable  interrupt (NMI)

3: Hardware  exception

4: Software  interrupt

5: Privileged  software exception

深圳 皇冠体育中心

6: Software  exception

7: Other event

31

是否灵验[2] 

在VM entry前,KVM模块查抄假造8259A中若是有pending中断需要处理,则将需要处理的中断信息写入到VMCS中的这个字段VM-entry 

interruption-information: commit 85f455f7ddbed403b34b4d54b1eaf0e14126a126 KVM: Add support for in-kernel PIC emulation linux.git/drivers/kvm/vmx.c static void vmx_inject_irq(struct kvm_vcpu *vcpu,int irq) {   …  vmcs_write32(VM_ENTRY_INTR_INFO_FIELD,       irq |INTR_TYPE_EXT_INTR | INTR_INFO_VALID_MASK); } 

前边咱们看到,中断注入是在每次VM entry时,KVM模块查抄8259A是否有pending的中断恭候处理。这么就有可能给中断带来一定的蔓延,典型如底下2类情况:

(1)CPU可能正处在Guest模式,那么就需要恭候下一次VM exit 和VM entry。

(2)VCPU这个线程也许正在寝息,比如Guest VCPU运行hlt教导时,就会切换回Host模式,线程挂起。

对于第1种情况,是多处理器系统下的一个典型情况,方针CPU的正在运行Guest。KVM需要念念方针触发Guest发生一次VM exit,切换到Host。咱们知谈,当处于Guest模式的CPU收到外部中断时,会触发VM exit,由Host来处理此次中断。是以,KVM不错向方针CPU发送一个IPI中断,触发方针CPU发生一次VM exit。

对于第2种情况,当先需要叫醒寝息的VCPU线程,使其干涉CPU就绪部队,准备领受调节。对于多处理器系统,然后再向方针CPU发送一个“再行调节”的IPI中断,那么被叫醒的VCPU线程很快就会被调节,实行切入Guest的进程,从而完成中断注入。

是以当有中断肯求时,假造中断芯片将主动“kick”一下方针CPU,这个“踢”的函数即是kvm_vcpu_kick:

赌场
commit b6958ce44a11a9e9425d2b67a653b1ca2a27796f KVM: Emulate hlt in the kernel linux.git/drivers/kvm/i8259.c static void pic_irq_request(void *opaque, intlevel) {   …  pic_irqchip(kvm)->output = level;   if (vcpu)    kvm_vcpu_kick(vcpu); } 

若是假造CPU线程在寝息,则“踢醒”他。若是方针CPU运行在Guest模式,则将其从Guest模式“踢”到Host模式,在VM entry时完成中断注入,kick的妙技即是咱们刚刚提到的IPI,代码如下:

commit b6958ce44a11a9e9425d2b67a653b1ca2a27796f KVM: Emulate hlt in the kernel linux.git/drivers/kvm/irq.c void kvm_vcpu_kick(struct kvm_vcpu *vcpu) {   intipi_pcpu = vcpu->cpu;     if(waitqueue_active(&vcpu->wq)) {    wake_up_interruptible(&vcpu->wq);    ++vcpu->stat.halt_wakeup;   }   if(vcpu->guest_mode)    smp_call_function_single(ipi_pcpu, vcpu_kick_intr, vcpu, 0, 0); } 

若是VCPU线程寝息在恭候部队上,则叫醒使其干涉CPU的就绪任务部队。若是是多CPU的情况且方针CPU处于Guest模式,则需要发送核间中断。若是方针CPU正在实行Guest,那么这个IPI中断将导致VM exit,从而鄙人一次干涉Guest时,不错注入中断。

事实上,方针CPU不必实行任何callback,也不必恭候IPI复返,是以也不必使用smp_call_function_single,而是胜利发送一个肯求方针CPU再行调节的IPI即可,因而自后胜利调用了函数smp_send_reschedule。函数smp_send_reschedule浅近胜利,胜利发送了一个RESCHEDULE的IPI:

commit 32f8840064d88cc3f6e85203aec7b6b57bebcb97 KVM: use smp_send_reschedule in kvm_vcpu_kick linux.git/arch/x86/kvm/x86.c void kvm_vcpu_kick(struct kvm_vcpu *vcpu) {   …      smp_send_reschedule(cpu);   … }   linux.git/arch/x86/kernel/smp.c static void native_smp_send_reschedule(int cpu) {   …  apic->send_IPI_mask(cpumask_of(cpu), RESCHEDULE_VECTOR); } 

本文转载自微信公众号「Linux阅码场」,不错通过以下二维码宝贵。转载本文请计划Linux阅码场公众号。

 



上一篇:开云百家乐打不开解决方法_力压李盈莹完成留洋! 女排“00后”主攻崛起, 可蔡斌却并不看好
下一篇:亚博现金网博彩平台提现步骤_体坛新声|中国足球需要心和善平

网友评论