kernel 中斷

中斷#

中斷分 向量中斷非向量中斷##

  • 向量中斷由硬件提供中斷服務(wù)程序入口地址
  • 非向量中斷由軟件提供中斷服務(wù)程序入口地址

程序架構(gòu)##

  • top half: 緊急的硬件操作(調(diào)度 bottom half),不可中斷
  • bottom half: 延緩的耗時操作囤攀,可響應(yīng)新的中斷

request & free##

flags若設(shè)置 IRQF_SHARED 善镰,則表示多個設(shè)備共享中斷

使能和屏蔽中斷##

disable_irq_nosync()disable_irq() 的區(qū)別在于前者立即返回翰萨,而后者等待目前的中斷處理完成诊胞。由于 disable_irq() 會等待指定的中斷號被處理完,因此如果在n號中斷頂半部調(diào)用 disable_irq(n) 创南,會引起系統(tǒng)死鎖

底半部##

  1. tasklet
  2. 工作隊(duì)列
  3. 軟中斷
  4. 線程化irq

tasklet###

執(zhí)行上下文是軟中斷

void xxx_do_tasklet(unsigned long);
DECLEAR_TASKLET(xxx_tasklet, xxx_do_tasklet, NULL);

void xxx_do_tasklet(unsigned long)
{
    ...
}

irqreturn_t xxx_interrupt(int irq, void *dev_id)
{
    ...
    tasklet_schedule(&xxx_tasklet);
    ...
}

int __init xxx_init(void)
{
    ...
    result = request_irq(xxx_irq, xxx_interrupt, 0, "xxx", NULL);
    ...
    return IRQ_HANDLED;
}

void __exit xxx_exit(void)
{
    ...
    free_irq(xxx_irq, xxx_interrupt);
    ...
}

工作隊(duì)列###

執(zhí)行上下文是內(nèi)核線程浓恶,可以調(diào)度和睡眠

struct work_struct xxx_wq;
void xxx_do_work(struct work_struct *work);

void xxx_do_work(struct work_struct *work)
{
    ...
}

irqreturn_t irqreturn_t xxx_interrupt(int irq, void *dev_id)
{
    ...
    schedule_work(&xxx_wq);
    ...
    return IRQ_HANDLED;
}

int __init xxx_init(void)
{
    ...
    result = request_irq(xxx_irq, xxx_interrupt, 0, "xxx", NULL);

    INIT_WORK(&xxx_wq, xxx_do_work);
    ...
    return IRQ_HANDLED;
}

void __exit xxx_exit(void)
{
    ...
    free_irq(xxx_irq, xxx_interrupt);
    ...
}

軟中斷###

  • 執(zhí)行上下文是軟中斷
  • 內(nèi)核采用 softirq 的地方包括:
    HI_SOFTIRQ TIMER_SOFTIRQ NET_RX_SOFTIRQ NET_TX_SOFTIRQ SCSI_SOFTIRQ TASKLET_SOFTIRQ

硬件中斷 軟中斷 信號 的區(qū)別
硬中斷是外部設(shè)備對CPU的中斷
軟中斷是中斷底半部的一種處理機(jī)制
信號是由內(nèi)核(或其他進(jìn)程)對某個進(jìn)程的中斷

中斷優(yōu)先級高于軟中斷莺债,軟中斷又高于任何一個線程紧憾。故軟中斷適度線程化到千,可以緩解高負(fù)載下系統(tǒng)的響應(yīng)。

threaded_irq###

  • request_threaded_irq() 參數(shù)handler對應(yīng)的函數(shù)執(zhí)行于中斷上下文赴穗,thread_fn對應(yīng)的函數(shù)執(zhí)行于內(nèi)核線程
  • 如果handler結(jié)束時憔四,返回值是 IRQ_WAKE_THREAD ,內(nèi)核會調(diào)度對應(yīng)線程執(zhí)行thread_fn

中斷共享##

  • 共享中斷 IRQF_SHARED 申請成功的前提是望抽,該中斷未被申請加矛,或該中斷雖然被申請履婉,但之前也以 IRQF_SHARED 標(biāo)志申請
  • request_irq() 參數(shù)dev_id以設(shè)備結(jié)構(gòu)體指針最佳
  • 在中斷到來時煤篙,會遍歷執(zhí)行共享此中斷的所有中斷處理程序,直到某一個程序返回 IRQ_HANDLED 毁腿;故在中斷處理函數(shù)中辑奈,應(yīng)根據(jù)硬件寄存器的信息比對dev_id參數(shù),迅速判斷是否為本設(shè)備中斷已烤,若不是鸠窗,返回 IRQ_NONE
irqreturn_t xxx_interrupt(int irq, void *dev_id)
{
    int status = read_int_status();        /* 獲知中斷源 */
    if (!is_myint(dev_id, status))
        return IRQ_NONE;

    ...

    return IRQ_HANDLED;
}

int xxx_init(void)
{
    result = request_irq(sh_irq, xxx_interrupt, IRQF_SHARED, "xxx", xxx_dev);
    ...
}

void xxx_exit(void)
{
    free_irq(xxx_irq, xxx_interrupt);
    ...
}

內(nèi)核定時器##

  • timer_list

內(nèi)核定時器

struct xxx_dev {
    struct cdev cdev;
    ...
    timer_list xxx_timer;
};

xxx_func1(...)
{
    struct xxx_dev *dev = filp->private;
    ...
    init_timer(&dev->xxx_timer);
    dev->xxx_timer.function = &xxx_do_timer;
    dev->xxx_timer.data = (unsigned long)dev;
    dev->xxx_timer.expires = jiffies + delay;

    add_timer(&dev->xxx_timer);
    ...
}

xxx_func2(...)
{
    del_timer(&dev->xxx_timer);
    ...
}

static void xxx_do_timer(unsigned long arg)
{
    struct xxx_device *dev = (struct xxx_device *)arg;

    dev->xxx_timer.expires = jiffies + delay;
    add_timer(&dev->xxx_timer);
    ...
}
  • delayed_work
    對于周期性任務(wù),除了定時器以外胯究, delayed_work 利用工作隊(duì)列和定時器實(shí)現(xiàn)

內(nèi)核延時##

短延時###

實(shí)現(xiàn)原理本質(zhì)上是忙等待

  • ndelay()
  • udelay()
  • mdelay()

引起進(jìn)程睡眠稍计,類似函數(shù)的精度受系統(tǒng)HZ以及進(jìn)程調(diào)度的影響(實(shí)質(zhì)調(diào)用 schedule_timeout()

  • msleep()
  • msleep_interruptible()
  • ssleep()

長延時###

time_before() & time_after() 判斷調(diào)用時的jiffies和傳入的jiffies之前或之后

防止jiffies被編譯器優(yōu)化,內(nèi)核將其定義為volatile裕循,避免讀合并

睡著延遲###

msleep() 實(shí)質(zhì)調(diào)用 schedule_out() 臣嚣,實(shí)現(xiàn)原理是向系統(tǒng)添加一個定時器净刮,在定時器處理函數(shù) process_timeout() 中喚醒與參數(shù)對應(yīng)的進(jìn)程

sleep_on_timeout() & interruptible_sleep_on_timeout() 將當(dāng)前進(jìn)程添加到等待隊(duì)列,超時發(fā)生時硅则,進(jìn)程喚醒

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淹父,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子怎虫,更是在濱河造成了極大的恐慌暑认,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件大审,死亡現(xiàn)場離奇詭異蘸际,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)徒扶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門捡鱼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酷愧,你說我怎么就攤上這事驾诈。” “怎么了溶浴?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵乍迄,是天一觀的道長。 經(jīng)常有香客問我士败,道長闯两,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任谅将,我火速辦了婚禮漾狼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饥臂。我一直安慰自己逊躁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布隅熙。 她就那樣靜靜地躺著稽煤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪囚戚。 梳的紋絲不亂的頭發(fā)上酵熙,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機(jī)與錄音驰坊,去河邊找鬼匾二。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的察藐。 我是一名探鬼主播借嗽,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼转培!你這毒婦竟也來了恶导?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤浸须,失蹤者是張志新(化名)和其女友劉穎惨寿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體删窒,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡裂垦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肌索。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蕉拢。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖诚亚,靈堂內(nèi)的尸體忽然破棺而出晕换,到底是詐尸還是另有隱情,我是刑警寧澤站宗,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布闸准,位于F島的核電站,受9級特大地震影響梢灭,放射性物質(zhì)發(fā)生泄漏夷家。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一敏释、第九天 我趴在偏房一處隱蔽的房頂上張望库快。 院中可真熱鬧,春花似錦钥顽、人聲如沸义屏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽湿蛔。三九已至,卻和暖如春县爬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背添谊。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工财喳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓耳高,卻偏偏與公主長得像扎瓶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泌枪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 又來到了一個老生常談的問題概荷,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢? 今天就這個問題開始碌燕,來談?wù)劜?..
    tangsl閱讀 4,127評論 0 23
  • 從本質(zhì)上講误证,中斷(硬)是一種電信號,當(dāng)設(shè)備有某種事情發(fā)生的時候修壕,他就會產(chǎn)生中斷愈捅,通過總線把電信號發(fā)送給中斷控制器。...
    Joe_HUST閱讀 22,714評論 0 10
  • 1 中斷介紹 1.1 簡介 中斷控制是計(jì)算機(jī)發(fā)展中一種重要的技術(shù)慈鸠。最初它是為克服對I/O接口控制采用程序查詢所帶來...
    瘋狂小王子閱讀 8,081評論 0 9
  • 1 臨界區(qū) 1.1簡介 在早期計(jì)算機(jī)系統(tǒng)中蓝谨,只有一個任務(wù)進(jìn)程在執(zhí)行,并不存在資源的共享與競爭青团。隨著技術(shù)和需求的飛速...
    Fly晴天里Fly閱讀 9,036評論 2 13
  • 反復(fù)無常譬巫。我
    a05f63aaac2d閱讀 169評論 0 0