亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

中斷——中斷描述符表的定義和初始化(二) (基于3.16-rc4)

2024-06-28 13:25:07
字體:
來源:轉載
供稿:網友
中斷——中斷描述符表的定義和初始化(二) (基于3.16-rc4)

上篇博文對中斷描述符表(IDT)中異常和非屏蔽中斷部分的初始化做了說明,這篇文章將分析外部中斷部分的初始化。

在上篇博文中,可以看到,內核在setup_once匯編片段中,對中斷和異常部分做了初步的初始化,用early_idt_handlers函數的地址來初始化異常門描述符,用ignore_int函數地址來初始化剩下的中斷門描述符。接著,內核在trap_init函數中對IDT做了進一步的初始化,用有效的異常處理程序來初始化中斷向量號為0-31的描述符。細心的你應該可以發現,在這一步初始化過程中,僅僅對異常和非屏蔽中斷做了初始化(也就是中斷向量號前32個),并沒有對后256-32=224個中斷門描述符初始化,也就是說后244個中斷門描述符依然指向的是ignore_int這個無用的函數。下面將分析中斷門描述符的最終初始化。首先介紹下interrupt全局數組,該數組中裝有了所有的中斷處理程序,如下所示:(arch/x86/kernel/entrt_32.S)

 1 .section .init.rodata,"a" 2 ENTRY(interrupt) 3 .section .entry.text, "ax" 4     .p2align 5 5     .p2align CONFIG_X86_L1_CACHE_SHIFT 6 ENTRY(irq_entries_start) 7     RING0_INT_FRAME 8 vector=FIRST_EXTERNAL_VECTOR 9 .rept (NR_VECTORS-FIRST_EXTERNAL_VECTOR+6)/710     .balign 3211   .rept    712     .if vector < NR_VECTORS13       .if vector <> FIRST_EXTERNAL_VECTOR14     CFI_ADJUST_CFA_OFFSET -415       .endif16 1:    pushl_cfi $(~vector+0x80)    /* Note: always in signed byte range */17       .if ((vector-FIRST_EXTERNAL_VECTOR)%7) <> 618     jmp 2f19       .endif20       .PRevious21     .long 1b22       .section .entry.text, "ax"23 vector=vector+124     .endif25   .endr26 2:    jmp common_interrupt27 .endr28 END(irq_entries_start)29 30 .previous31 END(interrupt)32 .previous

這段代碼定義了一個interrupt全局數組,如果不懂ATT匯編的話,這段代碼看起來非常吃力。下面筆者粗略分析下這段代碼,第1行聲明了一個數據段,第2行給這個數據段起了個名字,叫做‘inerrupt’,第3行又聲明了一個代碼段,該代碼段被包在了前邊的數據段當中,從第6行可看出這個代碼段名字叫做‘irq_entries_start’。接著4-5行說明了代碼段對齊的方式,接下來第7行給vector進行賦值,vector=32,實際上,interrup這個數組中存放的全是外部中斷,沒有異常,異常初始化已經在trap_init函數中完成了,而外部中斷的向量號從32開始,所以vector賦值32。接下來在第9,11行大家可以看到出現了偽指令.rept,這個偽指令是循環的意思,你可以把它當成for循環去理解,指令后邊的數字是循環次數。這個偽指令實際上告訴編譯器要把后邊的內容在內存中復制若干次。第9行的(NR_VECTORS-FIRST_EXTERNAL_VECTOR+6)/7值為32,要求其后的內容被循環復制32次。因此第9行和第11行合起來,就相當于一個雙重for循環,總共循環32*7=224次,這剛好就是外部中斷向量號的數量,每執行一次內部循環,就將一個外部中斷處理程序放入了一個數組元素中。接著第20行出現了.previous偽指令。該指令的意思是返回到上一個段中,在這里就是要返回到interrupt數據段中,第21行,在interrupt數據段中定義了一個long型數據,值為標號1,標號1實際上就是第16行代碼的地址。接著第22行又回到了當前代碼段中,讓vector自加1,然后第25行進入內重循環的下一次循環。第26行,標號2的這個指令夾在了內外兩重循環之間,說明每執行7次內循環就要將jmp common_interrupt復制一次。然后第27行進入外重循環的下一次循環??偣矆绦?2*7次循環后,這段代碼就結束了。通過使用.preivous偽指令,最終實際上就定義了兩個數組,一個是interrput數組,該數組的每個元素均為.long 1b(第21行),另外一個數組是irq_entries_start,該數組每個元素中放入了若干條匯編指令(16-18行,26行)。這就是.previous的用處,每在irq_entries_start數組中初始化完一個元素,立馬返回到interrupt數組中定義一個指向irq_entries_start數組中剛初始化過的元素的指針(.long 1b),作為interrupt數組的元素。最終interrput數組中存放了224個指針(每個中斷處理程序的地址),分別指向了irq_entries_start數組中的對應元素。irq_entries_start數組每個元素存放的是幾條匯編指令(這些匯編指令就是中斷處理程序的開頭公共部分)。而且,通過第26行,可以看到,irq_entries_start數組每個元素都包含jmp common_interrupt指令,跳入到一段公共的代碼中。

上邊的工作,內核只是把所有的外部中斷處理程序用兩個數組管理起來了,接下來,就要在IDT(中斷描述符表)中初始化所有外部中斷的門描述符。代碼如下:(arch/x86/kernel/irqinit.c)

 1 void __init native_init_IRQ(void) 2 { 3     int i; 4  5     /* Execute any quirks before the call gates are initialised: */ 6     x86_init.irqs.pre_vector_init(); 7  8     apic_intr_init(); 9 10     /*11      * Cover the whole vector space, no vector can escape12      * us. (some of these will be overridden and become13      * 'special' SMP interrupts)14      */15     i = FIRST_EXTERNAL_VECTOR;16     for_each_clear_bit_from(i, used_vectors, NR_VECTORS) {17         /* IA32_SYSCALL_VECTOR could be used in trap_init already. */18         set_intr_gate(i, interrupt[i - FIRST_EXTERNAL_VECTOR]);19     }20 21     if (!acpi_ioapic && !of_ioapic)22         setup_irq(2, &irq2);23 24 #ifdef CONFIG_X86_3225     irq_ctx_init(smp_processor_id());26 #endif27 }

從16-19行,可以看出,用interrupt數組中存放的所有中斷處理程序地址來初始化IDT的中斷門描述符。set_intr_gate函數上篇博文已經分析過來,這里不再分析。

至此,所有IDT中的異常和中斷門描述符就初始化完成了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产午夜精品视频免费不卡69堂| 亚洲影视中文字幕| 亚洲精品之草原avav久久| 日本91av在线播放| 国产亚洲一级高清| 欧美黑人极品猛少妇色xxxxx| 亚洲激情久久久| 日韩高清电影好看的电视剧电影| 亚洲加勒比久久88色综合| 久久精品国产电影| 亚洲亚裔videos黑人hd| 亚洲一区免费网站| 深夜福利日韩在线看| 国产精品99久久久久久www| 亚洲成人av资源网| 精品久久久香蕉免费精品视频| 日本精品性网站在线观看| 97福利一区二区| 日韩毛片在线观看| 亚洲欧美综合另类中字| 日韩专区中文字幕| 久久视频在线直播| 中文字幕精品—区二区| 中文字幕精品网| 欧美一级电影久久| 国产精品色午夜在线观看| 日韩亚洲成人av在线| 精品少妇一区二区30p| 国产成人aa精品一区在线播放| 国产亚洲激情视频在线| 亚洲精品视频在线观看视频| 丝袜美腿精品国产二区| 亚洲www视频| 亚洲最新在线视频| 91av在线国产| 亚洲福利视频久久| 欧美乱妇40p| 日韩精品免费综合视频在线播放| 国产精品三级在线| 蜜臀久久99精品久久久无需会员| 欧美电影免费观看电视剧大全| 清纯唯美亚洲激情| 精品无人区乱码1区2区3区在线| 国产一区二区三区在线看| 欧洲日韩成人av| 亚洲网址你懂得| 精品国产精品三级精品av网址| 亚洲一区二区三区四区在线播放| 精品久久久久久久久久久久久久| 欧美激情啊啊啊| 国产成人亚洲综合青青| 亚洲成人黄色在线| 一区二区三区天堂av| 富二代精品短视频| 亚洲精品日韩av| 欧美精品在线视频观看| 欧美激情在线狂野欧美精品| 国产ts一区二区| 国产精品青草久久久久福利99| 久久精品亚洲94久久精品| 亚洲第一网站男人都懂| 国产精品第一区| 97视频在线观看成人| 动漫精品一区二区| 搡老女人一区二区三区视频tv| 亚洲aⅴ日韩av电影在线观看| 欧美性xxxxxxxxx| 国语对白做受69| 久久精品影视伊人网| 一区二区三区视频免费在线观看| 国产日本欧美一区二区三区| 在线午夜精品自拍| 亚洲一区二区三区乱码aⅴ| 国产视频精品xxxx| 91在线看www| 在线国产精品视频| xvideos国产精品| 亚洲香蕉av在线一区二区三区| 国产aⅴ夜夜欢一区二区三区| 欧美日韩国产中文精品字幕自在自线| 日本成人精品在线| 在线看片第一页欧美| www.精品av.com| 亚洲人成毛片在线播放| 91精品成人久久| 精品久久中文字幕久久av| 国产精品高潮呻吟久久av无限| 韩国三级日本三级少妇99| 亚洲精品中文字幕av| 国产欧美va欧美va香蕉在线| 久久伊人精品一区二区三区| 精品无人区太爽高潮在线播放| 午夜精品视频在线| 5252色成人免费视频| 国产精品手机播放| 97精品国产97久久久久久春色| 亚洲精美色品网站| 欧美激情精品久久久久久久变态| 亚洲 日韩 国产第一| 久久免费视频在线| 26uuu另类亚洲欧美日本老年| 国产精品免费福利| 亚洲成人网在线| 日韩高清免费观看| 国产91精品视频在线观看| 国产欧美最新羞羞视频在线观看| 日韩成人av在线| 国产精品视频资源| 在线视频欧美日韩精品| 97超碰色婷婷| 亚洲欧美精品伊人久久| 久久久久久九九九| 欧美激情精品久久久久久大尺度| 亚洲女同精品视频| 欧美国产日韩一区二区在线观看| 久久国产精品久久久久久| 欧美一级视频免费在线观看| 亚洲第一福利网| 久久久国产影院| 欧美美最猛性xxxxxx| 91系列在线观看| 欧美亚洲成人网| 2019中文字幕免费视频| 日韩精品在线免费观看| 成人国产精品色哟哟| 欧美理论在线观看| 亚洲欧美精品中文字幕在线| 欧美老女人在线视频| 日韩在线视频网站| 中文字幕日韩欧美在线| 国产精品情侣自拍| 国产91成人在在线播放| 亚洲精品国产欧美| zzijzzij亚洲日本成熟少妇| 91在线观看欧美日韩| 97视频在线观看播放| 久久久久久久久电影| 91免费在线视频网站| 亚洲在线视频福利| 81精品国产乱码久久久久久| 久久精品国产一区| 欧美日韩国产中字| 久久99精品视频一区97| 亚洲欧美日韩国产中文专区| 精品亚洲aⅴ在线观看| 亚洲福利视频在线| 精品国产网站地址| 中文字幕亚洲一区二区三区| 777国产偷窥盗摄精品视频| 欧美午夜丰满在线18影院| 综合激情国产一区| 国产精品爱久久久久久久| 欧美猛男性生活免费| 亚洲国产日韩欧美在线动漫| 国产亚洲精品高潮| 色999日韩欧美国产| 97精品国产91久久久久久| 精品一区二区电影| 日韩欧美在线观看视频| 欧美精品免费在线| 狠狠操狠狠色综合网| 久久国产天堂福利天堂| 热久久免费国产视频| 性色av一区二区咪爱|