コードの各カーネルバージョンが異なる小さな部分を持っていますが、一般的なプロセスは基本的に同じである、ちょうど関数名との関係でいくつかの変更を呼ぶ、のは、割り込み処理を分析してみましょう
1:割り込みベクタテーブルのアーチ/腕/カーネル/でのボイド__init early_trap_init(void *型vectors_base)再配置機能がファイルtraps.c
検索__vectors_startが見つかりました。vector_stubのIRQ、アーチ/腕/カーネル/ entry_armv.Sで、このファイルにIRQ_MODE、4下流プロセスの事例研究にマクロ定義がある知っています
vector_stubはマクロです。
ここで__irq_usrユーザーモードプロセスを中断することが__irq_usrを検索するようになりました
この中であり、これはマクロですirq_handler、または検索を続けるentry_armv.S
検索arch_irq_handler_defaultた後asm_do_IRQを呼び出します
フロントはここアセンブラで記述されている、asm_do_IRQは背後の関数Cを達成するために使用されています
次のような関係がある呼び出します。
early_trap_init //カーネルは、ここでは、仮想アドレスを使用して新しい仮想アドレス0x00000000の元の割り込みベクタは0xFFFF0000からを持っているか、カーネル設定ファイルにすることができています
vector_stub IRQ //割り込みユーザーモード解析にダウンしていること
__irq_usr
irq_handler
arch_irq_handler_default
asm_do_IRQ
次asm_do_IRQが理解し分析するには、分割する方法です
2:リストされた最初のコールグラフ
asm_do_IRQ
handle_IRQ
generic_handle_irq
構造体irq_desc * DESC = irq_to_desc(IRQ)。
generic_handle_irq_desc
desc-> handle_irq(IRQ、DESC); // DESC構造機能が実現されている1:ハンドラ3を呼び出します:2は、解像度を中断明らか割り込み
=================================================部門ライン================================================= ====
desc-> handle_irq(IRQ、DESC);それはその機能を指すhandle_irq分析?カーネル/ IRQ / chip.c中にdesc-> handle_irq =処理したコールこの手紙でそれを見つける__irq_set_handler検索。
/ linuxの/ irq_set_chained_handlerでirq.hが、その後にアーチ/腕/ PLAT-s3c24xxで取得する検索機能の呼び出しと呼ばれていましたが含ま呼び出している人を確認するために、この機能__irq_set_handler再検索
s3c24xx_init_irqこの機能は、これは単なる一例である内部の初期化割り込み機能に設定された構築物irq_desc構造を呼び出すには、異なる割り込み初期化関数は、この__irq_set_handlerを呼び出すことができ、この関数を呼び出します
handle_edge_irq
handle_irq_event(DESC); //この関数は、割り込みを処理することです
階層は、我々はまた、以下で定義されている。この構造irq_desc構造を分析する必要があり、このようなものです一部のみ記載されている/ linuxの/ irqdesc.h
私たちは私たち自身の割り込みを使用する場合、どのように我々は、カーネルを教えてください、中断したフレームである、これらはカーネルの割り込みアーキテクチャですがやっているの?登録Request_irqのは、次のように分析してみましょう
番号を中断するirq_descは添字の配列で、処理機能、リンクリストなどのさまざまながあります、私たちは自分自身の割り込み駆動を使用したい、記入してから、このリストに登録されて構築する必要があります。
request_irq
request_threaded_irq
action = kzalloc(sizeof(struct irqaction), GFP_KERNEL); //分配一个irqaction结构体
action->handler = handler; //填充 把传入的参数填充到结构体
action->thread_fn = thread_fn;
action->flags = irqflags;
action->name = devname;
action->dev_id = dev_id;
retval = __setup_irq(irq, desc, action); //设置中断
__irq_set_trigger
ret = chip->irq_set_type(&desc->irq_data, flags); //设置中断类型
__enable_irq(desc, irq, false); //使能中断
到此基本分析完毕,下一节 写一个基本中断的按键驱动程序