成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux的IRQ中斷子系統(tǒng)分析

系統(tǒng) Linux
本文以Linux中斷子系統(tǒng)架構(gòu)為視角,旨在提供一個(gè)對(duì)Linux中斷系統(tǒng)的全局認(rèn)識(shí),不涉及具體實(shí)現(xiàn)細(xì)節(jié)。

本文以Linux中斷子系統(tǒng)架構(gòu)為視角,旨在提供一個(gè)對(duì)Linux中斷系統(tǒng)的全局認(rèn)識(shí),不涉及具體實(shí)現(xiàn)細(xì)節(jié)。

一、Linux中斷子系統(tǒng)架構(gòu)

在Linux中斷子系統(tǒng)(generic irq)出現(xiàn)之前,內(nèi)核使用__do_IRQ處理所有的中斷,這意味著__do_IRQ中要處理各種類型的中斷,這會(huì)導(dǎo)致軟件的復(fù)雜性增加,層次不分明,而且代碼的可重用性也不好。通用中斷子系統(tǒng)的原型最初出現(xiàn)于ARM體系中,一開始內(nèi)核的開發(fā)者們把3種中斷類型區(qū)分出來(電平中斷、邊緣中斷、簡(jiǎn)易中斷),后來又針對(duì)某些需要回應(yīng)eoi(end of interrupt)的中斷控制器,加入了fast eoi type,針對(duì)smp加入了per cpu type。把這些不同的中斷類型抽象出來后,成為了中斷子系統(tǒng)的流控層。要使所有的體系架構(gòu)都可以重用這部分的代碼,中斷控制器也被進(jìn)一步地封裝起來,形成了中斷子系統(tǒng)中的芯片級(jí)硬件封裝層。

 

二、芯片級(jí)硬件封裝層

中斷系統(tǒng)與CPU硬件關(guān)系密切,linux系統(tǒng)為了兼容各種型號(hào)的CPU,提供了對(duì)于各種CPU的特性及其中斷控制器的底層封裝,這樣就可以把底層的硬件實(shí)現(xiàn)盡可能地隱藏起來,使得驅(qū)動(dòng)程序的開發(fā)人員不用關(guān)注底層的實(shí)現(xiàn)。該部分主要工作是:

  • 實(shí)現(xiàn)不同CPU的中斷入口,初始化中斷向量表,該部分通常由匯編實(shí)現(xiàn)。
  • 對(duì)中斷控制器實(shí)現(xiàn)軟件抽象(struct irq_chip),源碼路徑如:” arch/arm/plat-s3c24xx/irq.c”

該部分初始化過程中,系統(tǒng)根據(jù)設(shè)備使用的中斷控制器的類型,實(shí)現(xiàn)irq_chip結(jié)構(gòu)中的接口,并把該irq_chip實(shí)例注冊(cè)到irq_desc.irq_data.chip字段中,這樣各個(gè)irq和中斷控制器就進(jìn)行了關(guān)聯(lián),只要知道irq編號(hào),即可得到對(duì)應(yīng)到irq_desc結(jié)構(gòu),進(jìn)而可以通過chip指針訪問中斷控制器。 其初始化流程如下圖所示:

 

三、中斷流控層

由linux內(nèi)核提供,所謂中斷流控是指合理并正確地處理連續(xù)發(fā)生的中斷,比如一個(gè)中斷在處理中,同一個(gè)中斷再次到達(dá)時(shí)如何處理,何時(shí)應(yīng)該屏蔽中斷,何時(shí)打開中斷,何時(shí)回應(yīng)中斷控制器等一系列的操作。該層實(shí)現(xiàn)了與體系和硬件無關(guān)的中斷流控處理操作,它針對(duì)不同的中斷電氣類型(level,edge......),實(shí)現(xiàn)了對(duì)應(yīng)的標(biāo)準(zhǔn)中斷流控處理函數(shù),在這些處理函數(shù)中,最終會(huì)把中斷控制權(quán)傳遞到驅(qū)動(dòng)程序注冊(cè)中斷時(shí)傳入的處理函數(shù)或者是中斷線程中。

目前的通用中斷子系統(tǒng)實(shí)現(xiàn)了以下這些標(biāo)準(zhǔn)流控回調(diào)函數(shù),這些函數(shù)都定義在:”kernel/irq/chip.c”中,

handle_simple_irq 用于簡(jiǎn)易流控處理;

handle_level_irq 用于電平觸發(fā)中斷的流控處理;

handle_edge_irq 用于邊沿觸發(fā)中斷的流控處理;

handle_fasteoi_irq 用于需要響應(yīng)eoi的中斷控制器;

handle_percpu_irq 用于只在單一cpu響應(yīng)的中斷;

handle_nested_irq 用于處理使用線程的嵌套中斷;

以下這個(gè)序列圖展示了整個(gè)通用中斷子系統(tǒng)的中斷響應(yīng)過程,flow_handle一欄就是中斷流控層的生命周期:

四、中斷驅(qū)動(dòng)接口層

由linux內(nèi)核提供,驅(qū)動(dòng)程序的開發(fā)者通常只會(huì)使用到這一層提供的這些接口即可完成驅(qū)動(dòng)程序的開發(fā)工作,其他的細(xì)節(jié)都由另外幾個(gè)軟件層較好地“隱藏”起來了,驅(qū)動(dòng)程序開發(fā)者無需再關(guān)注底層的實(shí)現(xiàn)。該部分向驅(qū)動(dòng)程序提供的一系列的編程,用于向系統(tǒng)申請(qǐng)/釋放中斷,打開/關(guān)閉中斷,設(shè)置中斷類型和中斷喚醒系統(tǒng)的特性等操作。常用的一些接口如:

  • l request_irq(unsigned int irq, irq_handler_t handler,

unsigned long irqflags, const char *devname, void *dev_id)

用來向Linux申請(qǐng)中斷。

irq是要申請(qǐng)的硬件中斷號(hào)。

handler是向系統(tǒng)注冊(cè)的中斷處理函數(shù)。

irqflags是中斷處理的屬性,一般用來指定相應(yīng)的中斷流控。

devname設(shè)置中斷名稱,通常是在cat /proc/interrupts中可以看到此名稱。

dev_id在中斷共享時(shí)會(huì)用到,一般設(shè)置為這個(gè)設(shè)備的設(shè)備結(jié)構(gòu)體或者NULL。

  • enable_irq(unsigned int irq)

用來打開中斷。

  • disable_irq(unsigned int irq)

用來關(guān)閉中斷。

  • irq_set_chip(irq, *chip)

設(shè)置中斷控制器

  • irq_set_handler(irq,handle)

設(shè)置中斷流控

中斷子系統(tǒng)內(nèi)部定義了幾個(gè)重要的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)的各個(gè)字段控制或影響著中斷子系統(tǒng)和各個(gè)irq的行為和實(shí)現(xiàn)方式。例如:irq_desc,irq_chip,irq_data,irqaction,等等。其中 irq_desc[NR_IRQS]數(shù)組是linux內(nèi)核中用于維護(hù)IRQ資源的管理單元,它記錄了某IRQ號(hào)對(duì)應(yīng)的流控處理函數(shù),中斷控制器、中斷服務(wù)程序、IRQ自身的屬性、資源等,是內(nèi)核中斷子系統(tǒng)的一個(gè)核心數(shù)組,中斷驅(qū)動(dòng)接口“request_irq()”就是通過修改該數(shù)組以實(shí)現(xiàn)中斷的注冊(cè)。

五、中斷驅(qū)動(dòng)程序設(shè)計(jì)

有了前幾層所做的貢獻(xiàn),使得我們進(jìn)行l(wèi)inux中斷驅(qū)動(dòng)設(shè)計(jì)變得異常簡(jiǎn)單。一般情況下,我們只需要使用”request_irq”函數(shù)向內(nèi)核注冊(cè)相應(yīng)的中斷號(hào)及其中斷服務(wù)程序,然后調(diào)用“enable_irq”“disable_irq”開開或關(guān)閉中斷即可。其流程如下圖所示:

六、中斷服務(wù)程序設(shè)計(jì)

當(dāng)CPU收到中斷,就會(huì)執(zhí)行相應(yīng)中斷服務(wù)程序,我們知道CPU在執(zhí)行中斷服務(wù)程序時(shí)是不能執(zhí)行其他程序的,甚至此時(shí)CPU不能響應(yīng)某些優(yōu)先級(jí)比它低的中斷,如果CPU一直長(zhǎng)時(shí)間執(zhí)行某個(gè)中斷服務(wù)程序,勢(shì)必影響系統(tǒng)的響應(yīng)速度,降低了系統(tǒng)性能。為此Linux中斷子系統(tǒng)將中斷分為了中斷上文和中斷下文,中斷上文用來執(zhí)行一些緊迫的程序,中斷下文用來執(zhí)行一些不緊急的可延后執(zhí)行的程序。Linux提供了三種機(jī)制來處理中斷下文:Soft irq(軟中斷)、Tasklet、work_queue(工作隊(duì)列)。

Ø 軟中斷

Ø Tasklet

Ø Work_queue 

責(zé)任編輯:龐桂玉 來源: 嵌入式Linux中文站
相關(guān)推薦

2009-10-12 12:46:55

Linux內(nèi)核SCSI IO

2021-08-10 11:30:30

Linux代碼中斷控制器

2021-08-03 15:10:26

Linux代碼驅(qū)動(dòng)

2021-12-08 08:41:31

Linux 中斷子系統(tǒng)Linux 系統(tǒng)

2021-12-10 08:45:45

Linux GIC Linux 系統(tǒng)

2021-12-14 08:51:23

Linux 中斷子系統(tǒng)Linux 系統(tǒng)

2017-06-30 10:36:27

Linux系統(tǒng)分析工具

2009-12-16 17:36:02

2009-04-21 13:54:20

2009-07-06 17:40:05

JSP HTTP服務(wù)器

2009-07-31 11:30:05

光纜線路監(jiān)測(cè)

2010-06-18 11:16:52

UML面向?qū)ο?/a>

2021-05-06 07:53:20

LinuxUBI子系統(tǒng)

2015-08-17 09:46:45

大數(shù)據(jù)

2009-12-31 14:41:20

RADIUS服務(wù)器

2022-12-07 15:56:33

procfsLiteOS-A

2017-02-28 18:26:09

Linuxinput子系統(tǒng)編程

2021-07-22 08:03:08

Windows 操作系統(tǒng)Linux

2025-05-14 09:12:13

2015-10-09 10:19:48

大數(shù)據(jù)醫(yī)療健康
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲视频免费在线观看 | 91久久久久 | 国产精品一区二区久久 | 欧美精品久久久久久久久久 | 精品一区二区三区在线视频 | 成年网站在线观看 | 中文字幕亚洲一区二区三区 | 免费成人在线网站 | 日本天堂视频 | 中文字幕第一页在线 | 一级毛片视频在线观看 | 国产精品99免费视频 | 国产福利网站 | 国产四虎 | 日韩综合网 | 亚洲视频在线免费观看 | 日本成人中文字幕 | 亚洲在线一区 | 色天天综合 | 免费一级欧美在线观看视频 | 午夜影院在线观看版 | 偷拍自拍网 | 国产区视频在线观看 | 国产免费xxx | 久久精品一区二区三区四区 | 在线中文字幕视频 | 91看片网 | 亚洲国产成人av好男人在线观看 | 美女视频h| 精品视频一区二区三区在线观看 | 国产精品一二区 | 国产在线播放av | 黄色在线免费看 | 国产精品69久久久久水密桃 | 精品中文视频 | 精品1区2区 | 午夜成人免费电影 | 亚洲一二三在线观看 | 99精品免费视频 | 一级片av| 亚洲第一天堂 |