VME/CAMAC 専門研修 Meeting Memo (16-Mar-2001)
日時: |
3月16日(金曜日)、14:00から17:30まで |
場所: |
2号館3階会議室 |
出席: |
多田野、仲吉、佐藤、小田切、安 |
内容
- 小田切さんによるDMAの仕組みの講義:
- 次の点が重要な処理である。
- __get_free_pagesで連続した物理ページを確保する。
- 書き込みの場合はcopy_from_userを使ってユーザバッファから
確保したカーネルバッファにデータをコピーする。
- デバイスにアクセスしDMAを起動する。
- 割り込みを待つために、sleep_on(interruptible_sleep_on)を
呼ぶ。
- 割り込みが入ったら割り込みルーチンで割り込み要因を
見つけだし、対応した処理を行なってから、wake_up(wake_up_interruptible)
を呼ぶ。
- 読み込みの場合はcopy_to_useを使ってカーネルバッファから
ユーザバッファへコピーする。
- UNIVERSEチップで説明したDMAはPCIバス、VMEバス上で
誰がマスタ/スレーブになっているか?:
このDMAで動作している場合、UNIVERSEチップはPCI/VMEバス共に
バスマスタとして動作する。アクセスされるVMEモジュールは
VMEバススレーブ、CPU上のメモリはPCIスレーブとして動作する。
- 仲吉さんの割り込み処理のメカニズムの講義
- 割り込みは0から255のベクタ番号で識別される。0-31のベクタ番号は
例外割り込みやマスク不可能割り込みが利用する。32-47のベクタ番号は
IRQにより割り込みを起こすマスク可能割り込みに割り当てられる。
IRQ0はベクタ番号32に対応し、IRQ15は47に対応する。48-255のベクタ番号は
ソフトウエア割り込みに使用する。
- カーネルコードを追って説明した。
(init/main.c)のstart_kernelからはじまった。
- start_kernelでinit_IRQ()が呼ばれ、この中でInterrupt Descriptor Table(IDT)を
作成する。ある割り込みが起こると飛ぶべき1つのルーチンがこのテーブルにある。
- init_IRQ(arch/i386/kernel/i8259.c)ではIDTのテーブル作成を行なっている。
そのテーブルに埋めるべきデータはirq_desc_t(include/linux/irq.h)に
定義されている。
- 割り込みが起こると、
このルーチンの中ではdo_IRQ(arch/i386/kernel/irq.c)を呼ぶ。割り込みが
かかった時点ですべての外部割り込みは禁止されている。
この中では、irq番号を受けてIDTから対応するIRQ用のテーブルを得る。
8259Aをマスクし割り込みACKを返す。そしてhandle_IRQ_event
(arch/i386/kernel/irq.c)を呼び、ドライバに登録された割り込みルーチンを
呼ぶ。そのIRQに複数のドライバが登録されている場合は、すべての
ルーチンを呼ぶ。
- その後、同じIRQによる8259Aからの割り込みを許可する。
- ソフト割り込みがあればそちらを呼ぶ。
- 次回は2001年3月23日(金)、午後2時から。
講師による性能測定方法についての実技を含んだ講義。