Fw 初探linux中斷系統(1)

2022-09-10 21:42:23 字數 2775 閱讀 3907

1. 重要介面

ldd上說,「核心維護了乙個中斷訊號線的登錄檔,該登錄檔類似於i/o埠的登錄檔。模組在使用中斷前要先請求乙個中斷通道(或者中斷請求irq),然後在使用後釋放該通道。」

撇開系統如何遍歷各個裝置進行初始化,上面兩句話說的實際上就是指兩個介面函式:

extern

int__must_check

request_irq(unsigned

intirq, irq_handler_t handler, unsigned

long

flags,

const

char

*name,

void

*dev);

extern

void

free_irq(unsigned

int,

void

*);

顧名思義,以上兩個函式分別用於申請和釋放irq。

而再一看,會發現其實request_irq是個「皮包」函式,它的定義是這樣的:

static

inline

int__must_check

request_irq(unsigned

intirq, irq_handler_t handler, unsigned

long

flags,

const

char

*name,

void

*dev)

所以實際上起到申請irq作用的,正是這個request_threaded_irq函式。一查,它位於/kernel/irq/manage.c中。

2.追隨request_threaded_irq

先貼上request_threaded_irq全文

int

request_threaded_irq(unsigned

intirq, irq_handler_t handler,

irq_handler_t thread_fn, unsigned

long

irqflags,

const

char

*devname,

void

*dev_id)

action

=kzalloc(

sizeof

(struct

irqaction), gfp_kernel);if(

!action)

return

-enomem;

action

->

handler

=handler;

action

->

thread_fn

=thread_fn;

action

->

flags

=irqflags;

action

->

name

=devname;

action

->

dev_id

=dev_id;

chip_bus_lock(irq, desc);

retval

=__setup_irq(irq, desc, action);

chip_bus_sync_unlock(irq, desc);

if(retval)

kfree(action);

#ifdef config_debug_shirqif(

!retval

&&(irqflags

&irqf_shared))

#endif

return

retval;

}

可以看到除去一些驗證的語句,整個函式主要完成的任務是初始化了乙個irqaction型別的struct和乙個irq_desc型別的struct,接著對這兩個struct進一步賦值和處理,便實現了irq申請。至此,我們有理由認為這兩個struct是kernel管理irq的核心資料結構。因此不妨看看他們都是什麼樣的。

struct

irq_desc ____cacheline_internodealigned_in_smp;

irq_desc實際是個用於構成陣列的資料結構。這裡irq就是我們熟悉的irq號,每個裝置申請到乙個irq,就需要填充乙個irq_desc,並由kernel放入所維護的陣列中進行管理。在這些需要填充的內容裡,irq_chip和irqaction是兩個比較有助於理解資料結構的struct。

struct

irq_chip ;

這個struct裡主要定義了硬體層面上乙個系統對乙個irq的管理介面。

struct

irqaction ;

這個struct中handler定義了中斷處理函式, *next指向了下乙個irqaction,也就是說irqaction是以鍊錶的形式存在的。也就是說,每乙個irq對應乙個irq_desc,而irq_desc維護著irq_chip管理了硬體層面的中斷使能,同時irq_desc也維護了乙個irqaction鍊錶。

根據所查的資料,實際上,系統在處理乙個中斷時,會根據中斷號呼叫irq_desc陣列中的handle_irq, handle_irq再使用chip控制硬體的使能,接著呼叫irqaction鍊錶,逐個呼叫中斷處理函式。

回過頭來,request乙個irq的過程實際上就是構造irqaction項,free的過程就是移除不需要的irqaction項。

Linux檔案系統初探(1)

首先要回答這樣乙個問題 為什麼要寫這樣的文章?網路中已經有大量這樣的教程和介紹。我的回答和codproject上的一位大牛的回答是類似的,其一是 對於初學者來說資訊越多越好,多角度的對同乙個問題或者概念進行描述對理解問題和概念是大有好處的。其二是 這樣把學習的東西講述出來才能更好的幫助自己理解概念。...

Linux中斷處理之共享中斷處理初探

在看lkd 第二版 第六章 中斷和中斷處理程式 的時候,剛開始接觸到中斷線號和共享中斷線的時候半天愣是沒有想明白,原來理解的中斷和中斷和中斷處理程式就是通過中斷線號來進行關聯,硬體發生中斷,然後通過中斷線號查詢對應的中斷處理程式,最後中斷處理程式返回,此次中斷則處理完畢,沒想到冒出來個共享中斷線,呵...

Linux 核心中斷體系 初探

還是要先理解整個中斷的體系,首先要理解對中斷的含義 如果這是涉及到的軟體的除錯的話,沒有接觸過硬體的同學會對,gdb的除錯中的中斷有一定的認知 但是,這兩個中斷指的意思是不相同的,gdb的除錯中的中斷 指的是程式執行到某個節點的的時候就跳出程式,這個 節點指的是提前設定好的中斷點,而這個linux ...