x86システムの倖郚デバむスからの割り蟌み。 パヌト1.割り蟌みコントロヌラヌの進化

この蚘事では、x86システムの倖郚デバむスから割り蟌みを配信するメカニズムを怜蚎し、質問に答えおみたいず思いたす。





これらの質問のいずれかに察する回答を埗るこずに興味がある堎合、たたは単にx86システムでの割り蟌みコントロヌラヌの進化に粟通したい堎合は、catぞようこそ。



はじめに



私たちは皆、䞭断が䜕であるかを知っおいたす。 そうでない人のために、りィキペディアからの匕甚



割り蟌み英語の割り蟌み-゜フトりェアたたはハヌドりェアからの信号で、即時の泚意が必芁なむベントの発生に぀いおプロセッサに通知したす。 割り蟌みは、プロセッサによっお実行される珟圚のコヌドの割り蟌みを必芁ずする優先床の高いむベントの発生をプロセッサに通知したす。 プロセッサは、珟圚のアクティビティを䞀時停止し、状態を維持し、むベントに応答しお凊理する割り蟌みハンドラヌたたは割り蟌みハンドラヌず呌ばれる関数を実行するこずで応答したす。その埌、割り蟌みコヌドに制埡を戻したす。



割り蟌み信号の゜ヌスに応じお、それらは次のように分類されたす。



  • 非同期、たたは倖郚ハヌドりェアデバむス呚蟺機噚などから発生し、任意の瞬間に発生する可胜性がある倖郚ハヌドりェアむベントタむマヌ、ネットワヌクカヌドたたはディスクドラむブからの信号、キヌストロヌク、マりスの動き。 システムでこのような割り蟌みが発生したずいう事実は、割り蟌み芁求IRQずしお解釈されたす。デバむスは、OSからの泚意が必芁であるこずを報告したす。
  • マシンコヌドの実行時の特定の条件の違反の結果ずしおのプロセッサ自䜓の同期たたは内郚むベントれロ陀算たたはスタックオヌバヌフロヌ、無効なメモリアドレスたたは無効なオペレヌションコヌドぞのアクセス。
この蚘事では、倖郚IRQ割り蟌みに぀いお説明したす。



なぜ必芁なのですか ネットワヌクカヌドが到着したずきに、入力パケットを䜿甚しお䜕らかのアクションを実行するずしたす。 ネットワヌクカヌドに垞に「新しいパケットがありたすか」ず尋ねないようにするために、これにプロセッサリ゜ヌスを無駄にしないために、IRQ割り蟌みを䜿甚できたす。 デバむスの割り蟌みラむンはプロセッサのINTRラむンに接続されおおり、パケットを受信するず、ネットワヌクカヌドはこのラむンを「プル」したす。 プロセッサは、それに関する情報があるこずを理解し、パケットを読み取りたす。



しかし、デバむスがたくさんある堎合はどうでしょうか プロセッサレッグのすべおの倖郚デバむスを十分に入手するこずはできたせん。







この問題を解決するために、圌らはチップを思い぀いた-割り蟌みコントロヌラ。



写真



 wiki / osdev 



最初はIntel 8259 PICチップでした。 8぀の入力ラむンIRQ0〜7、および1぀の出力がコントロヌラヌをプロセッサヌのINTRラむンに接続したす。 デバむスからの割り蟌みが発生するず、8259はINTRラむンをプルし、プロセッサは䞀郚のデバむスが割り蟌みを通知し、PICをポヌリングしおどのIRQxレッグが割り蟌みを匕き起こしたかを認識したす。 このポヌリングには远加の遅延がありたすが、割り蟌みラむンの数は8に増えたす。







しかし、8行はすぐに小さくなり、その数を増やすために、カスケヌド接続された2぀の8259コントロヌラヌマスタヌずスレヌブを䜿甚し始めたしたデュアルPIC。



IRQ 0〜7は最初のIntel 8259 PICマスタヌによっお凊理され、IRQ 8〜15は2番目の8259 PICスレヌブによっお凊理されたす。 マスタヌのみが割り蟌みの発生を通知したす。 ラむン8〜15で割り蟌みが発生するず、2番目のPICスレヌブがIRQ 2を介しおマスタヌに割り蟌みを通知し、マスタヌがCPUに通知したす。 このカスケヌド割り蟌みは、16行のうちの1぀を䜿甚したすが、最終的にはデバむスに15の䜿甚可胜な割り蟌みを提䟛したす。







回路はそれ自䜓を確立したした、そしお、これは圌らが珟圚PICProgramm Interrupt Controllerに぀いお話すずき、圌らが意味するこずです。 その埌、8259コントロヌラヌはいく぀かの改善を受け、8259Aずしお知られるようになり、この回路はチップセットに組み蟌たれたした。 倖郚デバむスを接続するためのメむンバスがISAバスであった時代には、このようなシステム党䜓で十分でした。 ISA割り蟌みは共有されないため、競合を回避するために、異なるデバむスが同じIRQラむンに接続しないようにする必芁がありたした。



通垞、デバむスの割り蟌みのレむアりトは倚かれ少なかれ暙準でした



䟋 ここから匕甚 

IRQ 0-システムタむマヌ

IRQ 1-キヌボヌドコントロヌラヌ

IRQ 2-カスケヌドスレヌブコントロヌラヌからの割り蟌み

IRQ 3-シリアルポヌトCOM2

IRQ 4-シリアルポヌトCOM1

IRQ 5-パラレルポヌト2および3たたはサりンドカヌド

IRQ 6-フロッピヌコントロヌラ

IRQ 7-パラレルポヌト1

IRQ 8-RTCタむマヌ

IRQ 9-ACPI

IRQ 10-オヌプン/ SCSI / NIC

IRQ 11-オヌプン/ SCSI / NIC

IRQ 12-マりスコントロヌラヌ

IRQ 13-数孊コプロセッサヌ

IRQ 14-ATAチャネル1

IRQ 15-ATAチャネル2



8259超小型回路の構成ず䜜業は、I / Oポヌトを介しお実行されたす。

チップ 登録する I / Oポヌト
マスタヌ写真 コマンド 0x0020
マスタヌ写真 デヌタ 0x0021
スレヌブ写真 コマンド 0x00A0
スレヌブ写真 デヌタ 0x00A1


→8259Aのドキュメントはこちらにありたす。



ISAバスはPCIバスに眮き換えられたした。 デバむスの数は明らかに15を超え始めたした。たた、静的ISAバスずは異なり、この堎合、デバむスはシステムに動的に远加できたす。 しかし幞いなこずに、このバスでは割り蟌みを共有できたす぀たり、耇数のデバむスを1぀のIRQラむンに接続できたす。 その結果、IRQラむンの䞍足の問題を解決するために、圌らはすべおのPCIデバむスからの割り蟌みをPIRQラむンプログラム可胜な割り蟌み芁求にグルヌプ化するこずにしたした。



PICコントロヌラヌに4本の割り蟌みラむンず20個のPCIデバむスがあるずしたしょう。 PIRQxラむンごずに5぀のデバむスの割り蟌みを組み合わせ、PIRQxラむンをコントロヌラヌに接続したす。 PIRQxラむンで割り蟌みが発生した堎合、プロセッサはこのラむンに接続されおいるすべおのデバむスに問い合わせお、割り蟌みの原因を把握する必芁がありたすが、䞀般的にはこれで問題が解決したす。 PIRQラむンでPCI割り蟌みラむンをバむンドするデバむスは、倚くの堎合PIRルヌタヌず呌ばれたす。



この方法では、ISA割り蟌みが既に開始されおいるIRQxラむンにPIRQxラむンが接続されおいないこず競合が発生するため、およびPIRQxラむンのバランスが取れおいるこずを確認する必芁がありたす同じPIRQラむンに接続したデバむスが倚いほど、必芁なデバむスが倚いためこれらのデバむスのどれが割り蟌みを匕き起こしたかを理解するためにプロセッサに問い合わせたす。







泚 PCIデバむス-> PIRマッピングは、実際にはやや耇雑であるため、芁玄で瀺されおいたす。 実際には、各PCIデバむスには4぀の割り蟌みラむンINTA、INTB、INTC、INTDがありたす。 各PCIデバむスには最倧8぀の機胜があり、各機胜にはすでに1぀のINTx割り蟌みがありたす。 デバむスの各機胜が取埗するINTxの皮類は、チップセットの構成によっお決たりたす。



本質的に、関数は独立した論理ブロックです。 たずえば、1぀のPCIデバむスには、Smbusコントロヌラヌ機胜、SATAコントロヌラヌ機胜、LPCブリッゞ機胜がありたす。 OS偎から芋るず、各機胜は独自のPCI Config構成スペヌスを持぀個別のデバむスです。



BIOSは、$ PIRテヌブルを䜿甚し、各機胜のPCI構成スペヌスの3ChINT_LN割り蟌みラむンR / Wおよび3DhINT_PN割り蟌みピンROレゞスタを埋めるこずにより、PIC䞊の割り蟌みルヌティングに関する情報をBIOSに枡したした。 $ PIRテヌブルの仕様は、以前はMicrosoftのWebサむトにありたしたが、珟圚はありたせん。 $ PIRテヌブルの行の内容は、 PCI BIOS仕様 [4.2.2。 PCI割り蟌みルヌティングオプションを取埗する]たたはこちらをお読みください



アピック



 wiki 、 osdev 



以前の方法は、マルチプロセッサシステムが登堎するたで機胜したした。 実際、そのデバむスでは、PICは1぀のメむンプロセッサのみに割り蟌みを送信できたす。 しかし、割り蟌み凊理からのプロセッサの負荷のバランスを取りたいです。 この問題の解決策は、新しいむンタヌフェむスAPICアドバンストPICでした。



各プロセッサに察しお、特別なLAPICコントロヌラヌロヌカルAPICが远加され、 I / O APICコントロヌラヌがデバむスからの割り蟌みをルヌティングするために远加されたす。 これらのコントロヌラヌはすべお、APICず呌ばれる共通バスで結合されおいたす新しいシステムは珟圚、暙準システムバスを介しお接続されおいたす。



デバむスからの割り蟌みがI / O APICピンに到着するず、コントロヌラヌは割り蟌みをいずれかのプロセッサのLAPICにルヌティングしたす。 I / O APICの存圚により、プロセッサ間の倖郚デバむスからの割り蟌みの分散のバランスをずるこずができたす。



最初のAPICチップは82489DXで 、LAPICずI / O APICを組み合わせた別個のチップでした。 2぀のプロセッサのシステムを䜜成するには、3぀のそのような超小型回路が必芁でした。 2はLAPICずしお機胜し、1぀はI / O APICずしお機胜したす。 その埌、LAPIC機胜がプロセッサに盎接組み蟌たれ、I / O APIC機胜が82093AAチップに組み蟌たれたした。



I / O APIC 82093AAには24個の入力ピンが含たれおおり、APICアヌキテクチャは最倧16個のCPUをサポヌトできたす。 叀いシステムずの互換性を維持するために、0〜15の割り蟌みが叀いISA割り蟌みに割り圓おられたした。 そしお、PCIデバむスからの割り蟌みがIRQ行16-23に衚瀺され始めたした。 これで、ISAおよびPCIデバむスからの割り蟌みの競合を考えないこずが可胜になりたした。 たた、空き割り蟌みラむンの数が増えたこずにより、PIRQxラむンの数を増やすこずも可胜になりたした。







I / O APICおよびLAPICプログラミングはMMIOを介しお行われたす。 LAPICレゞスタは通垞0xFEE00000にあり、I / O APICレゞスタは0xFE00000にありたす。 原則ずしお、これらのアドレスはすべお再構成できたす。



PICの堎合のように、最初は個々のチップが埌でチップセットの䞀郚になりたした。



将来、APICアヌキテクチャは近代化され、新しいバヌゞョンはxAPICx-拡匵ず呌ばれたした。 以前のバヌゞョンずの䞋䜍互換性を保持したした。 システムで䜿甚可胜なCPUの数は256に増加したした。



アヌキテクチャ開発の次のラりンドはx2APICず呌ばれおいたした 。 システムで䜿甚可胜なCPUの数は2 ^ 32に増加したした。 コントロヌラは、xAPIC互換モヌド、たたはLAPICプログラミングがMMIOではなくMSRレゞスタより高速で実行される新しいx2APICモヌドで動䜜できたす。 このリンクから刀断するず、このモヌドが機胜するにはIOMMUサポヌトが必芁です。



システムには耇数のI / O APICコントロヌラヌがある堎合があるこずに泚意しおください。 たずえば、1぀はサりスブリッゞの24の䞭断、もう1぀は北の32の䞭断です。 I / Oのコンテキストでは、APIC割り蟌みはしばしばGSIグロヌバルシステム割り蟌みず呌ばれたす。 そのため、このようなシステムではGSI 0-55になりたす。



CPUに組み蟌みLAPICがあり、CPUIDのビットフラグでどのアヌキテクチャを理解できるか。

システムがLAPICおよびI / O APICを怜出するためには、BIOSはMPtable叀い方法たたはACPIテヌブルこの堎合はMADTのいずれかを介しおシステムに関する情報を提䟛する必芁がありたす。 䞀般的な情報に加えお、MPtableずACPI今回はDSDTテヌブルにありたすの䞡方に、割り蟌みルヌティングに関する情報、぀たりどのデバむスがどの割り蟌みラむンにあるかに関する情報$ PIRテヌブルのアナログを含める必芁がありたす。



公匏仕様の MPTableテヌブルに぀いお読むこずができたす。 以前は、仕様はむンテルのWebサむトにありたしたが、珟圚はアヌカむブでのみ芋぀けるこずができたす。 ACPI仕様は、珟圚UEFI Webサむト珟圚のバヌゞョン6.2 にありたす。 ACPIを䜿甚するず、$ PIRテヌブルを䜿甚する代わりにAPICを䜿甚しないシステムの割り蟌みルヌティングを指定できるこずに泚意しおください。



Msi



 wiki 



APICを䜿甚した以前のバヌゞョンは良奜ですが、欠陥がないわけではありたせん。 これらのデバむス割り蟌みラむンはすべお、回路を耇雑にし、゚ラヌの可胜性を高めたす。 PCIバスはPCI゚クスプレスに眮き換えられ、割り蟌みラむンは単に削陀されるこずが決定されたした。 互換性を維持するために、割り蟌み信号INTxは特定の皮類のメッセヌゞによっお゚ミュレヌトされたす。 このスキヌムでは、以前はワむダの物理的な接続によっお行われおいた割り蟌みラむンの論理的な远加が、PCIブリッゞの肩にかかっおいたした。 ただし、レガシヌINTx割り蟌みサポヌトは、PCIバスずの䞋䜍互換性をサポヌトするだけです。 実際、PCI゚クスプレスは、割り蟌みメッセヌゞを配信する新しい方法-MSIMessage Signaled Interruptsを提案しおいたす。 この方法では、デバむスは割り蟌みを通知するために、プロセッサLAPIC甚に予玄されおいるMMIO゚リアに曞き蟌みたす。







以前は、1぀のPCIデバむス぀たり、そのすべおの機胜に割り圓おられた割り蟌みは4぀だけでしたが、珟圚では最倧32の割り蟌みに察応できるようになりたした。



MSIの堎合、回線の共有はなく、各割り蟌みはそのデバむスに察応したす。



MSI割り蟌みは別の問題も解決したす。 デバむスがメモリ曞き蟌みトランザクションを実行し、割り蟌みを通じおその完了を報告したいずしたす。 ただし、転送プロセス䞭にバス䞊で曞き蟌みトランザクションが遅延する可胜性がありデバむスはたったく認識したせん、割り蟌み信号はプロセッサの前に早く到着したす。 したがっお、CPUは匕き続き無効なデヌタを読み取りたす。 MSIが䜿甚される堎合、MSIに関する情報はデヌタず同様に送信され、単に早く来るこずができたせん。



MSI割り蟌みはLAPICなしでは機胜したせんが、MSIを䜿甚するずI / O APIC蚭蚈の簡玠化に眮き換えられるこずに泚意しおください。



その埌、このメ゜ッドはMSI-X拡匵を受け取りたした。 これで、各デバむスは最倧2048の割り蟌みを持぀こずができたす。 たた、実行するプロセッサ䞊の割り蟌みごずに個別に瀺すこずが可胜になりたした。 これは、ネットワヌクカヌドなどの負荷の倧きいデバむスに非垞に圹立ちたす。



MSIをサポヌトするために远加のBIOSテヌブルは必芁ありたせん。 ただし、デバむスはPCI Configの機胜の1぀でMSIサポヌトを報告する必芁があり、デバむスドラむバヌはMSIの操䜜をサポヌトする必芁がありたす。



おわりに



この蚘事では、割り蟌みコントロヌラヌの進化を調査し、x86システムの倖郚デバむスからの割り蟌みの配信に関する䞀般的な理論情報を受け取りたした。



次のパヌトでは、説明した各コントロヌラヌを実際にLinuxで䜿甚する方法を芋おいきたす。



参照






All Articles