私のひらめき日記スマートフォン用の表示で見る私のひらめき日記ようこそ2019-03-20xv6の場合のExceptionとInterruptの挙動ExceptionとInterruptの挙動linux2.6.11の場合のExceptionとInterruptの挙動をまとめようと思って、xv6との比較を書いていたが分量が多くなりすぎたので、簡単にxv6ではException、Interruptをどう処理しているのかをまとめる。xv6向けのinterruptの解説で、かなりわかりやすい。本記事ではバージョンの断りが特に無ければ、linux2.6.11についての言及とする。Faultなどのvector0~31までに割り当てられている。deviceが起こす。vector32~255まで割り当てることができる。interrupt)もinterruptに分類される。Interruptが生じたときの切り替え(linux2.6の場合、同じプロセス内で完結するが、Interruptの処理のstackが異なる。Interruptの処理中にInterruptが重なるのも許す。interruptやexceptionを識別するための番号1。0~31まではreserved(systemのinterrupt)のためなので。irq_desc_rで定義されている。Routine)が呼び出される。Descriptorは存在しない。外部のdeviceから来たInterrupt達をCPUに伝達するためのcontroller。"Programmable"なので、register(memory上のaddressに配置されてる場合2もある。Controller。8つのinterruptまで受容できる。PICの後進で、multiprocessorに対応するためのAPIC。APICと違い、CPUの搭載数に依存しない。(random|特定)のCPUに指定のinterruptの処理をお願いしたりできる。APICでinterruptがどのCPUに振り分ける(redirect)べきかを決める表。CPU(+その他オプション)を対応付ける。xv6では、ioapicenableでtableの中身を設定できる。linux2.6ではset_ioapic_affinity(=set_ioapic_affinity_irq)でCPUの振り分けを変更できる。APICとセットで使われる。APICに振り分けられる。LAPICとも言ったりする。255はuser-definedのinterruptなので)。APICにあるregister。Interruptの終わりを知らせるレジスタ。deviceから来たInterruptを各CPUに均等に振り分けたりできる。あるCPUから他のCPU(broadcastも含め)に向かってやり取りするためのInterruptのこと。APICがdisableのときに用いられる。interruptの受取先。APICがdisableのときに用いられる。interruptの受取先。Descriptorというentryが格納された配列。Interruptの番号が表のindexに対応してdispatchされる。addressを登録。interrupt.用語が山のようにあるが、次の節以降で断りなく各種用語を使っていくので、適宜参照してください。APICにあるregisterであって、IDTとは関係がない。10.1を見れば雰囲気がよく分かると思う。ExceptionとInterruptの挙動xv6のExceptionやInterruptの処理を追っていく。初期化InterruptやExceptionが起こる時のために、IDTのentryにcallbackが呼ばれるように設定できる。Tableに書き込む。関数のlapicinitで。