SlideShare uma empresa Scribd logo
1 de 39
@syuu1228
資料
 Software Developers Manual
  http://download.intel.com/products/proce
  ssor/manual/325462.pdf
 ICH10 Datasheet
  http://www.intel.com/assets/pdf/datashe
  et/319973.pdf
おさらい
 このあたりは「はじめて読む486」を読
  んでれば分かってるはず
 わかってない人がこの場にいるとも思え
  ないんだけれども…
割り込みとは
   現在CPU上で実行しているプログラムを停止
    して別の処理を実行する為にCPUが持つ機能
     UNIX上のアプリケーションにおける「シグナル」に
     近い概念
   二種類ある
     ハードウェア割り込み
      ○ ハードウェアからCPUへ「キーボード押されたよ」な
        どのメッセージを通知するのに使う
      ○ 単に「割り込み」と呼ばれる事もある
     ソフトウェア割り込み
      ○ ソフトウェアから割り込みを起こせる
      ○ モード切替に利用される→システムコールに使う
ハードウェア割り込みの例
   ATAコントローラ
     HDDへのread/writeリクエストの完了通知
   シリアルポート・NIC
     受信通知
     送信完了通知
   タイマー
     一定期間毎に割り込み
     指定期間後に割り込み
ATA受信割り込みの例
1.   ユーザプログラムがファイルに対して
     writeシステムコールを実行
2.   ファイルシステムがバッファキャッシュ
     へ書き込み(ダーティフラグON)
3.   バッファキャッシュがHDDへライトバッ
     ク
4.   ATAドライバがATAコントローラへ書き込
     み要求を送信
5.   書き込みが終了したらバッファキャッ
     シュのダーティフラグをクリア
書き込みが終了したら?
割り込みを使わない場合
   ATAコントローラのステータスレジスタを確
    認し続ければ完了したかどうか分かる
     send_write_request(buffer);
     while(read_ata_status() &
             ATA_STATUS_BUSY)
             ;
     buffer.is_dirty = 0;
   busy waitになってしまう→CPUの無駄
書き込みが終了したら?
割り込みを使う場合
   送信完了時の処理は、割り込み着信時に実行すれ
    ばいい
    書き込み処理:
      send_write_request(buffer);
      sleep(buffer);
    割り込みハンドラ:
      buffer = find_buffer(ata_reg);
      buffer.is_dirty = 0;
      wakeup(buffer);
 busy waitしていない分のCPU時間を別の処
  理(別のプロセスを実行など)にまわせる
 sleep()/wakeup()で待ち合わせ
割り込みハンドラ
 割り込みを受けた時にCPUが実行するプロ
  グラム(関数呼び出しを伴わない関数のよ
  うなもの)
 割り込みハンドラ実行時にCPUがレジスタ
  の状態をスタックへ退避
 ハードウェア割り込みの場合は、デバイス
  のレジスタを読んで割り込みの処理に応じ
  た最小限の処理を実行
 割り込みハンドラから終了用の命令を実行
  して、スタックから割り込み前の状態へ復
  帰
プリエンプティブマルチタスク
と割り込み
 プリエンプティブマルチタスク:
  カーネルがプロセスへのCPUの割り当
  て時間を管理、タイマーを使ってアプリ
  ケーションを一定時間毎に切り替え
 プロセスが無限ループなどに陥りカーネ
  ルへ制御を渡さない場合でもタイマー割
  り込みにより中断され、割り当て時間を
  使い切ったら他のプロセスへ切り替えら
  れる
 割り込みがないと実現出来ない
例外
   割り込みとは別の概念だが、実装上の共
    通点は多いためx86では共通の仕組みで
    取り扱われている
     アプリケーション上の例外とほぼ意味は同
    じだが、CPU上の機能
   例外の例:
    ゼロ除算、無効な命令、ページフォール
    ト、一般保護例外、ブレークポイント
割り込み/例外ベクタ
   0-255のベクタ番号が割り込みと例外に
    割り当てられる
     例外は要因毎に0-19の固定された値
     ソフト割り込みは0-255へ割り込み可
     ハードウェア割り込みはLAPIC経由の場合
     16-255へ割り込み可
   OSはIDT(Interrupt Descriptor Table)
    を作成し、CPUへアドレスを設定
IDT(Interrupt Descriptor
Table)とIDTR
 各ベクタの割り込みハンドラの情報を持
  つGate Descriptorが並んでいるメモリ上
  のテーブル
 テーブルの先頭アドレスとLimit値
  (テーブルのサイズ、255未満のGate数
  に対応)をCPUのIDTRに書き込む事に
  より設定(IDTRを設定しない限り、
  CPUは割り込み時に何をしたらいいか
  分からない)
Gate Descriptor
   前述の「割込みハンドラ」のアドレスを持つ
    構造体
   単なる関数へのポインタではなくて、セグメ
    ントの設定とか権限(Ring)とか16 bit/32 bit
    のモード選択とか、幾つかのパラメータを含
    む
   Task gate, Interrupt gate, Trap gateの三種類あ
    る
     Task gateはHWのマルチタスク機能でハンドリング
      する方法で今は使われていない
     Interrupt gateとTrap gateは普通に割り込みハンドラ
      へジャンプする方法
      EFLAGS.IFフラグをクリアするか否かが違い
IDT,IDTR,Gate descriptorの関
係
                    IDTR register
47                         16 15            0

       Base address                 Limit




              IDT

     Gate for interrupt 255
              …

      Gate for interrupt 3
      Gate for interrupt 2
      Gate for interrupt 1                            Interrupt Gate
                                                   DPL rese segment
      Gate for interrupt 0           offset 31..16                     offset 15..0
                                                    /P rved selector
xv6のIDT周りを見てみる
   main.c:main()
     tvinit(); 割り込みベクタの設定
     mpmain();
      ○ idtinit(); IDTRの設定
   trap.c:tvinit()
     for(0..255) SETGATE(idt[i] … vectors[i] …)
      idt[i]にvectors[i]を割り込みハンドラとしたgate
      descriptorを設定
     システムコールだけDPL_USERに
   trap.c:idtinit()
     x86.h:lidt()
      ○ asm volatile(“lidt (%0)” :: “r” (pd)); LIDT命令でidtのアド
        レスを設定
xv6の割り込み・例外ハンド
ラ
   vectors.pl→vectors.S
     vectorsはvector0..vector255を指すポインタが入っている
      テーブルで、vectorNはalltrapsを呼んでいる
   trapasm.S
       全レジスタpush
       pushl %esp
       call trap
       全レジスタpop
       iret (割り込みからの復帰)
   trap.c:trap()
     trapasm.Sから引数として渡されたスタックポインタを構
      造体として参照
     trapnoがシステムコールの場合・タイマ/IDE/キーボー
      ド/シリアル割り込みの場合についてそれぞれのハンド
      ル関数をコールしている
CPU内部の割り込みの話おわり
 実際には、割り込みはCPUの外から
  やってくる
 これを受け取ってどうCPUへ割り込み
  をかけるかを司る、仲介役を果たす「割
  り込みコントローラ」が必要
 割り込みコントローラのずっと向こう側
  に、実際に割り込みを送っているデバイ
  スが居る
 さぁ、CPUの向こう側の話をしよう
Advanced Programmable
Interrupt Controller (APIC)
 オリジナルのx86アーキテクチャでは割
  り込みコントローラとしてPIC(8259)を
  使っていたが、P6以降のx86アーキテク
  チャではAPICへ移行(PICも未だ存在し
  ていて使える)
 CPU毎に存在しCPUに内蔵されている
  Local APICと、ICH(Southbridge)に
  内蔵されているI/O APICから構成されて
  いる
Local APICとI/O APIC
 Local APIC
  ローカル割り込みのベクタ番号設定、割
  り込みベクタ番号通知、EOIなど一般的
  な割り込みコントローラの役割
 I/O APIC
  どの外部割り込みをどのLocal APICに振
  るか等を決める役割
Local APICとI/O APIC

8259A PIC
              CPU                CPU                   CPU
   LINT0                                     IPI
                              Local APIC            Local APIC
               Timer

   LINT1    Local APIC

 NMI
                                IOAPIC         External Interrupts


                         ICH(South bridge)
Local APIC内のコンポーネ
ント
なにやら割り込みコントローラ以外にも幾
つか機能が乗っている
 タイマー
  カーネルのtickに使うことが多い
 温度センサ
 パフォーマンスモニタリングカウンタ
APIC ID
 Local APIC ID Registerから取得可
 APIC IDでプロセッサを一意に特定
 このIDでI/O APICから割り込み先CPUを
  指定
Local Vector Table
   ローカル割り込みのベクタ番号を設定
     CMCI(Corrected Machine Check Interrupt)
     Timer
     Thermal Monitor
     Performance Counter
     LINT0/1   レガシーデバイスとか
     Error
   外部割り込みはここで設定しない
割り込みの受信
 IRR: Interrupt Request Register
  CPUが未処理の割り込みベクタ番号にビッ
  トが立っている
 ISR: In Service Register
  次に割り込む候補
  EOIへ書き込まれた時にIRR→ISRへビット
  が更新される
 EOI: End Of Interrupt Register
  割り込みハンドラ終了通知として0を書き
  込む(例外有り)
I/O APIC (ICH10の場合)
 24本の割り込みをサポート
 Redirection Tableで割り込み先Local
  APICを決定(24エントリのテーブル)
Redirection Table
   各IRQの宛先APIC ID, Vectorなどを設定
       Destination        宛先APIC ID
       Mask               割り込みマスク
       Trigger Mode       Edge/Level
       Remote             IRR
       Interrupt          Input Pin Polarity
       Delivery Status    Idle/Pending
       Destination Mode   Physical/Logical
       Delivery Mode      Fixed/Lowest…
       Vector             Vector no of interrupt
Destination Mode
   Physical Destination Mode
     LAPIC上のLocal APIC ID Registerの値を指
     定する事によりCPUを一意に特定
   Logical Destination Mode
     LAPIC上のLogical Destination Registerと
     Destination Format Registerの値とAddress
     されたIDがマッチするかどうかで判別
Logical Destination Mode
 Destination Format Registerでモード選択
 flat model
     各LAPIC毎にLDRへ異なるbitを立て、宛先アド
      レスには複数のbitを立てる事で複数のCPUのを
      選択可能
     アドレスが8bitしか無いので対応CPU数は8まで
   cluster model
     LDRと宛先アドレスを4bitで分割、双方cluster
      IDとlogical IDを持つ
     使い方がよくわからない…8より多いCPUをサ
      ポートする為の階層化?
Delivery Mode
 Fixed
  Destinationに指定された全てのCPUへ
  割り込み
 Lowest priority
  DestinationのうちLAPICのTask Priority
  Registerの値が最も小さいCPUへ割り込
  み
  →TPRを制御する事で動的に割り込み先
  を変更可能
xv6のLAPIC周りを見てみる
   main.c:main()
     lapicinit(); LAPICを初期化
   lapic.c:lapicinit()
     LAPIC有効化
     タイマー初期化
     LINT0/LINT1、パフォーマンスカウンタ割り
      込み無効化
     エラー割り込みのベクタ番号設定
     エラーステータスレジスタクリア
     割り込みクリア
割り込みハンドラ周りの
LAPIC
   trap.c:trap()
     lapiceoi(); EOIレジスタへ0書き込み
   lapic.c:lapiceoi()
xv6のI/O APIC周り
   main.c:main()
     ioapicinit();
     ideinit();
   ioapic.c:ioapicinit()
     全ての割り込みを無効に
   ide.c:ideinit()
     ioapicenable(IRQ_IDE, ncpu – 1);
      IRQ_IDEをAPIC ID=ncpu -1へ送るよう設定
     質問:Delivery ModeとDestination Modeは
      何?
xv6のI/O APIC周り
 console.c:consoleinit()
  ioapicenable(IRQ_KBD, 0)
 uart.c:uartinit()
  ioapicenable(IRQ_COM1, 0)
PIC(8259)
 IOAPICと同様ICHに存在
  IOAPIC(又はcpu0のLocal APIC)へ接続
  されている
 「古い割り込みコントローラ」のように紹
  介したが、レガシデバイスが接続されてい
  るのでそのようなデバイスを使う場合は
  PICを使う必要がある
 xv6ではレガシデバイスを使う為、
  PIC→IOAPICの順で割り込みの設定を行
  なっている
     ideinit(),consoleinit(),uartinit()で呼んでいる
     ioapicenable()の手前にあるpicenable()
レガシデバイス
   以下の様なデバイス
     PS/2     キーボード/マウス
     IDE
     COM0, COM1
     Floppy
     etc…
MSI: Message Signal Interrupt
MSI-X: MSI Extended Interrupt
 物理的な割り込み線を用いず、(多分、
  PCIの?)メッセージング機構により割
  り込みを通知する仕組み
 PCI Expressからサポート必須
 IO APICを経由しない(!)
 →割り込み先どうやって決めんの?
     PCI Configuration Spaceに設定
MSIの割り込み設定
 詳細はここをみてね
 IOAPICと同じく、Logical/Physicalの
  Destination Mode、Fixed/Lowestなどの
  Delivery modeが存在
x2apic
 拡張されたAPIC
 何が拡張されたか?
     色々あるはずだが、少なくともLocal APIC
      IDやDestinationのフィールド長が拡張され
      ている
     より沢山のCPUをサポート出来るように
      なった

Mais conteúdo relacionado

Mais procurados

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개beom kyun choi
 
OSC2011 Tokyo/Fall 濃いバナ(virtio)
OSC2011 Tokyo/Fall 濃いバナ(virtio)OSC2011 Tokyo/Fall 濃いバナ(virtio)
OSC2011 Tokyo/Fall 濃いバナ(virtio)Takeshi HASEGAWA
 
4章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 24章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 2mao999
 
YOW2021 Computing Performance
YOW2021 Computing PerformanceYOW2021 Computing Performance
YOW2021 Computing PerformanceBrendan Gregg
 
中国と深センでの半導体とRISC-V業界事情
中国と深センでの半導体とRISC-V業界事情中国と深センでの半導体とRISC-V業界事情
中国と深センでの半導体とRISC-V業界事情Junichi Akita
 
XPDDS18: Design and Implementation of Automotive: Virtualization Based on Xen...
XPDDS18: Design and Implementation of Automotive: Virtualization Based on Xen...XPDDS18: Design and Implementation of Automotive: Virtualization Based on Xen...
XPDDS18: Design and Implementation of Automotive: Virtualization Based on Xen...The Linux Foundation
 
Overview of kubernetes network functions
Overview of kubernetes network functionsOverview of kubernetes network functions
Overview of kubernetes network functionsHungWei Chiu
 
Hardware accelerated Virtualization in the ARM Cortex™ Processors
Hardware accelerated Virtualization in the ARM Cortex™ ProcessorsHardware accelerated Virtualization in the ARM Cortex™ Processors
Hardware accelerated Virtualization in the ARM Cortex™ ProcessorsThe Linux Foundation
 
Rootlinux17: Hypervisors on ARM - Overview and Design Choices by Julien Grall...
Rootlinux17: Hypervisors on ARM - Overview and Design Choices by Julien Grall...Rootlinux17: Hypervisors on ARM - Overview and Design Choices by Julien Grall...
Rootlinux17: Hypervisors on ARM - Overview and Design Choices by Julien Grall...The Linux Foundation
 
VPP事始め
VPP事始めVPP事始め
VPP事始めnpsg
 
20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)Kentaro Ebisawa
 
Anatomy of the loadable kernel module (lkm)
Anatomy of the loadable kernel module (lkm)Anatomy of the loadable kernel module (lkm)
Anatomy of the loadable kernel module (lkm)Adrian Huang
 
Vmlinux: anatomy of bzimage and how x86 64 processor is booted
Vmlinux: anatomy of bzimage and how x86 64 processor is bootedVmlinux: anatomy of bzimage and how x86 64 processor is booted
Vmlinux: anatomy of bzimage and how x86 64 processor is bootedAdrian Huang
 
Blazing Performance with Flame Graphs
Blazing Performance with Flame GraphsBlazing Performance with Flame Graphs
Blazing Performance with Flame GraphsBrendan Gregg
 
Linux Initialization Process (1)
Linux Initialization Process (1)Linux Initialization Process (1)
Linux Initialization Process (1)shimosawa
 
The TCP/IP Stack in the Linux Kernel
The TCP/IP Stack in the Linux KernelThe TCP/IP Stack in the Linux Kernel
The TCP/IP Stack in the Linux KernelDivye Kapoor
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜京大 マイコンクラブ
 

Mais procurados (20)

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
OSC2011 Tokyo/Fall 濃いバナ(virtio)
OSC2011 Tokyo/Fall 濃いバナ(virtio)OSC2011 Tokyo/Fall 濃いバナ(virtio)
OSC2011 Tokyo/Fall 濃いバナ(virtio)
 
4章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 24章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 2
 
YOW2021 Computing Performance
YOW2021 Computing PerformanceYOW2021 Computing Performance
YOW2021 Computing Performance
 
中国と深センでの半導体とRISC-V業界事情
中国と深センでの半導体とRISC-V業界事情中国と深センでの半導体とRISC-V業界事情
中国と深センでの半導体とRISC-V業界事情
 
XPDDS18: Design and Implementation of Automotive: Virtualization Based on Xen...
XPDDS18: Design and Implementation of Automotive: Virtualization Based on Xen...XPDDS18: Design and Implementation of Automotive: Virtualization Based on Xen...
XPDDS18: Design and Implementation of Automotive: Virtualization Based on Xen...
 
Overview of kubernetes network functions
Overview of kubernetes network functionsOverview of kubernetes network functions
Overview of kubernetes network functions
 
Hardware accelerated Virtualization in the ARM Cortex™ Processors
Hardware accelerated Virtualization in the ARM Cortex™ ProcessorsHardware accelerated Virtualization in the ARM Cortex™ Processors
Hardware accelerated Virtualization in the ARM Cortex™ Processors
 
Introduction to DPDK RIB library
Introduction to DPDK RIB libraryIntroduction to DPDK RIB library
Introduction to DPDK RIB library
 
Rootlinux17: Hypervisors on ARM - Overview and Design Choices by Julien Grall...
Rootlinux17: Hypervisors on ARM - Overview and Design Choices by Julien Grall...Rootlinux17: Hypervisors on ARM - Overview and Design Choices by Julien Grall...
Rootlinux17: Hypervisors on ARM - Overview and Design Choices by Julien Grall...
 
VPP事始め
VPP事始めVPP事始め
VPP事始め
 
20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)
 
Anatomy of the loadable kernel module (lkm)
Anatomy of the loadable kernel module (lkm)Anatomy of the loadable kernel module (lkm)
Anatomy of the loadable kernel module (lkm)
 
Vmlinux: anatomy of bzimage and how x86 64 processor is booted
Vmlinux: anatomy of bzimage and how x86 64 processor is bootedVmlinux: anatomy of bzimage and how x86 64 processor is booted
Vmlinux: anatomy of bzimage and how x86 64 processor is booted
 
Blazing Performance with Flame Graphs
Blazing Performance with Flame GraphsBlazing Performance with Flame Graphs
Blazing Performance with Flame Graphs
 
Linux Initialization Process (1)
Linux Initialization Process (1)Linux Initialization Process (1)
Linux Initialization Process (1)
 
The TCP/IP Stack in the Linux Kernel
The TCP/IP Stack in the Linux KernelThe TCP/IP Stack in the Linux Kernel
The TCP/IP Stack in the Linux Kernel
 
Xvisor: embedded and lightweight hypervisor
Xvisor: embedded and lightweight hypervisorXvisor: embedded and lightweight hypervisor
Xvisor: embedded and lightweight hypervisor
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 

Destaque

Interrupt Affinityについて
Interrupt AffinityについてInterrupt Affinityについて
Interrupt AffinityについてTakuya ASADA
 
Message Signaled Interrupts
Message Signaled InterruptsMessage Signaled Interrupts
Message Signaled InterruptsAnshuman Biswal
 
Meeting Review NESHEP 5th April
Meeting Review NESHEP 5th AprilMeeting Review NESHEP 5th April
Meeting Review NESHEP 5th AprilAlan Bassett
 
Networked Citizens a Cagliari: presentazione libro e open lesson
Networked Citizens a Cagliari: presentazione libro e open lesson Networked Citizens a Cagliari: presentazione libro e open lesson
Networked Citizens a Cagliari: presentazione libro e open lesson Alessandro Lovari
 
Content Quality Checklist By Heidi Cohen of Actionable Marketing Guide
Content Quality Checklist By Heidi Cohen of Actionable Marketing GuideContent Quality Checklist By Heidi Cohen of Actionable Marketing Guide
Content Quality Checklist By Heidi Cohen of Actionable Marketing GuideHeidi Cohen
 
How To Be A Twitter Spammer
How To Be A Twitter SpammerHow To Be A Twitter Spammer
How To Be A Twitter SpammerJosh Peters
 
Social media marknadsföring - restaurang- och matbranschen
Social media marknadsföring - restaurang- och matbranschenSocial media marknadsföring - restaurang- och matbranschen
Social media marknadsföring - restaurang- och matbranschenTobias Franzén
 
Windows Server 2008 R2 Bdm Overview Rtm 2
Windows Server 2008 R2 Bdm Overview Rtm 2Windows Server 2008 R2 Bdm Overview Rtm 2
Windows Server 2008 R2 Bdm Overview Rtm 2Anh Vu Pham
 
Multiqueue BPF support and other BPF feature
Multiqueue BPF support and other BPF featureMultiqueue BPF support and other BPF feature
Multiqueue BPF support and other BPF featureTakuya ASADA
 
What Advisors Do Online 2009
What Advisors Do Online 2009What Advisors Do Online 2009
What Advisors Do Online 2009kasina
 
Sitecore.Workflows.Schritte. Wissen wie.Now.Namics.
Sitecore.Workflows.Schritte.Wissen wie.Now.Namics.Sitecore.Workflows.Schritte.Wissen wie.Now.Namics.
Sitecore.Workflows.Schritte. Wissen wie.Now.Namics.Namics – A Merkle Company
 
Genkidama:実装と課題
Genkidama:実装と課題Genkidama:実装と課題
Genkidama:実装と課題Takuya ASADA
 

Destaque (20)

Interrupt Affinityについて
Interrupt AffinityについてInterrupt Affinityについて
Interrupt Affinityについて
 
Message Signaled Interrupts
Message Signaled InterruptsMessage Signaled Interrupts
Message Signaled Interrupts
 
Water Balance VLE
Water Balance  VLEWater Balance  VLE
Water Balance VLE
 
Meeting Review NESHEP 5th April
Meeting Review NESHEP 5th AprilMeeting Review NESHEP 5th April
Meeting Review NESHEP 5th April
 
Networked Citizens a Cagliari: presentazione libro e open lesson
Networked Citizens a Cagliari: presentazione libro e open lesson Networked Citizens a Cagliari: presentazione libro e open lesson
Networked Citizens a Cagliari: presentazione libro e open lesson
 
Content Quality Checklist By Heidi Cohen of Actionable Marketing Guide
Content Quality Checklist By Heidi Cohen of Actionable Marketing GuideContent Quality Checklist By Heidi Cohen of Actionable Marketing Guide
Content Quality Checklist By Heidi Cohen of Actionable Marketing Guide
 
How To Be A Twitter Spammer
How To Be A Twitter SpammerHow To Be A Twitter Spammer
How To Be A Twitter Spammer
 
sporting 24
sporting 24sporting 24
sporting 24
 
Social media marknadsföring - restaurang- och matbranschen
Social media marknadsföring - restaurang- och matbranschenSocial media marknadsföring - restaurang- och matbranschen
Social media marknadsföring - restaurang- och matbranschen
 
Development Area
Development AreaDevelopment Area
Development Area
 
Windows Server 2008 R2 Bdm Overview Rtm 2
Windows Server 2008 R2 Bdm Overview Rtm 2Windows Server 2008 R2 Bdm Overview Rtm 2
Windows Server 2008 R2 Bdm Overview Rtm 2
 
Multiqueue BPF support and other BPF feature
Multiqueue BPF support and other BPF featureMultiqueue BPF support and other BPF feature
Multiqueue BPF support and other BPF feature
 
What Advisors Do Online 2009
What Advisors Do Online 2009What Advisors Do Online 2009
What Advisors Do Online 2009
 
GUNDAM ROCK
GUNDAM ROCKGUNDAM ROCK
GUNDAM ROCK
 
Psvkbsrk.kursus
Psvkbsrk.kursusPsvkbsrk.kursus
Psvkbsrk.kursus
 
La gestion del_riesgo_de_desastre_aplica
La gestion del_riesgo_de_desastre_aplicaLa gestion del_riesgo_de_desastre_aplica
La gestion del_riesgo_de_desastre_aplica
 
Sitecore.Workflows.Schritte. Wissen wie.Now.Namics.
Sitecore.Workflows.Schritte.Wissen wie.Now.Namics.Sitecore.Workflows.Schritte.Wissen wie.Now.Namics.
Sitecore.Workflows.Schritte. Wissen wie.Now.Namics.
 
Genkidama:実装と課題
Genkidama:実装と課題Genkidama:実装と課題
Genkidama:実装と課題
 
DUID TRANSFORMATION
DUID TRANSFORMATIONDUID TRANSFORMATION
DUID TRANSFORMATION
 
Ud22
Ud22Ud22
Ud22
 

Semelhante a Interrupts on xv6

【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門 【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門 sandai
 
4章 Linuxカーネル - 割り込み・例外 3
4章 Linuxカーネル - 割り込み・例外 34章 Linuxカーネル - 割り込み・例外 3
4章 Linuxカーネル - 割り込み・例外 3mao999
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519Yasuhiro Ishii
 
Bluetooth通信の 仕組みと活用法紹介
Bluetooth通信の仕組みと活用法紹介Bluetooth通信の仕組みと活用法紹介
Bluetooth通信の 仕組みと活用法紹介Takehiko YOSHIDA
 
4章 Linuxカーネル - 割り込み・例外 4
 4章 Linuxカーネル - 割り込み・例外 4 4章 Linuxカーネル - 割り込み・例外 4
4章 Linuxカーネル - 割り込み・例外 4mao999
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Takuya Matsunaga
 
Exploring the x64
Exploring the x64Exploring the x64
Exploring the x64FFRI, Inc.
 
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)ryos36
 
Windowsのパケットモニタ作成
Windowsのパケットモニタ作成Windowsのパケットモニタ作成
Windowsのパケットモニタ作成Shinichi Hirauchi
 
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門Takeshi HASEGAWA
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門Yosuke Onoue
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
microLIFA for LabVIEW & Arduino User
microLIFA for LabVIEW & Arduino UsermicroLIFA for LabVIEW & Arduino User
microLIFA for LabVIEW & Arduino UserKoji_Ohashi
 
Dbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publishDbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publishYohei Azekatsu
 
PEZY-SC programming overview
PEZY-SC programming overviewPEZY-SC programming overview
PEZY-SC programming overviewRyo Sakamoto
 
VHDL-2008が好きなんです
VHDL-2008が好きなんですVHDL-2008が好きなんです
VHDL-2008が好きなんですwindy12806
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 
Stellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイドStellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイドryos36
 
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)Kazuyuki Sato
 
seccamp2012 チューター発表
seccamp2012 チューター発表seccamp2012 チューター発表
seccamp2012 チューター発表Hirotaka Kawata
 

Semelhante a Interrupts on xv6 (20)

【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門 【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門
 
4章 Linuxカーネル - 割り込み・例外 3
4章 Linuxカーネル - 割り込み・例外 34章 Linuxカーネル - 割り込み・例外 3
4章 Linuxカーネル - 割り込み・例外 3
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
 
Bluetooth通信の 仕組みと活用法紹介
Bluetooth通信の仕組みと活用法紹介Bluetooth通信の仕組みと活用法紹介
Bluetooth通信の 仕組みと活用法紹介
 
4章 Linuxカーネル - 割り込み・例外 4
 4章 Linuxカーネル - 割り込み・例外 4 4章 Linuxカーネル - 割り込み・例外 4
4章 Linuxカーネル - 割り込み・例外 4
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版
 
Exploring the x64
Exploring the x64Exploring the x64
Exploring the x64
 
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)
 
Windowsのパケットモニタ作成
Windowsのパケットモニタ作成Windowsのパケットモニタ作成
Windowsのパケットモニタ作成
 
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
microLIFA for LabVIEW & Arduino User
microLIFA for LabVIEW & Arduino UsermicroLIFA for LabVIEW & Arduino User
microLIFA for LabVIEW & Arduino User
 
Dbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publishDbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publish
 
PEZY-SC programming overview
PEZY-SC programming overviewPEZY-SC programming overview
PEZY-SC programming overview
 
VHDL-2008が好きなんです
VHDL-2008が好きなんですVHDL-2008が好きなんです
VHDL-2008が好きなんです
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
Stellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイドStellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイド
 
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
 
seccamp2012 チューター発表
seccamp2012 チューター発表seccamp2012 チューター発表
seccamp2012 チューター発表
 

Mais de Takuya ASADA

Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」Takuya ASADA
 
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワークSeastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワークTakuya ASADA
 
高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」
高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」
高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」Takuya ASADA
 
ヤマノススメ〜秋山郷 de ハッカソン〜
ヤマノススメ〜秋山郷 de ハッカソン〜ヤマノススメ〜秋山郷 de ハッカソン〜
ヤマノススメ〜秋山郷 de ハッカソン〜Takuya ASADA
 
UEFI時代のブートローダ
UEFI時代のブートローダUEFI時代のブートローダ
UEFI時代のブートローダTakuya ASADA
 
OSvのご紹介 in 
Java 8 HotSpot meeting
OSvのご紹介 in 
Java 8 HotSpot meetingOSvのご紹介 in 
Java 8 HotSpot meeting
OSvのご紹介 in 
Java 8 HotSpot meetingTakuya ASADA
 
OSvパンフレット v3
OSvパンフレット v3OSvパンフレット v3
OSvパンフレット v3Takuya ASADA
 
OSvのご紹介 in OSC2014 Tokyo/Fall
OSvのご紹介 in OSC2014 Tokyo/FallOSvのご紹介 in OSC2014 Tokyo/Fall
OSvのご紹介 in OSC2014 Tokyo/FallTakuya ASADA
 
OSvの概要と実装
OSvの概要と実装OSvの概要と実装
OSvの概要と実装Takuya ASADA
 
Linux network stack
Linux network stackLinux network stack
Linux network stackTakuya ASADA
 
Ethernetの受信処理
Ethernetの受信処理Ethernetの受信処理
Ethernetの受信処理Takuya ASADA
 
Presentation on your terminal
Presentation on your terminalPresentation on your terminal
Presentation on your terminalTakuya ASADA
 
僕のIntel nucが起動しないわけがない
僕のIntel nucが起動しないわけがない僕のIntel nucが起動しないわけがない
僕のIntel nucが起動しないわけがないTakuya ASADA
 
OSvパンフレット
OSvパンフレットOSvパンフレット
OSvパンフレットTakuya ASADA
 
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜Takuya ASADA
 
「ハイパーバイザの作り方」読書会#2
「ハイパーバイザの作り方」読書会#2「ハイパーバイザの作り方」読書会#2
「ハイパーバイザの作り方」読書会#2Takuya ASADA
 
「ハイパーバイザの作り方」読書会#1
「ハイパーバイザの作り方」読書会#1「ハイパーバイザの作り方」読書会#1
「ハイパーバイザの作り方」読書会#1Takuya ASADA
 
10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化Takuya ASADA
 
Implements BIOS emulation support for BHyVe: A BSD Hypervisor
Implements BIOS emulation support for BHyVe: A BSD HypervisorImplements BIOS emulation support for BHyVe: A BSD Hypervisor
Implements BIOS emulation support for BHyVe: A BSD HypervisorTakuya ASADA
 

Mais de Takuya ASADA (20)

Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」
 
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワークSeastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
 
高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」
高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」
高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」
 
ヤマノススメ〜秋山郷 de ハッカソン〜
ヤマノススメ〜秋山郷 de ハッカソン〜ヤマノススメ〜秋山郷 de ハッカソン〜
ヤマノススメ〜秋山郷 de ハッカソン〜
 
UEFI時代のブートローダ
UEFI時代のブートローダUEFI時代のブートローダ
UEFI時代のブートローダ
 
OSvのご紹介 in 
Java 8 HotSpot meeting
OSvのご紹介 in 
Java 8 HotSpot meetingOSvのご紹介 in 
Java 8 HotSpot meeting
OSvのご紹介 in 
Java 8 HotSpot meeting
 
OSvパンフレット v3
OSvパンフレット v3OSvパンフレット v3
OSvパンフレット v3
 
OSvのご紹介 in OSC2014 Tokyo/Fall
OSvのご紹介 in OSC2014 Tokyo/FallOSvのご紹介 in OSC2014 Tokyo/Fall
OSvのご紹介 in OSC2014 Tokyo/Fall
 
OSv噺
OSv噺OSv噺
OSv噺
 
OSvの概要と実装
OSvの概要と実装OSvの概要と実装
OSvの概要と実装
 
Linux network stack
Linux network stackLinux network stack
Linux network stack
 
Ethernetの受信処理
Ethernetの受信処理Ethernetの受信処理
Ethernetの受信処理
 
Presentation on your terminal
Presentation on your terminalPresentation on your terminal
Presentation on your terminal
 
僕のIntel nucが起動しないわけがない
僕のIntel nucが起動しないわけがない僕のIntel nucが起動しないわけがない
僕のIntel nucが起動しないわけがない
 
OSvパンフレット
OSvパンフレットOSvパンフレット
OSvパンフレット
 
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
 
「ハイパーバイザの作り方」読書会#2
「ハイパーバイザの作り方」読書会#2「ハイパーバイザの作り方」読書会#2
「ハイパーバイザの作り方」読書会#2
 
「ハイパーバイザの作り方」読書会#1
「ハイパーバイザの作り方」読書会#1「ハイパーバイザの作り方」読書会#1
「ハイパーバイザの作り方」読書会#1
 
10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化
 
Implements BIOS emulation support for BHyVe: A BSD Hypervisor
Implements BIOS emulation support for BHyVe: A BSD HypervisorImplements BIOS emulation support for BHyVe: A BSD Hypervisor
Implements BIOS emulation support for BHyVe: A BSD Hypervisor
 

Interrupts on xv6

  • 2. 資料  Software Developers Manual http://download.intel.com/products/proce ssor/manual/325462.pdf  ICH10 Datasheet http://www.intel.com/assets/pdf/datashe et/319973.pdf
  • 3. おさらい  このあたりは「はじめて読む486」を読 んでれば分かってるはず  わかってない人がこの場にいるとも思え ないんだけれども…
  • 4. 割り込みとは  現在CPU上で実行しているプログラムを停止 して別の処理を実行する為にCPUが持つ機能  UNIX上のアプリケーションにおける「シグナル」に 近い概念  二種類ある  ハードウェア割り込み ○ ハードウェアからCPUへ「キーボード押されたよ」な どのメッセージを通知するのに使う ○ 単に「割り込み」と呼ばれる事もある  ソフトウェア割り込み ○ ソフトウェアから割り込みを起こせる ○ モード切替に利用される→システムコールに使う
  • 5. ハードウェア割り込みの例  ATAコントローラ  HDDへのread/writeリクエストの完了通知  シリアルポート・NIC  受信通知  送信完了通知  タイマー  一定期間毎に割り込み  指定期間後に割り込み
  • 6. ATA受信割り込みの例 1. ユーザプログラムがファイルに対して writeシステムコールを実行 2. ファイルシステムがバッファキャッシュ へ書き込み(ダーティフラグON) 3. バッファキャッシュがHDDへライトバッ ク 4. ATAドライバがATAコントローラへ書き込 み要求を送信 5. 書き込みが終了したらバッファキャッ シュのダーティフラグをクリア
  • 7. 書き込みが終了したら? 割り込みを使わない場合  ATAコントローラのステータスレジスタを確 認し続ければ完了したかどうか分かる send_write_request(buffer); while(read_ata_status() & ATA_STATUS_BUSY) ; buffer.is_dirty = 0;  busy waitになってしまう→CPUの無駄
  • 8. 書き込みが終了したら? 割り込みを使う場合  送信完了時の処理は、割り込み着信時に実行すれ ばいい 書き込み処理: send_write_request(buffer); sleep(buffer); 割り込みハンドラ: buffer = find_buffer(ata_reg); buffer.is_dirty = 0; wakeup(buffer);  busy waitしていない分のCPU時間を別の処 理(別のプロセスを実行など)にまわせる  sleep()/wakeup()で待ち合わせ
  • 9. 割り込みハンドラ  割り込みを受けた時にCPUが実行するプロ グラム(関数呼び出しを伴わない関数のよ うなもの)  割り込みハンドラ実行時にCPUがレジスタ の状態をスタックへ退避  ハードウェア割り込みの場合は、デバイス のレジスタを読んで割り込みの処理に応じ た最小限の処理を実行  割り込みハンドラから終了用の命令を実行 して、スタックから割り込み前の状態へ復 帰
  • 10. プリエンプティブマルチタスク と割り込み  プリエンプティブマルチタスク: カーネルがプロセスへのCPUの割り当 て時間を管理、タイマーを使ってアプリ ケーションを一定時間毎に切り替え  プロセスが無限ループなどに陥りカーネ ルへ制御を渡さない場合でもタイマー割 り込みにより中断され、割り当て時間を 使い切ったら他のプロセスへ切り替えら れる  割り込みがないと実現出来ない
  • 11. 例外  割り込みとは別の概念だが、実装上の共 通点は多いためx86では共通の仕組みで 取り扱われている  アプリケーション上の例外とほぼ意味は同 じだが、CPU上の機能  例外の例: ゼロ除算、無効な命令、ページフォール ト、一般保護例外、ブレークポイント
  • 12. 割り込み/例外ベクタ  0-255のベクタ番号が割り込みと例外に 割り当てられる  例外は要因毎に0-19の固定された値  ソフト割り込みは0-255へ割り込み可  ハードウェア割り込みはLAPIC経由の場合 16-255へ割り込み可  OSはIDT(Interrupt Descriptor Table) を作成し、CPUへアドレスを設定
  • 13. IDT(Interrupt Descriptor Table)とIDTR  各ベクタの割り込みハンドラの情報を持 つGate Descriptorが並んでいるメモリ上 のテーブル  テーブルの先頭アドレスとLimit値 (テーブルのサイズ、255未満のGate数 に対応)をCPUのIDTRに書き込む事に より設定(IDTRを設定しない限り、 CPUは割り込み時に何をしたらいいか 分からない)
  • 14. Gate Descriptor  前述の「割込みハンドラ」のアドレスを持つ 構造体  単なる関数へのポインタではなくて、セグメ ントの設定とか権限(Ring)とか16 bit/32 bit のモード選択とか、幾つかのパラメータを含 む  Task gate, Interrupt gate, Trap gateの三種類あ る  Task gateはHWのマルチタスク機能でハンドリング する方法で今は使われていない  Interrupt gateとTrap gateは普通に割り込みハンドラ へジャンプする方法 EFLAGS.IFフラグをクリアするか否かが違い
  • 15. IDT,IDTR,Gate descriptorの関 係 IDTR register 47 16 15 0 Base address Limit IDT Gate for interrupt 255 … Gate for interrupt 3 Gate for interrupt 2 Gate for interrupt 1 Interrupt Gate DPL rese segment Gate for interrupt 0 offset 31..16 offset 15..0 /P rved selector
  • 16. xv6のIDT周りを見てみる  main.c:main()  tvinit(); 割り込みベクタの設定  mpmain(); ○ idtinit(); IDTRの設定  trap.c:tvinit()  for(0..255) SETGATE(idt[i] … vectors[i] …) idt[i]にvectors[i]を割り込みハンドラとしたgate descriptorを設定  システムコールだけDPL_USERに  trap.c:idtinit()  x86.h:lidt() ○ asm volatile(“lidt (%0)” :: “r” (pd)); LIDT命令でidtのアド レスを設定
  • 17. xv6の割り込み・例外ハンド ラ  vectors.pl→vectors.S  vectorsはvector0..vector255を指すポインタが入っている テーブルで、vectorNはalltrapsを呼んでいる  trapasm.S  全レジスタpush  pushl %esp  call trap  全レジスタpop  iret (割り込みからの復帰)  trap.c:trap()  trapasm.Sから引数として渡されたスタックポインタを構 造体として参照  trapnoがシステムコールの場合・タイマ/IDE/キーボー ド/シリアル割り込みの場合についてそれぞれのハンド ル関数をコールしている
  • 18. CPU内部の割り込みの話おわり  実際には、割り込みはCPUの外から やってくる  これを受け取ってどうCPUへ割り込み をかけるかを司る、仲介役を果たす「割 り込みコントローラ」が必要  割り込みコントローラのずっと向こう側 に、実際に割り込みを送っているデバイ スが居る  さぁ、CPUの向こう側の話をしよう
  • 19. Advanced Programmable Interrupt Controller (APIC)  オリジナルのx86アーキテクチャでは割 り込みコントローラとしてPIC(8259)を 使っていたが、P6以降のx86アーキテク チャではAPICへ移行(PICも未だ存在し ていて使える)  CPU毎に存在しCPUに内蔵されている Local APICと、ICH(Southbridge)に 内蔵されているI/O APICから構成されて いる
  • 20. Local APICとI/O APIC  Local APIC ローカル割り込みのベクタ番号設定、割 り込みベクタ番号通知、EOIなど一般的 な割り込みコントローラの役割  I/O APIC どの外部割り込みをどのLocal APICに振 るか等を決める役割
  • 21. Local APICとI/O APIC 8259A PIC CPU CPU CPU LINT0 IPI Local APIC Local APIC Timer LINT1 Local APIC NMI IOAPIC External Interrupts ICH(South bridge)
  • 22. Local APIC内のコンポーネ ント なにやら割り込みコントローラ以外にも幾 つか機能が乗っている  タイマー カーネルのtickに使うことが多い  温度センサ  パフォーマンスモニタリングカウンタ
  • 23. APIC ID  Local APIC ID Registerから取得可  APIC IDでプロセッサを一意に特定  このIDでI/O APICから割り込み先CPUを 指定
  • 24. Local Vector Table  ローカル割り込みのベクタ番号を設定  CMCI(Corrected Machine Check Interrupt)  Timer  Thermal Monitor  Performance Counter  LINT0/1 レガシーデバイスとか  Error  外部割り込みはここで設定しない
  • 25. 割り込みの受信  IRR: Interrupt Request Register CPUが未処理の割り込みベクタ番号にビッ トが立っている  ISR: In Service Register 次に割り込む候補 EOIへ書き込まれた時にIRR→ISRへビット が更新される  EOI: End Of Interrupt Register 割り込みハンドラ終了通知として0を書き 込む(例外有り)
  • 26. I/O APIC (ICH10の場合)  24本の割り込みをサポート  Redirection Tableで割り込み先Local APICを決定(24エントリのテーブル)
  • 27. Redirection Table  各IRQの宛先APIC ID, Vectorなどを設定  Destination 宛先APIC ID  Mask 割り込みマスク  Trigger Mode Edge/Level  Remote IRR  Interrupt Input Pin Polarity  Delivery Status Idle/Pending  Destination Mode Physical/Logical  Delivery Mode Fixed/Lowest…  Vector Vector no of interrupt
  • 28. Destination Mode  Physical Destination Mode  LAPIC上のLocal APIC ID Registerの値を指 定する事によりCPUを一意に特定  Logical Destination Mode  LAPIC上のLogical Destination Registerと Destination Format Registerの値とAddress されたIDがマッチするかどうかで判別
  • 29. Logical Destination Mode  Destination Format Registerでモード選択  flat model  各LAPIC毎にLDRへ異なるbitを立て、宛先アド レスには複数のbitを立てる事で複数のCPUのを 選択可能  アドレスが8bitしか無いので対応CPU数は8まで  cluster model  LDRと宛先アドレスを4bitで分割、双方cluster IDとlogical IDを持つ  使い方がよくわからない…8より多いCPUをサ ポートする為の階層化?
  • 30. Delivery Mode  Fixed Destinationに指定された全てのCPUへ 割り込み  Lowest priority DestinationのうちLAPICのTask Priority Registerの値が最も小さいCPUへ割り込 み →TPRを制御する事で動的に割り込み先 を変更可能
  • 31. xv6のLAPIC周りを見てみる  main.c:main()  lapicinit(); LAPICを初期化  lapic.c:lapicinit()  LAPIC有効化  タイマー初期化  LINT0/LINT1、パフォーマンスカウンタ割り 込み無効化  エラー割り込みのベクタ番号設定  エラーステータスレジスタクリア  割り込みクリア
  • 32. 割り込みハンドラ周りの LAPIC  trap.c:trap()  lapiceoi(); EOIレジスタへ0書き込み  lapic.c:lapiceoi()
  • 33. xv6のI/O APIC周り  main.c:main()  ioapicinit();  ideinit();  ioapic.c:ioapicinit()  全ての割り込みを無効に  ide.c:ideinit()  ioapicenable(IRQ_IDE, ncpu – 1); IRQ_IDEをAPIC ID=ncpu -1へ送るよう設定  質問:Delivery ModeとDestination Modeは 何?
  • 34. xv6のI/O APIC周り  console.c:consoleinit() ioapicenable(IRQ_KBD, 0)  uart.c:uartinit() ioapicenable(IRQ_COM1, 0)
  • 35. PIC(8259)  IOAPICと同様ICHに存在 IOAPIC(又はcpu0のLocal APIC)へ接続 されている  「古い割り込みコントローラ」のように紹 介したが、レガシデバイスが接続されてい るのでそのようなデバイスを使う場合は PICを使う必要がある  xv6ではレガシデバイスを使う為、 PIC→IOAPICの順で割り込みの設定を行 なっている  ideinit(),consoleinit(),uartinit()で呼んでいる ioapicenable()の手前にあるpicenable()
  • 36. レガシデバイス  以下の様なデバイス  PS/2 キーボード/マウス  IDE  COM0, COM1  Floppy  etc…
  • 37. MSI: Message Signal Interrupt MSI-X: MSI Extended Interrupt  物理的な割り込み線を用いず、(多分、 PCIの?)メッセージング機構により割 り込みを通知する仕組み  PCI Expressからサポート必須  IO APICを経由しない(!)  →割り込み先どうやって決めんの?  PCI Configuration Spaceに設定
  • 38. MSIの割り込み設定  詳細はここをみてね  IOAPICと同じく、Logical/Physicalの Destination Mode、Fixed/Lowestなどの Delivery modeが存在
  • 39. x2apic  拡張されたAPIC  何が拡張されたか?  色々あるはずだが、少なくともLocal APIC IDやDestinationのフィールド長が拡張され ている  より沢山のCPUをサポート出来るように なった