/var/log/messages

2006-05-10

[] ちょっと前進

昨晩ハマった原因は、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を以下に

トラックバック - http://d.hatena.ne.jp/yamanetoshi/20060510/1147238630