sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/core-api/genericirqmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/zh_TW/core-api/genericirqmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/it_IT/core-api/genericirqmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/ja_JP/core-api/genericirqmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/ko_KR/core-api/genericirqmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/sp_SP/core-api/genericirqmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhT/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/core-api/genericirq.rsthKubh field_body)}(h&Documentation/core-api/genericirq.rst h]h)}(h%Documentation/core-api/genericirq.rsth]h%Documentation/core-api/genericirq.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh)}(h-司延腾 Yanteng Si h]h)}(h,司延腾 Yanteng Si h](h司延腾 Yanteng Si <}(hjhhhNhNubh reference)}(hsiyanteng@loongson.cnh]hsiyanteng@loongson.cn}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:siyanteng@loongson.cnuh1jhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h校译h]h校译}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hhhKubh)}(h*吴想成 Wu XiangCheng h]h)}(h)吴想成 Wu XiangCheng h](h吴想成 Wu XiangCheng <}(hjShhhNhNubj)}(hbobwxc@email.cnh]hbobwxc@email.cn}(hj[hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:bobwxc@email.cnuh1jhjSubh>}(hjShhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hjOubah}(h]h ]h"]h$]h&]uh1hhj>ubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhcomment)}(h4This data file has been placed in the public domain.h]h4This data file has been placed in the public domain.}hjsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jhhhhho/srv/docbuild/lib/venvs/build-kernel-docs/lib64/python3.9/site-packages/docutils/parsers/rst/include/isonum.txthKubj)}(hDerived from the Unicode character mappings available from . Processed by unicode2rstsubs.py, part of Docutils: .h]hDerived from the Unicode character mappings available from . Processed by unicode2rstsubs.py, part of Docutils: .}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhhhjhKubhsubstitution_definition)}(h*.. |amp| unicode:: U+00026 .. AMPERSANDh]h&}hjsbah}(h]h ]h"]ampah$]h&]uh1jhjhKhhhhubj)}(h+.. |apos| unicode:: U+00027 .. APOSTROPHEh]h'}hjsbah}(h]h ]h"]aposah$]h&]uh1jhjhKhhhhubj)}(h).. |ast| unicode:: U+0002A .. ASTERISKh]h*}hjsbah}(h]h ]h"]astah$]h&]uh1jhjhK hhhhubj)}(h+.. |brvbar| unicode:: U+000A6 .. BROKEN BARh]h¦}hjsbah}(h]h ]h"]brvbarah$]h&]uh1jhjhK hhhhubj)}(h0.. |bsol| unicode:: U+0005C .. REVERSE SOLIDUSh]h\}hjsbah}(h]h ]h"]bsolah$]h&]uh1jhjhK hhhhubj)}(h*.. |cent| unicode:: U+000A2 .. CENT SIGNh]h¢}hjsbah}(h]h ]h"]centah$]h&]uh1jhjhK hhhhubj)}(h&.. |colon| unicode:: U+0003A .. COLONh]h:}hjsbah}(h]h ]h"]colonah$]h&]uh1jhjhK hhhhubj)}(h&.. |comma| unicode:: U+0002C .. COMMAh]h,}hjsbah}(h]h ]h"]commaah$]h&]uh1jhjhKhhhhubj)}(h... |commat| unicode:: U+00040 .. COMMERCIAL ATh]h@}hj"sbah}(h]h ]h"]commatah$]h&]uh1jhjhKhhhhubj)}(h/.. |copy| unicode:: U+000A9 .. COPYRIGHT SIGNh]h©}hj1sbah}(h]h ]h"]copyah$]h&]uh1jhjhKhhhhubj)}(h... |curren| unicode:: U+000A4 .. CURRENCY SIGNh]h¤}hj@sbah}(h]h ]h"]currenah$]h&]uh1jhjhKhhhhubj)}(h0.. |darr| unicode:: U+02193 .. DOWNWARDS ARROWh]h↓}hjOsbah}(h]h ]h"]darrah$]h&]uh1jhjhKhhhhubj)}(h,.. |deg| unicode:: U+000B0 .. DEGREE SIGNh]h°}hj^sbah}(h]h ]h"]degah$]h&]uh1jhjhKhhhhubj)}(h... |divide| unicode:: U+000F7 .. DIVISION SIGNh]h÷}hjmsbah}(h]h ]h"]divideah$]h&]uh1jhjhKhhhhubj)}(h,.. |dollar| unicode:: U+00024 .. DOLLAR SIGNh]h$}hj|sbah}(h]h ]h"]dollarah$]h&]uh1jhjhKhhhhubj)}(h,.. |equals| unicode:: U+0003D .. EQUALS SIGNh]h=}hjsbah}(h]h ]h"]equalsah$]h&]uh1jhjhKhhhhubj)}(h1.. |excl| unicode:: U+00021 .. EXCLAMATION MARKh]h!}hjsbah}(h]h ]h"]exclah$]h&]uh1jhjhKhhhhubj)}(h9.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALFh]h½}hjsbah}(h]h ]h"]frac12ah$]h&]uh1jhjhKhhhhubj)}(h<.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTERh]h¼}hjsbah}(h]h ]h"]frac14ah$]h&]uh1jhjhKhhhhubj)}(h;.. |frac18| unicode:: U+0215B .. VULGAR FRACTION ONE EIGHTHh]h⅛}hjsbah}(h]h ]h"]frac18ah$]h&]uh1jhjhKhhhhubj)}(h?.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERSh]h¾}hjsbah}(h]h ]h"]frac34ah$]h&]uh1jhjhKhhhhubj)}(h>.. |frac38| unicode:: U+0215C .. VULGAR FRACTION THREE EIGHTHSh]h⅜}hjsbah}(h]h ]h"]frac38ah$]h&]uh1jhjhKhhhhubj)}(h=.. |frac58| unicode:: U+0215D .. VULGAR FRACTION FIVE EIGHTHSh]h⅝}hjsbah}(h]h ]h"]frac58ah$]h&]uh1jhjhKhhhhubj)}(h>.. |frac78| unicode:: U+0215E .. VULGAR FRACTION SEVEN EIGHTHSh]h⅞}hjsbah}(h]h ]h"]frac78ah$]h&]uh1jhjhKhhhhubj)}(h2.. |gt| unicode:: U+0003E .. GREATER-THAN SIGNh]h>}hjsbah}(h]h ]h"]gtah$]h&]uh1jhjhKhhhhubj)}(h9.. |half| unicode:: U+000BD .. VULGAR FRACTION ONE HALFh]h½}hj!sbah}(h]h ]h"]halfah$]h&]uh1jhjhK hhhhubj)}(h/.. |horbar| unicode:: U+02015 .. HORIZONTAL BARh]h―}hj0sbah}(h]h ]h"]horbarah$]h&]uh1jhjhK!hhhhubj)}(h'.. |hyphen| unicode:: U+02010 .. HYPHENh]h‐}hj?sbah}(h]h ]h"]hyphenah$]h&]uh1jhjhK"hhhhubj)}(h:.. |iexcl| unicode:: U+000A1 .. INVERTED EXCLAMATION MARKh]h¡}hjNsbah}(h]h ]h"]iexclah$]h&]uh1jhjhK#hhhhubj)}(h7.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARKh]h¿}hj]sbah}(h]h ]h"]iquestah$]h&]uh1jhjhK$hhhhubj)}(hJ.. |laquo| unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARKh]h«}hjlsbah}(h]h ]h"]laquoah$]h&]uh1jhjhK%hhhhubj)}(h0.. |larr| unicode:: U+02190 .. LEFTWARDS ARROWh]h←}hj{sbah}(h]h ]h"]larrah$]h&]uh1jhjhK&hhhhubj)}(h3.. |lcub| unicode:: U+0007B .. LEFT CURLY BRACKETh]h{}hjsbah}(h]h ]h"]lcubah$]h&]uh1jhjhK'hhhhubj)}(h;.. |ldquo| unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARKh]h“}hjsbah}(h]h ]h"]ldquoah$]h&]uh1jhjhK(hhhhubj)}(h).. |lowbar| unicode:: U+0005F .. LOW LINEh]h_}hjsbah}(h]h ]h"]lowbarah$]h&]uh1jhjhK)hhhhubj)}(h1.. |lpar| unicode:: U+00028 .. LEFT PARENTHESISh]h(}hjsbah}(h]h ]h"]lparah$]h&]uh1jhjhK*hhhhubj)}(h4.. |lsqb| unicode:: U+0005B .. LEFT SQUARE BRACKETh]h[}hjsbah}(h]h ]h"]lsqbah$]h&]uh1jhjhK+hhhhubj)}(h;.. |lsquo| unicode:: U+02018 .. LEFT SINGLE QUOTATION MARKh]h‘}hjsbah}(h]h ]h"]lsquoah$]h&]uh1jhjhK,hhhhubj)}(h/.. |lt| unicode:: U+0003C .. LESS-THAN SIGNh]h<}hjsbah}(h]h ]h"]ltah$]h&]uh1jhjhK-hhhhubj)}(h+.. |micro| unicode:: U+000B5 .. MICRO SIGNh]hµ}hjsbah}(h]h ]h"]microah$]h&]uh1jhjhK.hhhhubj)}(h+.. |middot| unicode:: U+000B7 .. MIDDLE DOTh]h·}hjsbah}(h]h ]h"]middotah$]h&]uh1jhjhK/hhhhubj)}(h/.. |nbsp| unicode:: U+000A0 .. NO-BREAK SPACEh]h }hjsbah}(h]h ]h"]nbspah$]h&]uh1jhjhK0hhhhubj)}(h).. |not| unicode:: U+000AC .. NOT SIGNh]h¬}hj sbah}(h]h ]h"]notah$]h&]uh1jhjhK1hhhhubj)}(h,.. |num| unicode:: U+00023 .. NUMBER SIGNh]h#}hj/sbah}(h]h ]h"]numah$]h&]uh1jhjhK2hhhhubj)}(h).. |ohm| unicode:: U+02126 .. OHM SIGNh]hΩ}hj>sbah}(h]h ]h"]ohmah$]h&]uh1jhjhK3hhhhubj)}(h;.. |ordf| unicode:: U+000AA .. FEMININE ORDINAL INDICATORh]hª}hjMsbah}(h]h ]h"]ordfah$]h&]uh1jhjhK4hhhhubj)}(h<.. |ordm| unicode:: U+000BA .. MASCULINE ORDINAL INDICATORh]hº}hj\sbah}(h]h ]h"]ordmah$]h&]uh1jhjhK5hhhhubj)}(h-.. |para| unicode:: U+000B6 .. PILCROW SIGNh]h¶}hjksbah}(h]h ]h"]paraah$]h&]uh1jhjhK6hhhhubj)}(h-.. |percnt| unicode:: U+00025 .. PERCENT SIGNh]h%}hjzsbah}(h]h ]h"]percntah$]h&]uh1jhjhK7hhhhubj)}(h*.. |period| unicode:: U+0002E .. FULL STOPh]h.}hjsbah}(h]h ]h"]periodah$]h&]uh1jhjhK8hhhhubj)}(h*.. |plus| unicode:: U+0002B .. PLUS SIGNh]h+}hjsbah}(h]h ]h"]plusah$]h&]uh1jhjhK9hhhhubj)}(h0.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGNh]h±}hjsbah}(h]h ]h"]plusmnah$]h&]uh1jhjhK:hhhhubj)}(h+.. |pound| unicode:: U+000A3 .. POUND SIGNh]h£}hjsbah}(h]h ]h"]poundah$]h&]uh1jhjhK;hhhhubj)}(h... |quest| unicode:: U+0003F .. QUESTION MARKh]h?}hjsbah}(h]h ]h"]questah$]h&]uh1jhjhKhhhhubj)}(h1.. |rarr| unicode:: U+02192 .. RIGHTWARDS ARROWh]h→}hjsbah}(h]h ]h"]rarrah$]h&]uh1jhjhK?hhhhubj)}(h4.. |rcub| unicode:: U+0007D .. RIGHT CURLY BRACKETh]h}}hjsbah}(h]h ]h"]rcubah$]h&]uh1jhjhK@hhhhubj)}(h<.. |rdquo| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARKh]h”}hjsbah}(h]h ]h"]rdquoah$]h&]uh1jhjhKAhhhhubj)}(h0.. |reg| unicode:: U+000AE .. REGISTERED SIGNh]h®}hjsbah}(h]h ]h"]regah$]h&]uh1jhjhKBhhhhubj)}(h2.. |rpar| unicode:: U+00029 .. RIGHT PARENTHESISh]h)}hj.sbah}(h]h ]h"]rparah$]h&]uh1jhjhKChhhhubj)}(h5.. |rsqb| unicode:: U+0005D .. RIGHT SQUARE BRACKETh]h]}hj=sbah}(h]h ]h"]rsqbah$]h&]uh1jhjhKDhhhhubj)}(h<.. |rsquo| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARKh]h’}hjLsbah}(h]h ]h"]rsquoah$]h&]uh1jhjhKEhhhhubj)}(h-.. |sect| unicode:: U+000A7 .. SECTION SIGNh]h§}hj[sbah}(h]h ]h"]sectah$]h&]uh1jhjhKFhhhhubj)}(h*.. |semi| unicode:: U+0003B .. SEMICOLONh]h;}hjjsbah}(h]h ]h"]semiah$]h&]uh1jhjhKGhhhhubj)}(h,.. |shy| unicode:: U+000AD .. SOFT HYPHENh]h­}hjysbah}(h]h ]h"]shyah$]h&]uh1jhjhKHhhhhubj)}(h(.. |sol| unicode:: U+0002F .. SOLIDUSh]h/}hjsbah}(h]h ]h"]solah$]h&]uh1jhjhKIhhhhubj)}(h,.. |sung| unicode:: U+0266A .. EIGHTH NOTEh]h♪}hjsbah}(h]h ]h"]sungah$]h&]uh1jhjhKJhhhhubj)}(h0.. |sup1| unicode:: U+000B9 .. SUPERSCRIPT ONEh]h¹}hjsbah}(h]h ]h"]sup1ah$]h&]uh1jhjhKKhhhhubj)}(h0.. |sup2| unicode:: U+000B2 .. SUPERSCRIPT TWOh]h²}hjsbah}(h]h ]h"]sup2ah$]h&]uh1jhjhKLhhhhubj)}(h2.. |sup3| unicode:: U+000B3 .. SUPERSCRIPT THREEh]h³}hjsbah}(h]h ]h"]sup3ah$]h&]uh1jhjhKMhhhhubj)}(h4.. |times| unicode:: U+000D7 .. MULTIPLICATION SIGNh]h×}hjsbah}(h]h ]h"]timesah$]h&]uh1jhjhKNhhhhubj)}(h0.. |trade| unicode:: U+02122 .. TRADE MARK SIGNh]h™}hjsbah}(h]h ]h"]tradeah$]h&]uh1jhjhKOhhhhubj)}(h... |uarr| unicode:: U+02191 .. UPWARDS ARROWh]h↑}hjsbah}(h]h ]h"]uarrah$]h&]uh1jhjhKPhhhhubj)}(h... |verbar| unicode:: U+0007C .. VERTICAL LINEh]h|}hjsbah}(h]h ]h"]verbarah$]h&]uh1jhjhKQhhhhubj)}(h*.. |yen| unicode:: U+000A5 .. YEN SIGN h]h¥}hjsbah}(h]h ]h"]yenah$]h&]uh1jhjhKRhhhhubhtarget)}(h.. _cn_core-api_genericirq:h]h}(h]h ]h"]h$]h&]refidcn-core-api-genericirquh1jhKphhhhhhubhsection)}(hhh](htitle)}(hLinux通用IRQ处理h]hLinux通用IRQ处理}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hj.hhhhhKubh)}(hhh](h)}(hhh](h)}(h版权h]h版权}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhhhKubh)}(h!|copy| 2005-2010: Thomas Gleixnerh]h)}(hjWh](h©}(hjYhhhNhNubh 2005-2010: Thomas Gleixner}(hjYhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjUubah}(h]h ]h"]h$]h&]uh1hhjDubeh}(h]h ]h"]h$]h&]uh1hhhhKhjAhhubh)}(hhh](h)}(h版权h]h版权}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhhhKubh)}(h|copy| 2005-2006: Ingo Molnar h]h)}(h|copy| 2005-2006: Ingo Molnarh](h©}(hjhhhNhNubh 2005-2006: Ingo Molnar}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjvubeh}(h]h ]h"]h$]h&]uh1hhhhKhjAhhubeh}(h]h ]h"]h$]h&]uh1hhj.hhhhhKubj-)}(hhh](j2)}(h简介h]h简介}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j1hjhhhhhKubh)}(hX通用中断处理层是为了给设备驱动程序提供一个完整的中断处理抽象(层)。它能够处 理所有不同类型的中断控制器硬件。设备驱动程序使用通用API函数来请求、启用、禁 用和释放中断。驱动程序不需要知道任何关于硬件处理中断的细节,所以它们可以在不同的 平台上使用而不需要修改代码。h]hX通用中断处理层是为了给设备驱动程序提供一个完整的中断处理抽象(层)。它能够处 理所有不同类型的中断控制器硬件。设备驱动程序使用通用API函数来请求、启用、禁 用和释放中断。驱动程序不需要知道任何关于硬件处理中断的细节,所以它们可以在不同的 平台上使用而不需要修改代码。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hv本文档提供给那些希望在通用IRQ处理层的帮助下实现基于其架构的中断子系统的开发 者。h]hv本文档提供给那些希望在通用IRQ处理层的帮助下实现基于其架构的中断子系统的开发 者。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjhhubeh}(h]id1ah ]h"]简介ah$]h&]uh1j,hj.hhhhhKubj-)}(hhh](j2)}(h 理论依据h]h 理论依据}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j1hjhhhhhK$ubh)}(hvLinux中中断处理的原始实现使用__do_IRQ()超级处理程序,它能够处理每种类型的 中断逻辑。h]hvLinux中中断处理的原始实现使用__do_IRQ()超级处理程序,它能够处理每种类型的 中断逻辑。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjhhubh)}(h最初,Russell King确定了不同类型的处理程序,以便为Linux 2.5/2.6中的ARM中 断处理程序实现建立一个相当通用的集合。他区分了以下几种类型:h]h最初,Russell King确定了不同类型的处理程序,以便为Linux 2.5/2.6中的ARM中 断处理程序实现建立一个相当通用的集合。他区分了以下几种类型:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hjhhubh bullet_list)}(hhh](h list_item)}(h电平触发型 h]h)}(h电平触发型h]h电平触发型}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h边沿触发型 h]h)}(h边沿触发型h]h边沿触发型}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hj0ubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h 简单型 h]h)}(h 简单型h]h 简单型}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjHubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]bullet-uh1jhhhK,hjhhubh)}(h4在实现过程中,我们发现了另一种类型:h]h4在实现过程中,我们发现了另一种类型:}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hjhhubj)}(hhh]j)}(h#响应EOI(end of interrupt)型 h]h)}(h"响应EOI(end of interrupt)型h]h"响应EOI(end of interrupt)型}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjyubah}(h]h ]h"]h$]h&]uh1jhjvhhhhhNubah}(h]h ]h"]h$]h&]jfjguh1jhhhK4hjhhubh)}(hF在SMP的__do_IRQ()超级处理程序中,还需定义一种类型:h]hF在SMP的__do_IRQ()超级处理程序中,还需定义一种类型:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjhhubj)}(hhh]j)}(h 每cpu型(针对CPU SMP) h]h)}(h 每cpu型(针对CPU SMP)h]h 每cpu型(针对CPU SMP)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK8hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubah}(h]h ]h"]h$]h&]jfjguh1jhhhK8hjhhubh)}(h这种高层IRQ处理程序的拆分实现使我们能够为每个特定的中断类型优化中断处理的流 程。这减少了该特定代码路径的复杂性,并允许对特定类型进行优化处理。h]h这种高层IRQ处理程序的拆分实现使我们能够为每个特定的中断类型优化中断处理的流 程。这减少了该特定代码路径的复杂性,并允许对特定类型进行优化处理。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjhhubh)}(hXu最初的通用IRQ实现使用hw_interrupt_type结构体及其 ``->ack`` ``->end`` 等回 调来区分超级处理程序中的流控制。这导致了流逻辑和低级硬件逻辑的混合,也导致了 不必要的代码重复:例如i386中的 ``ioapic_level_irq`` 和 ``ioapic_edge_irq`` , 这两个IRQ类型共享许多低级的细节,但有不同的流处理。h](h?最初的通用IRQ实现使用hw_interrupt_type结构体及其 }(hjhhhNhNubhliteral)}(h ``->ack``h]h->ack}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh }(hjhhhNhNubj)}(h ``->end``h]h->end}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 等回 调来区分超级处理程序中的流控制。这导致了流逻辑和低级硬件逻辑的混合,也导致了 不必要的代码重复:例如i386中的 }(hjhhhNhNubj)}(h``ioapic_level_irq``h]hioapic_level_irq}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 和 }(hjhhhNhNubj)}(h``ioapic_edge_irq``h]hioapic_edge_irq}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhP , 这两个IRQ类型共享许多低级的细节,但有不同的流处理。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK=hjhhubh)}(hN一个更自然的抽象是“irq流”和“芯片细节”的干净分离。h]hN一个更自然的抽象是“irq流”和“芯片细节”的干净分离。}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKBhjhhubh)}(hXL分析一些架构的IRQ子系统的实现可以发现,他们中的大多数可以使用一套通用的“irq 流”方法,只需要添加芯片级的特定代码。这种分离对于那些需要IRQ流本身而不需要芯 片细节的特定(子)架构也很有价值——以提供了一个更透明的IRQ子系统设计。h]hXL分析一些架构的IRQ子系统的实现可以发现,他们中的大多数可以使用一套通用的“irq 流”方法,只需要添加芯片级的特定代码。这种分离对于那些需要IRQ流本身而不需要芯 片细节的特定(子)架构也很有价值——以提供了一个更透明的IRQ子系统设计。}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhjhhubh)}(hX 每个中断描述符都被分配给它自己的高层流程处理程序,这通常是一个通用的实现。(这 种高层次的流程处理程序的实现也使得提供解复用处理程序变得简单,这可以在各种架 构的嵌入式平台上找到。)h]hX 每个中断描述符都被分配给它自己的高层流程处理程序,这通常是一个通用的实现。(这 种高层次的流程处理程序的实现也使得提供解复用处理程序变得简单,这可以在各种架 构的嵌入式平台上找到。)}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKHhjhhubh)}(h这种分离使得通用中断处理层更加灵活和可扩展。例如,一个(子)架构可以使用通用 的IRQ流实现“电平触发型”中断,并添加一个(子)架构特定的“边沿型”实现。h]h这种分离使得通用中断处理层更加灵活和可扩展。例如,一个(子)架构可以使用通用 的IRQ流实现“电平触发型”中断,并添加一个(子)架构特定的“边沿型”实现。}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKLhjhhubh)}(hXJ为了使向新模型的过渡更容易,并防止破坏现有实现,__do_IRQ()超级处理程序仍然 可用。这导致了一种暂时的双重性。随着时间的推移,新的模型应该在越来越多的架构中 被使用,因为它能使IRQ子系统更小更干净。它已经被废弃三年了,即将被删除。h]hXJ为了使向新模型的过渡更容易,并防止破坏现有实现,__do_IRQ()超级处理程序仍然 可用。这导致了一种暂时的双重性。随着时间的推移,新的模型应该在越来越多的架构中 被使用,因为它能使IRQ子系统更小更干净。它已经被废弃三年了,即将被删除。}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKOhjhhubeh}(h]id2ah ]h"] 理论依据ah$]h&]uh1j,hj.hhhhhK$ubj-)}(hhh](j2)}(h已知的缺陷和假设h]h已知的缺陷和假设}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hjzhhhhhKTubh)}(h没有(但愿如此)。h]h没有(但愿如此)。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKVhjzhhubeh}(h]id3ah ]h"]已知的缺陷和假设ah$]h&]uh1j,hj.hhhhhKTubj-)}(hhh](j2)}(h 抽象层h]h 抽象层}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j1hjhhhhhKYubh)}(h+中断代码中主要有三个抽象层次:h]h+中断代码中主要有三个抽象层次:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK[hjhhubhenumerated_list)}(hhh](j)}(h高级别的驱动API h]h)}(h高级别的驱动APIh]h高级别的驱动API}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK]hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h高级别的IRQ流处理器 h]h)}(h高级别的IRQ流处理器h]h高级别的IRQ流处理器}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK_hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h芯片级的硬件封装 h]h)}(h芯片级的硬件封装h]h芯片级的硬件封装}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKahjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1jhjhhhhhK]ubj-)}(hhh](j2)}(h中断控制流h]h中断控制流}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hj hhhhhKdubh)}(hXT每个中断都由一个中断描述符结构体irq_desc来描述。中断是由一个“无符号整型”的数值来 引用的,它在描述符结构体数组中选择相应的中断描述符结构体。描述符结构体包含状态 信息和指向中断流方法和中断芯片结构的指针,这些都是分配给这个中断的。h]hXT每个中断都由一个中断描述符结构体irq_desc来描述。中断是由一个“无符号整型”的数值来 引用的,它在描述符结构体数组中选择相应的中断描述符结构体。描述符结构体包含状态 信息和指向中断流方法和中断芯片结构的指针,这些都是分配给这个中断的。}(hj) hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKfhj hhubh)}(h每当中断触发时,低级架构代码通过调用desc->handle_irq()调用到通用中断代码中。 这个高层IRQ处理函数只使用由分配的芯片描述符结构体引用的desc->irq_data.chip 基元。h]h每当中断触发时,低级架构代码通过调用desc->handle_irq()调用到通用中断代码中。 这个高层IRQ处理函数只使用由分配的芯片描述符结构体引用的desc->irq_data.chip 基元。}(hj7 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKjhj hhubeh}(h]id5ah ]h"]中断控制流ah$]h&]uh1j,hjhhhhhKdubj-)}(hhh](j2)}(h高级驱动程序APIh]h高级驱动程序API}(hjP hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hjM hhhhhKoubh)}(h%高层驱动API由以下函数组成:h]h%高层驱动API由以下函数组成:}(hj^ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKqhjM hhubj)}(hhh](j)}(hrequest_irq() h]h)}(h request_irq()h]h request_irq()}(hjs hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKshjo ubah}(h]h ]h"]h$]h&]uh1jhjl hhhhhNubj)}(hrequest_threaded_irq() h]h)}(hrequest_threaded_irq()h]hrequest_threaded_irq()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKuhj ubah}(h]h ]h"]h$]h&]uh1jhjl hhhhhNubj)}(h free_irq() h]h)}(h free_irq()h]h free_irq()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKwhj ubah}(h]h ]h"]h$]h&]uh1jhjl hhhhhNubj)}(hdisable_irq() h]h)}(h disable_irq()h]h disable_irq()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKyhj ubah}(h]h ]h"]h$]h&]uh1jhjl hhhhhNubj)}(h enable_irq() h]h)}(h enable_irq()h]h enable_irq()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK{hj ubah}(h]h ]h"]h$]h&]uh1jhjl hhhhhNubj)}(h disable_irq_nosync() (SMP only) h]h)}(hdisable_irq_nosync() (SMP only)h]hdisable_irq_nosync() (SMP only)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK}hj ubah}(h]h ]h"]h$]h&]uh1jhjl hhhhhNubj)}(hsynchronize_irq() (SMP only) h]h)}(hsynchronize_irq() (SMP only)h]hsynchronize_irq() (SMP only)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhjl hhhhhNubj)}(hirq_set_irq_type() h]h)}(hirq_set_irq_type()h]hirq_set_irq_type()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhjl hhhhhNubj)}(hirq_set_irq_wake() h]h)}(hirq_set_irq_wake()h]hirq_set_irq_wake()}(hj3 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj/ ubah}(h]h ]h"]h$]h&]uh1jhjl hhhhhNubj)}(hirq_set_handler_data() h]h)}(hirq_set_handler_data()h]hirq_set_handler_data()}(hjK hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjG ubah}(h]h ]h"]h$]h&]uh1jhjl hhhhhNubj)}(hirq_set_chip() h]h)}(hirq_set_chip()h]hirq_set_chip()}(hjc hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj_ ubah}(h]h ]h"]h$]h&]uh1jhjl hhhhhNubj)}(hirq_set_chip_data() h]h)}(hirq_set_chip_data()h]hirq_set_chip_data()}(hj{ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjw ubah}(h]h ]h"]h$]h&]uh1jhjl hhhhhNubeh}(h]h ]h"]h$]h&]jfjguh1jhhhKshjM hhubh)}(h$详见自动生成的函数文档。h]h$详见自动生成的函数文档。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjM hhubh)}(h由于文档构建流程所限,中文文档中并没有引入自动生成的函数文档,所以请读者直接 阅读源码注释。h]h)}(h由于文档构建流程所限,中文文档中并没有引入自动生成的函数文档,所以请读者直接 阅读源码注释。h]h由于文档构建流程所限,中文文档中并没有引入自动生成的函数文档,所以请读者直接 阅读源码注释。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1hhjM hhhhhNubeh}(h]apiah ]h"]高级驱动程序apiah$]h&]uh1j,hjhhhhhKoubj-)}(hhh](j2)}(h!电平触发型IRQ流处理程序h]h!电平触发型IRQ流处理程序}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hj hhhhhKubh)}(h3通用层提供了一套预定义的irq-flow方法:h]h3通用层提供了一套预定义的irq-flow方法:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubj)}(hhh](j)}(hhandle_level_irq() h]h)}(hhandle_level_irq()h]hhandle_level_irq()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubj)}(hhandle_edge_irq() h]h)}(hhandle_edge_irq()h]hhandle_edge_irq()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubj)}(hhandle_fasteoi_irq() h]h)}(hhandle_fasteoi_irq()h]hhandle_fasteoi_irq()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubj)}(hhandle_simple_irq() h]h)}(hhandle_simple_irq()h]hhandle_simple_irq()}(hj1 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj- ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubj)}(hhandle_percpu_irq() h]h)}(hhandle_percpu_irq()h]hhandle_percpu_irq()}(hjI hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjE ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubj)}(hhandle_edge_eoi_irq() h]h)}(hhandle_edge_eoi_irq()h]hhandle_edge_eoi_irq()}(hja hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj] ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubj)}(hhandle_bad_irq() h]h)}(hhandle_bad_irq()h]hhandle_bad_irq()}(hjy hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhju ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubeh}(h]h ]h"]h$]h&]jfjguh1jhhhKhj hhubh)}(h中断流处理程序(无论是预定义的还是架构特定的)由架构在启动期间或设备初始化期间分配给 特定中断。h]h中断流处理程序(无论是预定义的还是架构特定的)由架构在启动期间或设备初始化期间分配给 特定中断。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubj-)}(hhh](j2)}(h默认流实现h]h默认流实现}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hj hhhhhKubj-)}(hhh](j2)}(h 辅助函数h]h 辅助函数}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hj hhhhhKubh)}(ht辅助函数调用芯片基元,并被默认流实现所使用。以下是实现的辅助函数(简化摘录)::h]hs辅助函数调用芯片基元,并被默认流实现所使用。以下是实现的辅助函数(简化摘录):}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh literal_block)}(hXdefault_enable(struct irq_data *data) { desc->irq_data.chip->irq_unmask(data); } default_disable(struct irq_data *data) { if (!delay_disable(data)) desc->irq_data.chip->irq_mask(data); } default_ack(struct irq_data *data) { chip->irq_ack(data); } default_mask_ack(struct irq_data *data) { if (chip->irq_mask_ack) { chip->irq_mask_ack(data); } else { chip->irq_mask(data); chip->irq_ack(data); } } noop(struct irq_data *data)) { }h]hXdefault_enable(struct irq_data *data) { desc->irq_data.chip->irq_unmask(data); } default_disable(struct irq_data *data) { if (!delay_disable(data)) desc->irq_data.chip->irq_mask(data); } default_ack(struct irq_data *data) { chip->irq_ack(data); } default_mask_ack(struct irq_data *data) { if (chip->irq_mask_ack) { chip->irq_mask_ack(data); } else { chip->irq_mask(data); chip->irq_ack(data); } } noop(struct irq_data *data)) { }}hj sbah}(h]h ]h"]h$]h&]jjuh1j hhhKhj hhubeh}(h]id7ah ]h"] 辅助函数ah$]h&]uh1j,hj hhhhhKubeh}(h]id6ah ]h"]默认流实现ah$]h&]uh1j,hj hhhhhKubj-)}(hhh](j2)}(h默认流处理程序的实现h]h默认流处理程序的实现}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hj hhhhhKubj-)}(hhh](j2)}(h电平触发型IRQ流处理器h]h电平触发型IRQ流处理器}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hj hhhhhKubh)}(hIhandle_level_irq为电平触发型的中断提供了一个通用实现。h]hIhandle_level_irq为电平触发型的中断提供了一个通用实现。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(h,实现的控制流如下(简化摘录)::h]h+实现的控制流如下(简化摘录):}(hj! hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubj )}(hgdesc->irq_data.chip->irq_mask_ack(); handle_irq_event(desc->action); desc->irq_data.chip->irq_unmask();h]hgdesc->irq_data.chip->irq_mask_ack(); handle_irq_event(desc->action); desc->irq_data.chip->irq_unmask();}hj/ sbah}(h]h ]h"]h$]h&]jjuh1j hhhKhj hhubeh}(h]id9ah ]h"]电平触发型irq流处理器ah$]h&]uh1j,hj hhhhhKubj-)}(hhh](j2)}(h!默认的需回应IRQ流处理器h]h!默认的需回应IRQ流处理器}(hjH hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hjE hhhhhKubh)}(hohandle_fasteoi_irq为中断提供了一个通用的实现,它只需要在处理程序的末端有一个EOI。h]hohandle_fasteoi_irq为中断提供了一个通用的实现,它只需要在处理程序的末端有一个EOI。}(hjV hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjE hhubh)}(h,实现的控制流如下(简化摘录)::h]h+实现的控制流如下(简化摘录):}(hjd hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjE hhubj )}(h?handle_irq_event(desc->action); desc->irq_data.chip->irq_eoi();h]h?handle_irq_event(desc->action); desc->irq_data.chip->irq_eoi();}hjr sbah}(h]h ]h"]h$]h&]jjuh1j hhhKhjE hhubeh}(h]id10ah ]h"]!默认的需回应irq流处理器ah$]h&]uh1j,hj hhhhhKubj-)}(hhh](j2)}(h'默认的边沿触发型IRQ流处理器h]h'默认的边沿触发型IRQ流处理器}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hj hhhhhKubh)}(hKhandle_edge_irq为边沿触发型的中断提供了一个通用的实现。h]hKhandle_edge_irq为边沿触发型的中断提供了一个通用的实现。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(h,实现的控制流如下(简化摘录)::h]h+实现的控制流如下(简化摘录):}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubj )}(hXzif (desc->status & running) { desc->irq_data.chip->irq_mask_ack(); desc->status |= pending | masked; return; } desc->irq_data.chip->irq_ack(); desc->status |= running; do { if (desc->status & masked) desc->irq_data.chip->irq_unmask(); desc->status &= ~pending; handle_irq_event(desc->action); } while (status & pending); desc->status &= ~running;h]hXzif (desc->status & running) { desc->irq_data.chip->irq_mask_ack(); desc->status |= pending | masked; return; } desc->irq_data.chip->irq_ack(); desc->status |= running; do { if (desc->status & masked) desc->irq_data.chip->irq_unmask(); desc->status &= ~pending; handle_irq_event(desc->action); } while (status & pending); desc->status &= ~running;}hj sbah}(h]h ]h"]h$]h&]jjuh1j hhhKhj hhubeh}(h]id11ah ]h"]'默认的边沿触发型irq流处理器ah$]h&]uh1j,hj hhhhhKubj-)}(hhh](j2)}(h!默认的简单型IRQ流处理器h]h!默认的简单型IRQ流处理器}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hj hhhhhMubh)}(hAhandle_simple_irq提供了一个简单型中断的通用实现。h]hAhandle_simple_irq提供了一个简单型中断的通用实现。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubh)}(hF简单型的流处理程序不调用任何处理程序/芯片基元。h]h)}(hj h]hF简单型的流处理程序不调用任何处理程序/芯片基元。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1hhj hhhhhNubh)}(h/实现的控制流程如下(简化摘录)::h]h.实现的控制流程如下(简化摘录):}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj hhubj )}(hhandle_irq_event(desc->action);h]hhandle_irq_event(desc->action);}hj sbah}(h]h ]h"]h$]h&]jjuh1j hhhM hj hhubeh}(h]id12ah ]h"]!默认的简单型irq流处理器ah$]h&]uh1j,hj hhhhhMubj-)}(hhh](j2)}(h!默认的每CPU型流处理程序h]h!默认的每CPU型流处理程序}(hj( hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hj% hhhhhMubh)}(hAhandle_percpu_irq为每CPU型中断提供一个通用的实现。h]hAhandle_percpu_irq为每CPU型中断提供一个通用的实现。}(hj6 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj% hhubh)}(h]每个CPU中断只在SMP上可用,该处理程序提供了一个没有锁的简化版本。h]h]每个CPU中断只在SMP上可用,该处理程序提供了一个没有锁的简化版本。}(hjD hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj% hhubh)}(h/以下是控制流的实现(简化摘录)::h]h.以下是控制流的实现(简化摘录):}(hjR hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj% hhubj )}(hif (desc->irq_data.chip->irq_ack) desc->irq_data.chip->irq_ack(); handle_irq_event(desc->action); if (desc->irq_data.chip->irq_eoi) desc->irq_data.chip->irq_eoi();h]hif (desc->irq_data.chip->irq_ack) desc->irq_data.chip->irq_ack(); handle_irq_event(desc->action); if (desc->irq_data.chip->irq_eoi) desc->irq_data.chip->irq_eoi();}hj` sbah}(h]h ]h"]h$]h&]jjuh1j hhhMhj% hhubeh}(h]cpuah ]h"]!默认的每cpu型流处理程序ah$]h&]uh1j,hj hhhhhMubj-)}(hhh](j2)}(hEOI边沿型IRQ流处理器h]hEOI边沿型IRQ流处理器}(hjy hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hjv hhhhhM ubh)}(hhandle_edge_eoi_irq提供了一个异常的边沿触发型处理程序,它只用于拯救powerpc/cell 上的一个严重失控的irq控制器。h]hhandle_edge_eoi_irq提供了一个异常的边沿触发型处理程序,它只用于拯救powerpc/cell 上的一个严重失控的irq控制器。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM"hjv hhubeh}(h]eoiirqah ]h"]eoi边沿型irq流处理器ah$]h&]uh1j,hj hhhhhM ubj-)}(hhh](j2)}(h坏的IRQ流处理器h]h坏的IRQ流处理器}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hj hhhhhM&ubh)}(hGhandle_bad_irq用于处理没有真正分配处理程序的假中断。h]hGhandle_bad_irq用于处理没有真正分配处理程序的假中断。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM(hj hhubeh}(h]id13ah ]h"]坏的irq流处理器ah$]h&]uh1j,hj hhhhhM&ubeh}(h]id8ah ]h"]默认流处理程序的实现ah$]h&]uh1j,hj hhhhhKubj-)}(hhh](j2)}(h特殊性和优化h]h特殊性和优化}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hj hhhhhM+ubh)}(h通用函数是为“干净”的架构和芯片设计的,它们没有平台特定的IRQ处理特殊性。如果一 个架构需要在“流”的层面上实现特殊性,那么它可以通过覆盖高层的IRQ-流处理程序来实 现。h]h通用函数是为“干净”的架构和芯片设计的,它们没有平台特定的IRQ处理特殊性。如果一 个架构需要在“流”的层面上实现特殊性,那么它可以通过覆盖高层的IRQ-流处理程序来实 现。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM-hj hhubeh}(h]id14ah ]h"]特殊性和优化ah$]h&]uh1j,hj hhhhhM+ubj-)}(hhh](j2)}(h延迟中断禁用h]h延迟中断禁用}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hj hhhhhM2ubh)}(hX,每个中断可选择的功能是由Russell King在ARM中断实现中引入的,当调用disable_irq() 时,不会在硬件层面上屏蔽中断。中断保持启用状态,而在中断事件发生时在流处理器中被 屏蔽。这可以防止在硬件上丢失边沿中断,因为硬件上不存储边沿中断事件,而中断在硬件 级被禁用。当一个中断在IRQ_DISABLED标志被设置时到达,那么该中断在硬件层面被屏蔽, IRQ_PENDING位被设置。当中断被enable_irq()重新启用时,将检查挂起位,如果它被设置, 中断将通过硬件或软件重发机制重新发送。(当你想使用延迟中断禁用功能,而你的硬件又不 能重新触发中断时,有必要启用CONFIG_HARDIRQS_SW_RESEND。) 延迟中断禁止功能是不可 配置的。h]hX,每个中断可选择的功能是由Russell King在ARM中断实现中引入的,当调用disable_irq() 时,不会在硬件层面上屏蔽中断。中断保持启用状态,而在中断事件发生时在流处理器中被 屏蔽。这可以防止在硬件上丢失边沿中断,因为硬件上不存储边沿中断事件,而中断在硬件 级被禁用。当一个中断在IRQ_DISABLED标志被设置时到达,那么该中断在硬件层面被屏蔽, IRQ_PENDING位被设置。当中断被enable_irq()重新启用时,将检查挂起位,如果它被设置, 中断将通过硬件或软件重发机制重新发送。(当你想使用延迟中断禁用功能,而你的硬件又不 能重新触发中断时,有必要启用CONFIG_HARDIRQS_SW_RESEND。) 延迟中断禁止功能是不可 配置的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM4hj hhubeh}(h]id15ah ]h"]延迟中断禁用ah$]h&]uh1j,hj hhhhhM2ubeh}(h]irqah ]h"]!电平触发型irq流处理程序ah$]h&]uh1j,hjhhhhhKubj-)}(hhh](j2)}(h芯片级硬件封装h]h芯片级硬件封装}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1j1hj"hhhhhM>ubh)}(h芯片级硬件描述符结构体 :c:type:`irq_chip` 包含了所有与芯片直接相关的功能,这些功 能可以被irq流实现所利用。h](h"芯片级硬件描述符结构体 }(hj3hhhNhNubh)}(h:c:type:`irq_chip`h]j)}(hj=h]hirq_chip}(hj?hhhNhNubah}(h]h ](xrefcc-typeeh"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]refdoc&translations/zh_CN/core-api/genericirq refdomainjJreftypetype refexplicitrefwarn reftargetirq_chipuh1hhhhM@hj3ubh_ 包含了所有与芯片直接相关的功能,这些功 能可以被irq流实现所利用。}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM@hj"hhubj)}(hhh](j)}(h ``irq_ack`` h]h)}(h ``irq_ack``h]j)}(hjqh]hirq_ack}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1hhhhMChjkubah}(h]h ]h"]h$]h&]uh1jhjhhhhhhNubj)}(h5``irq_mask_ack`` - 可选的,建议使用的性能 h]h)}(h4``irq_mask_ack`` - 可选的,建议使用的性能h](j)}(h``irq_mask_ack``h]h irq_mask_ack}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh$ - 可选的,建议使用的性能}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMEhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhhNubj)}(h ``irq_mask`` h]h)}(h ``irq_mask``h]j)}(hjh]hirq_mask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhhhMGhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhhNubj)}(h``irq_unmask`` h]h)}(h``irq_unmask``h]j)}(hjh]h irq_unmask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhhhMIhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhhNubj)}(h3``irq_eoi`` - 可选的,EOI流处理程序需要 h]h)}(h2``irq_eoi`` - 可选的,EOI流处理程序需要h](j)}(h ``irq_eoi``h]hirq_eoi}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh' - 可选的,EOI流处理程序需要}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhhNubj)}(h``irq_retrigger`` - 可选的 h]h)}(h``irq_retrigger`` - 可选的h](j)}(h``irq_retrigger``h]h irq_retrigger}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh - 可选的}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMMhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhhNubj)}(h``irq_set_type`` - 可选的 h]h)}(h``irq_set_type`` - 可选的h](j)}(h``irq_set_type``h]h irq_set_type}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubh - 可选的}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMOhj@ubah}(h]h ]h"]h$]h&]uh1jhjhhhhhhNubj)}(h``irq_set_wake`` - 可选的 h]h)}(h``irq_set_wake`` - 可选的h](j)}(h``irq_set_wake``h]h irq_set_wake}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubh - 可选的}(hjjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMQhjfubah}(h]h ]h"]h$]h&]uh1jhjhhhhhhNubeh}(h]h ]h"]h$]h&]jfjguh1jhhhMChj"hhubh)}(h这些基元的意思是严格意义上的:ack是指ACK,masking是指对IRQ线的屏蔽,等等。这取决 于流处理器如何使用这些基本的低级功能单元。h]h这些基元的意思是严格意义上的:ack是指ACK,masking是指对IRQ线的屏蔽,等等。这取决 于流处理器如何使用这些基本的低级功能单元。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMShj"hhubeh}(h]id16ah ]h"]芯片级硬件封装ah$]h&]uh1j,hjhhhhhM>ubeh}(h]id4ah ]h"] 抽象层ah$]h&]uh1j,hj.hhhhhKYubj-)}(hhh](j2)}(h__do_IRQ入口点h]h__do_IRQ入口点}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j1hjhhhhhMWubh)}(h[最初的实现__do_IRQ()是所有类型中断的替代入口点。它已经不存在了。h]h[最初的实现__do_IRQ()是所有类型中断的替代入口点。它已经不存在了。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMYhjhhubh)}(h这个处理程序被证明不适合所有的中断硬件,因此被重新实现了边沿/级别/简单/超高速中断 的拆分功能。这不仅是一个功能优化。它也缩短了中断的代码路径。h]h这个处理程序被证明不适合所有的中断硬件,因此被重新实现了边沿/级别/简单/超高速中断 的拆分功能。这不仅是一个功能优化。它也缩短了中断的代码路径。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM[hjhhubeh}(h]do-irqah ]h"]__do_irq入口点ah$]h&]uh1j,hj.hhhhhMWubj-)}(hhh](j2)}(h在SMP上的锁h]h在SMP上的锁}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j1hjhhhhhM_ubh)}(h芯片寄存器的锁定是由定义芯片基元的架构决定的。每个寄存器的结构通过desc->lock,由 通用层保护。h]h芯片寄存器的锁定是由定义芯片基元的架构决定的。每个寄存器的结构通过desc->lock,由 通用层保护。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMahjhhubeh}(h]smpah ]h"]在smp上的锁ah$]h&]uh1j,hj.hhhhhM_ubj-)}(hhh](j2)}(h通用中断芯片h]h通用中断芯片}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j1hj hhhhhMeubh)}(hX 为了避免复制相同的IRQ芯片实现,核心提供了一个可配置的通用中断芯片实现。开发者在自 己实现相同的功能之前,应该仔细检查通用芯片是否符合他们的需求,并以稍微不同的方式实 现相同的功能。h]hX 为了避免复制相同的IRQ芯片实现,核心提供了一个可配置的通用中断芯片实现。开发者在自 己实现相同的功能之前,应该仔细检查通用芯片是否符合他们的需求,并以稍微不同的方式实 现相同的功能。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMghj hhubh)}(h该API在以下内核代码中:h]h该API在以下内核代码中:}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMkhj hhubh)}(hkernel/irq/generic-chip.ch]hkernel/irq/generic-chip.c}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMmhj hhubeh}(h]id17ah ]h"]通用中断芯片ah$]h&]uh1j,hj.hhhhhMeubj-)}(hhh](j2)}(h 结构体h]h 结构体}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1j1hjOhhhhhMpubh)}(hW本章包含自动生成的结构体文档,这些结构体在通用IRQ层中使用。h]hW本章包含自动生成的结构体文档,这些结构体在通用IRQ层中使用。}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMrhjOhhubh)}(h该API在以下内核代码中:h]h该API在以下内核代码中:}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMthjOhhubh)}(hinclude/linux/irq.hh]hinclude/linux/irq.h}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMvhjOhhubh)}(hinclude/linux/interrupt.hh]hinclude/linux/interrupt.h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMxhjOhhubeh}(h]id18ah ]h"] 结构体ah$]h&]uh1j,hj.hhhhhMpubj-)}(hhh](j2)}(h提供的通用函数h]h提供的通用函数}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j1hjhhhhhM{ubh)}(hT这一章包含了自动生成的内核API函数的文档,这些函数被导出。h]hT这一章包含了自动生成的内核API函数的文档,这些函数被导出。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM}hjhhubh)}(h该API在以下内核代码中:h]h该API在以下内核代码中:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hkernel/irq/manage.ch]hkernel/irq/manage.c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hkernel/irq/chip.ch]hkernel/irq/chip.c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id19ah ]h"]提供的通用函数ah$]h&]uh1j,hj.hhhhhM{ubj-)}(hhh](j2)}(h提供的内部函数h]h提供的内部函数}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j1hjhhhhhMubh)}(h3本章包含自动生成的内部函数的文档。h]h3本章包含自动生成的内部函数的文档。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(h该API在以下内核代码中:h]h该API在以下内核代码中:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hkernel/irq/irqdesc.ch]hkernel/irq/irqdesc.c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hkernel/irq/handle.ch]hkernel/irq/handle.c}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hkernel/irq/chip.ch]hkernel/irq/chip.c}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]id20ah ]h"]提供的内部函数ah$]h&]uh1j,hj.hhhhhMubj-)}(hhh](j2)}(h鸣谢h]h鸣谢}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1j1hjPhhhhhMubh)}(h0感谢以下人士对本文档作出的贡献:h]h0感谢以下人士对本文档作出的贡献:}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjPhhubj)}(hhh](j)}(h#Thomas Gleixner tglx@linutronix.de h]h)}(h"Thomas Gleixner tglx@linutronix.deh](hThomas Gleixner }(hjvhhhNhNubj)}(htglx@linutronix.deh]htglx@linutronix.de}(hj~hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:tglx@linutronix.deuh1jhjvubeh}(h]h ]h"]h$]h&]uh1hhhhMhjrubah}(h]h ]h"]h$]h&]uh1jhjohhhhhNubj)}(hIngo Molnar mingo@elte.huh]h)}(hjh](h Ingo Molnar }(hjhhhNhNubj)}(h mingo@elte.huh]h mingo@elte.hu}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:mingo@elte.huuh1jhjubeh}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjohhhhhNubeh}(h]h ]h"]h$]h&]j j j hj j uh1jhjPhhhhhMubeh}(h]id21ah ]h"]鸣谢ah$]h&]uh1j,hj.hhhhhMubeh}(h](linuxirqj+eh ]h"](linux通用irq处理cn_core-api_genericirqeh$]h&]uh1j,hhhhhhhKexpect_referenced_by_name}jj sexpect_referenced_by_id}j+j subeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(j1N generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh، _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}(jjjjjjjjjjjjjjjjj.j"j=j1jLj@j[jOjjj^jyjmjj|jjjjjjjjjjjjjjjjjjjjj-j!j<j0jKj?jZjNjij]jxjljj{jjjjjjjjjjjjjjjjjjjjj,j j;j/jJj>jYjMjhj\jwjkjjzjjjjjjjjjjjjjjjjj jjjj+jj:j.jIj=jXjLjgj[jvjjjjyjjjjjjjjjjjjjjjjj jjjusubstitution_names}(ampjaposjastjbrvbarjbsoljcentjcolonjcommajcommatj.copyj=currenjLdarrj[degjjdividejydollarjequalsjexcljfrac12jfrac14jfrac18jfrac34jfrac38jfrac58jfrac78jgtjhalfj-horbarj<hyphenjKiexcljZiquestjilaquojxlarrjlcubjldquojlowbarjlparjlsqbjlsquojltjmicrojmiddotjnbspjnotj,numj;ohmjJordfjYordmjhparajwpercntjperiodjplusjplusmnjpoundjquestjquotjraquojrarrjrcubj rdquojregj+rparj:rsqbjIrsquojXsectjgsemijvshyjsoljsungjsup1jsup2jsup3jtimesjtradejuarrjverbarj yenjurefnames}refids}j+]j asnameids}(jj+jjjjjwjtjjjjjJ jG j j jjj j j j j j jB j? j j j j j" j js jp j j j j j j jjjjjjj jjLjIjjjjjMjJjju nametypes}(jjjjwjjjJ j jj j j jB j j j" js j j j jjjj jLjjjMjuh}(j+j.jj.jjjtjjjzjjjG j j jM jj j j j j j j j? j j jE j j j j jp j% j jv j j j j jj jj"jjjjjIj jjOjjjJjjjPu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}j KsRparse_messages]transform_messages]hsystem_message)}(hhh]h)}(hhh]h