ちょっと前進
昨晩ハマった原因は、etags の作り方にも問題があるらしい。違うアーキテクチャなソースとかヘッダなんかに紐が付いてるケースあり。ただし、gas の .rept の理解不足が一番の原因。
以下にハマって解決できている部分までをメモっとく。(ロギング大切と言ってますがここまでハマると微妙)
まず、昨晩就寝前の直前エントリで書いている interrupt#arch/i386/kernel/entry.S は夢に出てきそうなくらいに意味分からんかった。基本的に gas の理解不足が大きな原因。ソース (一部) は以下。(コメント微妙杉)
/* * Build the entry stubs and pointer table with * some assembler magic. */ .data ENTRY(interrupt) .text vector=0 ENTRY(irq_entries_start) .rept NR_IRQS ALIGN 1: pushl $vector-256 jmp common_interrupt .data .long 1b .text vector=vector+1 .endr ALIGN common_interrupt: SAVE_ALL movl %esp,%eax call do_IRQ jmp ret_from_intr
最初は .rept って繰り返して処理すんだ、と勘違いしてたのが最大のオトシ穴。ドキュメントよく読めよ、みたいなー。
.rept count
ってか、割り込み発生する度に interrupt にジャンプして IRQ の数分繰り返すのって微妙スギ、とは思ってたんだよねー。とほほほ。
で、アセンブル通したら以下のようなイメージになる、と (一部元のママ)。
vector=0 ENTRY(irq_entries_start) ALIGN 1: pushl $vector-256 jmp common_interrupt .data .long 1b .text vector=vector+1 ALIGN 1: pushl $vector-256 jmp common_interrupt .data .long 1b .text vector=vector+1 (中略 ALIGN 1: pushl $vector-256 jmp common_interrupt .data .long 1b .text vector=vector+1
i8259A を使ってる (ってか、APIC 使ってるオプション指定してない?) んなら NR_IRQ は 16 らしいんで 16 回リピートされて展開される、と。
で、vector ってシンボルもオペランドに指定される時のみ $ を付加しないとイケナイ、というコトが分かるまでシェル変数と混同しててワケワカでした。
ここ↓、参考になりました。(他にもたくさん調べてます)
アセンブラを学べ
それから、以下の部分も意味不明だった。
.data .long 1b
まず、1b が何なのか、が分からず。
ココ(The GNU Assembler)の_Local Symbol Names_の項を見てようやく意味が分かる。
ALIGN 1: pushl $vector-256 jmp common_interrupt
直上の 1: の命令なポインタを格納するんだな、多分。で、一番てっぺんにある interrupt ってエントリはポインタ配列なんだな、と。(おそらくこれが init_IRQ()#arch/i386/kernel/i8259.c で参照されてる interrupt のハズ)
疑似コード的には以下のような感じ??
.data .globl interrupt .align 4, 0x90 interrupt: .long 最初のエントリのアドレス .long 二番目のエントリのアドレス .long 三番目のエントリのアドレス # 続く ...
割り込みベクターテーブル ...
ただ、現時点で微妙なのが、件の init_IRQ()#arch/i386/kernel/i8259.c の
set_intr_gate(vector, interrupt[i]);
の呼出しで使っている interrupt っつーシンボルがどこで解決されているかがまだ分からない。C なんだから外部参照で紐付けてないと駄目なハズ、とゆーのはダウトなのかなぁ。
とりあえず、ここまでログとっといてあとはデータ構造をもう少し調べてみた方が良いかな。
- irq_desc_t 型
- hw_interrupt_type 型
- irqaction 型
使用したペーパーな資料は以下。
調べものに使用したポインタはブクマ。
ーー追記ーー
ブクマ不可能だったURLを以下に