草庐IT

linux - 硬件定时器中断在哪里?

coder 2023-06-17 原文

这是异常和中断表(我理解为 IDT) 摘自《英特尔架构软件开发人员手册》

使上下文切换成为可能的定时器中断在哪里? (用于多任务处理)

如果这是一个愚蠢的问题,请修正我的理解。 提前谢谢你

最佳答案

嗯,是的,如果我们谈论的是传统的 8254 PIT 定时器,它位于 IRQ0,即向量 32。但在现代机器上的 Linux 操作系统中,它通常不用作定时器。 [请注意,32 的向量分配确实非常随意。它是在对 8259 (PIC) 或 APIC 进行编程时设置的——但这不是一个糟糕的选择,因为 32 是保留向量之后的第一个向量。它肯定比混合硬件中断和异常向量要好,就像 DOS 那样——所以没有办法从 INTR 5(也是向量 13,因为 INT0 被映射)中分辨出一般保护错误(上表中的向量 13)向量 8,和 5 + 8 = 13)。从内存中看,INTR5 并没有被特别好地使用——比如 LPT2:(第二个并行端口)。但是不要将它们重叠仍然是一个好主意......因此,向量 20 到 31 的“保留”。

实际控制系统时序的 IRQ 很可能是本地 APIC 定时器,它的向量并不像原始 PC 那样固定在硬件中。

此外,随着“消息信号中断”的出现,完全有可能拥有(很多)超过 256 个中断向量。

我不同意“vector 0-19 are non-maskable interrupts”的说法。除了 NMI(向量 2)之外,它们都是异常(又名陷阱或故障)——也就是说,由系统中的某些错误条件驱动的事件——向量零是整数除以零的结果,向量 1 是一个“单步”指令中断[和其他一些“调试”陷阱,例如“写入与启用的调试寄存器匹配的任何地址”],向量 3 是“int3”指令(操作码 0xcc)的结果,向量 4 是执行“INTO”的结果(在溢出中是“o”,而不是在零中的 0)。当访问未标记为存在于页表中的一 block 内存时,使用向量 14。它们确实是“不可屏蔽的”,但除了少数异常(exception),它们是当时执行的指令的直接结果 - 因此它们与程序本身同步。

异常是“双重故障”异常和“机器检查故障”。

双重故障是处理器在处理另一个异常期间检测到故障 - 通常是因为操作系统做了一些愚蠢的事情,比如将堆栈设置为无效的地方,从而出现页面错误,尝试使用堆栈存储页面错误返回地址,但由于堆栈不可访问而失败。因此,双重故障处理程序往往被设置为“任务切换中断”,并加载一个新堆栈以确保双重故障可以继续。如果双重故障处理程序无法正常运行,处理器将出现“三次故障”。这通常意味着在 PC 平台上“重新启动”。双重故障通常是不可恢复的——处理程序将(尝试)提供一些关于发生了什么的信息,以及它是如何进入这种状态的,但是一旦完成,系统要么重新启动,要么等待有人来按下重置按钮。

机器检查故障是处理器检测到不可恢复的错误——例如不可恢复的内存错误或缓存奇偶校验错误等。这些通常也是不可恢复的,但不直接与正在执行的指令耦合,但更多的是不同事件的组合(内存内容变坏的地址的内存读取,或类似的)。

关于linux - 硬件定时器中断在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14481032/

有关linux - 硬件定时器中断在哪里?的更多相关文章

  1. ruby - ruby 乘法语句中星号中断语法前的空格 - 2

    在添加一些空格以使代码更具可读性时(与上面的代码对齐),我遇到了这个: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

  2. ruby - 在 ASP 页面上 Mechanize 中断 - 2

    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

  3. ruby - 可以正常中断的来自 Rake 的长时间运行的 shell 命令? - 2

    在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa

  4. ruby-on-rails - ActiveRecord::Associations::CollectionProxy 从哪里获取.each 实例方法? - 2

    假设我有模型Topics和Posts,其中Topichas_many:posts和Postbelongs_to:topic。此时我的数据库中已经有了一些东西。如果我进入Rails控制台并输入Topic.find(1).posts我相信我得到了一个CollectionProxy对象。=>#]>我可以对此调用.each以获得枚举器对象。=>#]:each>我对CollectionProxy如何处理.each感到困惑。我意识到它在某些时候是继承的,但我一直在阅读API文档,他们并没有说得很清楚CollectionProxy是从什么继承的,除非我遗漏了一些明显的东西。Thispage似乎并没有

  5. ruby-on-rails - prawnto 显示新页面时不会中断的表格 - 2

    我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码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.

  6. ruby - Ruby 性能中的计时器 - 2

    我正在寻找一个用ruby​​演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent

  7. ruby-on-rails - 闪存消息存储在哪里? - 2

    我以为它们存储在cookie中-但不,检查cookie没有任何结果。session也不存储它们。那么,我在哪里可以找到它们?我需要这个来直接设置它们(而不是通过flashhash)。 最佳答案 它们存储在inyoursessionstore.自rails2.0以来的默认设置是cookie存储,但请检查config/initializers/session_store.rb以检查您是否使用默认设置以外的东西。 关于ruby-on-rails-闪存消息存储在哪里?,我们在StackOverf

  8. ruby-on-rails - Ruby 如何知道在哪里可以找到所需的文件? - 2

    这里还有一个新手问题:require'tasks/rails'我在每个Rails项目的根路径中的Rakefile中看到了这一行。我猜这行用于要求vendor/rails/railties/lib/tasks/rails.rb加载所有rake任务:$VERBOSE=nil#LoadRailsrakefileextensionsDir["#{File.dirname(__FILE__)}/*.rake"].each{|ext|loadext}#LoadanycustomrakefileextensionsDir["#{RAILS_ROOT}/lib/tasks/**/*.rake"].so

  9. ruby-on-rails - Rubygems - 包在哪里下载? - 2

    当你安装一个新包时,例如,'geminstallfb-graph',文件下载到哪里了? 最佳答案 使用此命令查找特定gem的安装位置:gemwhich例如:gemwhichfb-graph 关于ruby-on-rails-Rubygems-包在哪里下载?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/13200065/

  10. ruby-on-rails - 在 Rails 中向 Integer 类添加方法的最佳位置在哪里? - 2

    在Rails中向整数类添加方法的最佳位置在哪里?我想添加一个to_meters和to_miles方法。 最佳答案 如果您决心使用数字(或整数等)类来进行单位转换,那么至少要在逻辑上做到这一点,并具有一些实际值(value)。首先,创建一个Unit类,用于存储单位类型(米、英尺、肘等)和创建时的值。然后向Numeric添加一堆方法,这些方法对应于单元可以具有的有效值:这些方法将返回一个单元对象,其类型记录为方法名称。Unit类将支持一组to_*方法,这些方法将转换为具有相应单位值的另一种单位类型。这样,您可以执行以下命令:>>x=47

随机推荐