PCIe有三种中断,分别为INTx中断,MSI中断,MSI-X中断,其中INTx是可选的(Legacy),MSI/MSI-X是必须实现的。
INTx:是开始PCI时期的产物,为了兼容PCI的INTA,INTB,INTC,INTD四个中断线而采用的一种中断机制。由于仅支持四个中断,且采用一个状态来控制,这种机制导致多中断场景软件处理复杂特别是有中断嵌套的场景(由于支持中断比较少,会有公用一个状态信号),比较多的PCIe设备都没有支持该特性。
MSI:message signal interrupt, 是PCI设备通过写一个特定消息到特定地址,从而触发一个CPU中断,最大支持32个中断。
MSI对比INTx 主要有以下几个优点:
1、中断独立,INTx4个中断公用一个状态信号,而MSI所有中断都是相互独立,软件处理方方便
2、MSI支持的中断数量更多,且不依赖IO,节省IO资源。
MSI-x:由于MSI中断存在仅支持32个中断,中断号必须要连续等限制,PCIe 3.0版本在MSI的基础上发展出了MSI-x,最大支持2048个中断,中断号可以不连续。
这些中断方式在驱动开发过程使用:
驱动开发中,大部分困难工作已经在PCI层为驱动完成了。驱动程序只需请求 PCI 层为此设备设置 MSI 功能。
int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
unsigned int max_vecs, unsigned int flags);
它为 PCI 设备分配最多max_vecs个中断向量。它返回申请的vectors数量或负数。如果设备对vectors的最小数量有要求,驱动程序可以传递一个min_vecs参数配置这个限制,如果它不能满足vectors的最小数量,PCI core 将返回 -ENOSPC。
flags 参数用于指定设备和驱动程序可以使用哪种类型的中断(PCI_IRQ_LEGACY、PCI_IRQ_MSI、PCI_IRQ_MSIX)。一个方便的简写 (PCI_IRQ_ALL_TYPES) 也可用于请求任何可能的中断类型。如果设置了PCI_IRQ_AFFINITY标志,pci_alloc_irq_vectors()将在可用 CPU间广播中断。
上面pci_alloc_irq_vectors分配好的IRQ存放在dev->msi_list列表的msi_entry中,可以通过for_each_msi_entry遍历每个IRQ:
for_each_msi_entry(desc, dev){
request_irq(desc->irq, handler, flags, name, dev)
}
下图是ARMv8架构下的主要经过的模块,主要流程如下

(1)HOST枚举到EP PF设备,配置MSI-x table
(2)EP设备通过读取vector table,获取到MSI-x中断对应的message address,构造一个TLP包,往message address地址里面写中断信息。
(3)PCIE RC收到包判断是个TLP写后,将写操作转到总线,并返回ACK
(4)GIC中的ITS检测到对应DDR有变化,则获取设备和中断信息后分发到经GIC分发到各个CPU核上。
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
在添加一些空格以使代码更具可读性时(与上面的代码对齐),我遇到了这个:classCdefx42endendm=C.new现在这将给出“错误数量的参数”:m.x*m.x这将给出“语法错误,意外的tSTAR,期待$end”:2/m.x*m.x这里的解析器到底发生了什么?我使用Ruby1.9.2和2.1.5进行了测试。 最佳答案 *用于运算符(42*42)和参数解包(myfun*[42,42])。当你这样做时:m.x*m.x2/m.x*m.xRuby将此解释为参数解包,而不是*运算符(即乘法)。如果您不熟悉它,参数解包(有时也称为“spl
require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie
在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa
我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码pdf.transactiondopdf.table@data,:font_size=>12,:border_style=>:grid,:horizontal_padding=>10,:vertical_padding=>3,:border_width=>2,:position=>:left,:row_colors=>["FFFFFF","DDDDDD"]pdf.
目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式
我下面有一个ruby脚本,它无限地打印从1开始的数字。如何通过终端中的中断(如“Ctrl+C”或键“q”)使脚本停止无限执行?a=0while(a)putsaa+=1#thecodeshouldquitifaninterruptofacharacterisgivenend在每次迭代中,不应询问用户输入。 最佳答案 使用Kernel.trap为Ctrl-C安装信号处理程序:#!/usr/bin/rubyexit_requested=falseKernel.trap("INT"){exit_requested=true}while!
为什么需要服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关,客户端只能在本地记录每个微服务的调用地址,当需要调用的微服务数量很多时,它需要了解每个服务的接口,这个工作量很大。有了网关之后,网关作为系统的唯一流量入口,封装内部系统的架构,所有请求都先经过网关,由网关将请求路由到合适的微服务。使用网关的好处1)简化客户端的工作。网关将微服务封装起来后,客户端只需同网关交互,而不必调用各个不同服务;(2)降低函数间的耦合度。一旦服务接口修改,只需修改网关的路由策略,不必修改每个调用该函数的客户端,从而减少了程序间的耦合性(3)解放开发
我发现python的细节自动完成很好RubyonRails有类似的方法描述吗? 最佳答案 有篇不错的文章"UsingVIMasacompleteRubyonRailsIDE"其中引用rails.vim.这似乎是RailsforVIM的实际标准。(不过,我还没有使用过它,但很快就会尝试。)这允许你做很多与Rails相关的任务,但对自动完成没有帮助。还有一篇"RubyAutocompleteinVim"(遗憾的是不再可用)这就是您要搜索的内容。我不知道,理解Rails的所有插件魔法和元编程的东西是否足够聪明。它至少在vim的配置中提到了
在Ruby中我有以下内容:#TrapInterruptstrap("INT")doputs"Shuttingdown..."exitend当我中断程序时,会打印以下内容(MacOSXLion):^CShuttingdown...有什么方法可以在Ruby中隐藏^C吗? 最佳答案 是否回显控制字符是您正在使用的tty的一个属性。stty-echoctl是禁用控制字符回显的Unix方法。如果您使用的是Unix-ish系统,您可以从Ruby脚本中运行此命令并获得相同的效果。 关于Ruby-在中断