reactos操作系统实现(97)

在这个函数里,又继续地调用内核的两个函数KiConnectVectorToInterruptHalEnableSystemInterrupt来处理。

#001  VOID

#002  NTAPI

#003  KiConnectVectorToInterrupt(IN PKINTERRUPT Interrupt,

#004                             IN CONNECT_TYPE Type)

#005  {

#006      DISPATCH_INFO Dispatch;

#007      PKINTERRUPT_ROUTINE Handler;

 

 

#008      PULONG Patch = &Interrupt->DispatchCode[0];

#009 

 

获取中断的分发信息,其实就是设置中断处理中间函数。

#010      /* Get vector data */

#011      KiGetVectorDispatch(Interrupt->Vector, &Dispatch);

#012 

 

检查是否没有连接中断。

#013      /* Check if we're only disconnecting */

#014      if (Type == NoConnect)

#015      {

 

没有中断处理函数,就使用缺省的。

#016          /* Set the handler to NoDispatch */

#017          Handler = Dispatch.NoDispatch;

#018      }

#019      else

#020      {

 

根据中断是共享类型,还是普通类型,如果是共享就调用中断列表,否则就调用中断处理函数。

#021          /* Get the right handler */

#022          Handler = (Type == NormalConnect) ?

#023                    Dispatch.InterruptDispatch:

#024                    Dispatch.ChainedDispatch;

#025          ASSERT(Interrupt->FloatingSave == FALSE);

#026 

 

设置中断处理的地址。

#027          /* Set the handler */

#028          Interrupt->DispatchAddress = Handler;

#029 

 

这里将KiInterruptTemplateDispatch那里的jmp指令的跳转地址改写为Handler,至于这里为什么要用Handler的地址减去Patch再加4,那是因为这里是相对地址的跳转。所以是从当前指令来偏移的。

#030          /* Jump to the last 4 bytes */

#031          Patch = (PULONG)((ULONG_PTR)Patch +

#032                           ((ULONG_PTR)&KiInterruptTemplateDispatch -

#033                            (ULONG_PTR)KiInterruptTemplate) - 4);

#034 

#035          /* Apply the patch */

#036          *Patch = (ULONG)((ULONG_PTR)Handler - ((ULONG_PTR)Patch + 4));

#037 

#038          /* Now set the final handler address */

#039          ASSERT(Dispatch.FlatDispatch == NULL);

#040          Handler = (PVOID)&Interrupt->DispatchCode;

#041      }

#042 

 

这里把中断处理函数设置到中断描述表里。

#043      /* Set the pointer in the IDT */

#044      ((PKIPCR)KeGetPcr())->IDT[Interrupt->Vector].ExtendedOffset =

#045          (USHORT)(((ULONG_PTR)Handler >> 16) & 0xFFFF);

#046      ((PKIPCR)KeGetPcr())->IDT[Interrupt->Vector].Offset =

#047          (USHORT)PtrToUlong(Handler);

#048  }

 

下面回过头来分析函数KeInitializeInterrupt的实现,因为这个初始化代码比较重要,看了它才明白怎么样实现中断连接,如下:

#001  VOID

#002  NTAPI

#003  KeInitializeInterrupt(IN PKINTERRUPT Interrupt,

#004                        IN PKSERVICE_ROUTINE ServiceRoutine,

#005                        IN PVOID ServiceContext,

#006                        IN PKSPIN_LOCK SpinLock,

#007                        IN ULONG Vector,

#008                        IN KIRQL Irql,

#009                        IN KIRQL SynchronizeIrql,

#010                        IN KINTERRUPT_MODE InterruptMode,

#011                        IN BOOLEAN ShareVector,

#012                        IN CHAR ProcessorNumber,

#013                        IN BOOLEAN FloatingSave)

#014  {

#015      ULONG i;

#016      PULONG DispatchCode = &Interrupt->DispatchCode[0], Patch = DispatchCode;

#017 

 

设置中断处理头部份。

#018      /* Set the Interrupt Header */

#019      Interrupt->Type = InterruptObject;

#020      Interrupt->Size = sizeof(KINTERRUPT);

#021 

 

检查是否已经分配自旋锁。

#022      /* Check if we got a spinlock */

#023      if (SpinLock)

#024      {

#025          Interrupt->ActualLock = SpinLock;

#026      }

#027      else

#028      {

#029          /* This means we'll be usin the built-in one */

#030          KeInitializeSpinLock(&Interrupt->SpinLock);

#031          Interrupt->ActualLock = &Interrupt->SpinLock;

#032      }

#033 

 

初始化中断结构相关的属性。

#034      /* Set the other settings */

#035      Interrupt->ServiceRoutine = ServiceRoutine;

#036      Interrupt->ServiceContext = ServiceContext;

#037      Interrupt->Vector = Vector;

#038      Interrupt->Irql = Irql;

#039      Interrupt->SynchronizeIrql = SynchronizeIrql;

#040      Interrupt->Mode = InterruptMode;

#041      Interrupt->ShareVector = ShareVector;

#042      Interrupt->Number = ProcessorNumber;

#043      Interrupt->FloatingSave = FloatingSave;

#044      Interrupt->TickCount = (ULONG)-1;

#045      Interrupt->DispatchCount = (ULONG)-1;

#046 

 

拷贝中断处理函数的中间跳转代码。共有106x4个字节大小。

#047      /* Loop the template in memory */

#048      for (i = 0; i < KINTERRUPT_DISPATCH_CODES; i++)

#049      {

#050          /* Copy the dispatch code */

#051          *DispatchCode++ = KiInterruptTemplate[i];

#052      }

#053 

 

检查这段中断处理代码是否合法。

#054      /* Sanity check */

#055      ASSERT((ULONG_PTR)&KiChainedDispatch2ndLvl -

#056             (ULONG_PTR)KiInterruptTemplate <= (KINTERRUPT_DISPATCH_CODES * 4));

#057 

 

计算中断处理函数的最后4字节的位置,也就是模板代码里这一行:

mov edi, 0,相当于设置0这个参数,也就是把中断结构的指针保存edi寄存器里,以便后面跳转函数可以使用这个中断结构。

#058      /* Jump to the last 4 bytes */

#059      Patch = (PULONG)((ULONG_PTR)Patch +

#060                       ((ULONG_PTR)&KiInterruptTemplateObject -

#061                        (ULONG_PTR)KiInterruptTemplate) - 4);

#062 

 

把实际中断结构指针保存在中断的模板代码里,以便中断发生时,就可以跳到相应的中断函数运行,并可以获取中断参数。

#063      /* Apply the patch */

#064      *Patch = PtrToUlong(Interrupt);

#065 

#066      /* Disconnect it at first */

#067      Interrupt->Connected = FALSE;

#068  }

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值