




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第五章第五章 中斷與異常中斷與異常中斷的基本知識(shí)中斷描述符表的初始化中斷處理中斷的下半部處理機(jī)制中斷的應(yīng)用時(shí)鐘中斷數(shù)據(jù)傳送控制方式選擇和衡量控制方式的原則:選擇和衡量控制方式的原則: 數(shù)據(jù)傳送速度足夠高數(shù)據(jù)傳送速度足夠高 系統(tǒng)開銷小,所需的處理控制程序少;系統(tǒng)開銷小,所需的處理控制程序少; 能充分發(fā)揮硬件資源的能力;能充分發(fā)揮硬件資源的能力;數(shù)據(jù)傳送控制方式 程序直接控制方式程序直接控制方式 中斷控制方式中斷控制方式 DMA方式方式 通道方式通道方式Programmed Direct Control否否外圍設(shè)備外圍設(shè)備做接收或發(fā)送數(shù)據(jù)準(zhǔn)備做接收或發(fā)送數(shù)據(jù)準(zhǔn)備接收到接收到start命令命令標(biāo)志觸
2、發(fā)器置標(biāo)志觸發(fā)器置“done”等待等待CPU來的下條指令來的下條指令準(zhǔn)備完畢?準(zhǔn)備完畢?是是否否CPU發(fā)發(fā)start命令命令等等 待待執(zhí)行下條指令執(zhí)行下條指令開始數(shù)據(jù)傳送開始數(shù)據(jù)傳送設(shè)備標(biāo)志觸發(fā)設(shè)備標(biāo)志觸發(fā)器為器為done”?是是(a)(b) 優(yōu)點(diǎn):控制簡單,不需要多少硬件支持 缺點(diǎn):1.CPU和外設(shè)只能串行工作;2. CPU在一段時(shí)間內(nèi)只能和一臺(tái)外設(shè)交換數(shù)據(jù),不能實(shí)現(xiàn)設(shè)備間的并行操作;3.無法發(fā)現(xiàn)和處理由于設(shè)備和其他硬件所產(chǎn)生的錯(cuò)誤。Interrupt中斷控制方式的處理過程接收到接收到CPU發(fā)來的發(fā)來的start指令指令準(zhǔn)備數(shù)據(jù)并將其準(zhǔn)備數(shù)據(jù)并將其置入緩沖寄存器置入緩沖寄存器緩沖寄存器滿嗎?
3、緩沖寄存器滿嗎?控制器發(fā)中斷信號(hào)控制器發(fā)中斷信號(hào)向設(shè)備發(fā)向設(shè)備發(fā)start指令指令將中斷允許位置將中斷允許位置1調(diào)度程序調(diào)度調(diào)度程序調(diào)度其他進(jìn)程其他進(jìn)程其他進(jìn)程執(zhí)行其他進(jìn)程執(zhí)行收到中斷信號(hào)了嗎?收到中斷信號(hào)了嗎?中斷處理中斷處理被中斷進(jìn)程執(zhí)行被中斷進(jìn)程執(zhí)行否否否否是是是設(shè)備設(shè)備CPU 優(yōu)點(diǎn):并行操作優(yōu)點(diǎn):并行操作 缺點(diǎn):缺點(diǎn):1.I/O控制器的數(shù)據(jù)緩沖寄存器滿,就會(huì)發(fā)中斷??刂破鞯臄?shù)據(jù)緩沖寄存器滿,就會(huì)發(fā)中斷。 此寄存器一般較小,則在一次數(shù)據(jù)傳送過程中,中斷此寄存器一般較小,則在一次數(shù)據(jù)傳送過程中,中斷次數(shù)較多,將耗去大量次數(shù)較多,將耗去大量CPU時(shí)間;時(shí)間; 若設(shè)備間并行操作,則中斷次數(shù)增加
4、,造成若設(shè)備間并行操作,則中斷次數(shù)增加,造成CPU無無法響應(yīng)中斷和數(shù)據(jù)丟失。法響應(yīng)中斷和數(shù)據(jù)丟失。2.中斷方式是假設(shè)外設(shè)速度很低。如果外設(shè)速度很高,中斷方式是假設(shè)外設(shè)速度很低。如果外設(shè)速度很高,則造成則造成CPU來不及取走數(shù)據(jù)緩沖寄存器中的數(shù)據(jù),來不及取走數(shù)據(jù)緩沖寄存器中的數(shù)據(jù),造成數(shù)據(jù)丟失。造成數(shù)據(jù)丟失。 中斷控制的主要優(yōu)點(diǎn):中斷控制的主要優(yōu)點(diǎn): CPU只有在只有在I/O需要服務(wù)時(shí)才響應(yīng)。需要服務(wù)時(shí)才響應(yīng)。 外部中斷:外部中斷: 外部設(shè)備所發(fā)出的外部設(shè)備所發(fā)出的I/O請(qǐng)求。請(qǐng)求。 內(nèi)部中斷:內(nèi)部中斷: 也稱之為也稱之為“異常異?!?,是為解決機(jī)器運(yùn),是為解決機(jī)器運(yùn)行時(shí)所出現(xiàn)的某些隨機(jī)事件及編程
5、方行時(shí)所出現(xiàn)的某些隨機(jī)事件及編程方便而出現(xiàn)的。便而出現(xiàn)的。中斷掠影中斷掠影 中斷向量中斷向量 :8位無符號(hào)整數(shù)位無符號(hào)整數(shù) 中斷源的編號(hào) 0255 外設(shè)可屏蔽中斷:外設(shè)可屏蔽中斷:3247 屏蔽外部I/O請(qǐng)求 中斷線、IRQ 異常及非屏蔽中斷異常及非屏蔽中斷 :031 異常:CPU內(nèi)部中斷 非屏蔽中斷:計(jì)算機(jī)內(nèi)部硬件出錯(cuò)引起的異常 軟中斷:軟中斷:48255 中斷描述符表中斷描述符表 : 描述中斷的相關(guān)信息 中斷相關(guān)的匯編指令中斷相關(guān)的匯編指令 :5.1 中斷的基本知識(shí)中斷的基本知識(shí) 中斷向量中斷向量每個(gè)中斷源都被分配一個(gè)作為類型碼,即中斷向量。(0255) 中斷的種類:中斷的種類: 中斷:
6、外部可屏蔽中斷 外部非屏蔽中斷 異常:不使用中斷控制器,不能被屏蔽 故障 陷阱中斷向量中斷源的類型中斷向量中斷源的類型Intel x86通過兩片中斷控制器8259A來響應(yīng)15個(gè)外中斷源,每個(gè)8259A可管理8個(gè)中斷源。外部設(shè)備擁有相應(yīng)權(quán)限時(shí) ,可以向特定的中斷線中斷線發(fā)送中斷請(qǐng)求信號(hào)IRQ。 外部I/O請(qǐng)求的屏蔽: 從CPU的角度, 清除eflag的中斷標(biāo)志位(關(guān)中斷) 從中斷控制器的角度,將中斷屏蔽寄存器的相應(yīng)位置位外設(shè)可屏蔽中斷外設(shè)可屏蔽中斷 異常就是CPU內(nèi)部內(nèi)部出現(xiàn)的中斷,即在CPU執(zhí)行特定指令時(shí)出現(xiàn)的非法情況。 非屏蔽中斷就是計(jì)算機(jī)內(nèi)部硬件出錯(cuò)計(jì)算機(jī)內(nèi)部硬件出錯(cuò)時(shí)引起的異常情況。 I
7、ntel把非屏蔽中斷作為一種異常來處理。 在CPU執(zhí)行一個(gè)異常處理程序時(shí),就不再為其他異常或可屏蔽中斷請(qǐng)求服務(wù)。 異常及非屏蔽中斷 Intel x86處理器發(fā)布了大約20種異常(具體數(shù)字與處理器模式有關(guān))。Linux內(nèi)核必須為每種異常提供一個(gè)專門的異常處理程序。 異常及非屏蔽中斷 中斷描述符表(中斷描述符表(IDT):即中斷向量表,每個(gè)):即中斷向量表,每個(gè)中斷占據(jù)一個(gè)表項(xiàng)(門描述符,中斷占據(jù)一個(gè)表項(xiàng)(門描述符,8字節(jié))。字節(jié))。中斷描述符表中斷描述符表 (1)中斷門(Interrupt gate):類型碼為類型碼為110110,請(qǐng)求特權(quán)級(jí)請(qǐng)求特權(quán)級(jí)(DPLDPL)為)為0 0。 中斷門包含了
8、一個(gè)中斷或異常處理程序所在段的選擇符和段內(nèi)偏移量。l(2)陷阱門(Trap gate):類型碼為類型碼為111,與中斷門類似,其唯一的區(qū)別是,不關(guān)中斷。 (3)系統(tǒng)門(System gate):Linux內(nèi)核特別設(shè)置的,用來讓用戶態(tài)的進(jìn)程訪問Intel的陷阱門,DPL為為3。系統(tǒng)調(diào)用系統(tǒng)調(diào)用就是通過系統(tǒng)門進(jìn)入內(nèi)核的。 中斷描述符表寄存器中斷描述符表寄存器IDTR: :存放中斷描述符表在內(nèi)存的起始地址。中斷描述符表寄存器IDTR是一個(gè)48位的寄存器位的寄存器,其低16位保存中斷描述符表的大小,高32位保存中斷描述符表的基址。中斷描述符表中斷描述符表 調(diào)用過程指令CALL : CALL 過程名過程
9、名 調(diào)用中斷過程的指令調(diào)用中斷過程的指令I(lǐng)NT INT 中斷向量中斷向量 (0255) 中斷返回指令I(lǐng)RET IRET 加載中斷描述符表的指令LIDT LIDT 48位的偽描述符位的偽描述符 相關(guān)匯編指令相關(guān)匯編指令 Linux內(nèi)核在系統(tǒng)的初始化階段要初始化可編程控可編程控制器制器8259A;將中斷描述符表的起始地址裝入將中斷描述符表的起始地址裝入IDTR寄存器寄存器,并,并初始化表中的每一項(xiàng)初始化表中的每一項(xiàng)。 當(dāng)計(jì)算機(jī)運(yùn)行在實(shí)模式實(shí)模式時(shí),中斷描述符表被初始化,并由BIOS使用 。 真正進(jìn)入了Linux內(nèi)核,中斷描述符表就被移到內(nèi)存的另一個(gè)區(qū)域,并為進(jìn)入保護(hù)模式保護(hù)模式進(jìn)行預(yù)初始化:用匯編
10、指令LIDT對(duì)中斷向量表寄存器IDTR進(jìn)行初始化,即把IDTR置為0;把中斷描述符表IDT的起始地址裝入IDTR;填充中斷描述表中的256個(gè)表項(xiàng)。5.2 中斷描述符表的初始化中斷描述符表的初始化 IDT表項(xiàng)的設(shè)置通過表項(xiàng)的設(shè)置通過實(shí)現(xiàn)實(shí)現(xiàn) 調(diào)用該函數(shù)在調(diào)用該函數(shù)在IDT表中表中插入一個(gè)中斷門插入一個(gè)中斷門: void set_intr_gate(unsigned int n, void *addr) _set_gate(idt_table+n,14,0,addr); 調(diào)用該函數(shù)在調(diào)用該函數(shù)在IDT表中表中插入一個(gè)陷阱門插入一個(gè)陷阱門:static void _init set_trap_gat
11、e(unsigned int n, void *addr) _set_gate(idt_table+n,15,0,addr); 調(diào)用該函數(shù)在調(diào)用該函數(shù)在IDT表中表中插入一個(gè)系統(tǒng)門插入一個(gè)系統(tǒng)門:static void _init set_system_gate(unsigned int n, void *addr) _set_gate(idt_table+n,15,3,addr); IDT表項(xiàng)的設(shè)置表項(xiàng)的設(shè)置用于設(shè)置中斷描述符表開頭的19個(gè)陷阱門和系統(tǒng)門。 這些中斷向量都是的 ,例: set_trap_gate(0,÷_error); set_trap_gate(1,&a
12、mp;debug); set_trap_gate(19,&simd_coprocessor_error); set_system_gate(SYSCALL_VECTOR,&system_call); 初始化陷阱門和系統(tǒng)門初始化陷阱門和系統(tǒng)門 中斷門的設(shè)置是由中的一段代碼完成的 : 設(shè)置時(shí)必須跳過用于系統(tǒng)調(diào)用的向量0 x80 ,數(shù)組中的每個(gè)元素是指向中斷處理函數(shù)的指針。 中斷門的設(shè)置中斷門的設(shè)置 for (i = 0; i NR_IRQS; i+) int vector = FIRST_EXTERNAL_VECTOR + i; if (vector != SYSCALL_VECT
13、OR) set_intr_gate(vector, interrupti); 中斷和異常的硬件處理 : 從硬件的角度看從硬件的角度看CPU如何處理中斷和異常如何處理中斷和異常 中斷請(qǐng)求隊(duì)列的建立: 方便外設(shè)共享中斷線方便外設(shè)共享中斷線 中斷處理程序的執(zhí)行 從中斷返回: 調(diào)用恢復(fù)中斷現(xiàn)場(chǎng)的宏調(diào)用恢復(fù)中斷現(xiàn)場(chǎng)的宏RESTORE_ALL,徹底從中斷返回徹底從中斷返回 5.3 5.3 中斷處理中斷處理 當(dāng)CPU執(zhí)行了當(dāng)前指令之后,CS和EIP這對(duì)寄存器中所包含的內(nèi)容就是下一條將要執(zhí)行指令的虛地址。 在對(duì)下一條指令執(zhí)行前,CPU先要判斷在執(zhí)行當(dāng)前指令的過程中是否發(fā)生了中斷或異常。 如果發(fā)生了一個(gè)中斷或異
14、常,那么CPU將做以下事情 :中斷和異常的硬件處理中斷和異常的硬件處理 確定所發(fā)生中斷或異常的向量i(在0255之間) 通過IDTR寄存器找到IDT表,讀取IDT表第i項(xiàng)(或叫第i個(gè)門) 分“段”級(jí)、“門”級(jí)兩步進(jìn)行有效性檢查 檢查是否發(fā)生了特權(quán)級(jí)的變化 中斷和異常處理中中斷和異常處理中CPUCPU的工作的工作SSESPEFLAGSCSEIPERROR CODEEFLAGSCSEIPERROR CODE堆棧增長方向中斷發(fā)生前夕的SS:ESP返回地址錯(cuò)誤碼中斷處理程序堆棧 由于硬件條件的限制,很多硬件設(shè)備 為方便處理,Linux為每條中斷線設(shè)置了一個(gè)。 中斷服務(wù)例程與中斷處理程序 中斷線共享的數(shù)
15、據(jù)結(jié)構(gòu) 注冊(cè)中斷服務(wù)例程中斷請(qǐng)求隊(duì)列的建立中斷請(qǐng)求隊(duì)列的建立 中斷服務(wù)例程(中斷服務(wù)例程(Interrupt Service Routine ):每個(gè)中斷請(qǐng)求都有自):每個(gè)中斷請(qǐng)求都有自己單獨(dú)的中斷服務(wù)例程。己單獨(dú)的中斷服務(wù)例程。 中斷處理程序:共享同一條中斷線中斷處理程序:共享同一條中斷線的所有中斷請(qǐng)求有一個(gè)總的中斷處的所有中斷請(qǐng)求有一個(gè)總的中斷處理程序。理程序。 在在Linux中,中,15條中斷線對(duì)應(yīng)條中斷線對(duì)應(yīng)15個(gè)個(gè)中斷處理程序。中斷處理程序。中斷服務(wù)例程與中斷處理程序中斷服務(wù)例程與中斷處理程序 struct irqaction void (*handler)(int, void *,
16、 struct pt_regs *); unsigned long flags; unsigned long mask; const char *name; void *dev_id; struct irqaction *next; ; Handler:指向一個(gè)具體I/O設(shè)備的中斷服務(wù)例程Flags:用一組標(biāo)志描述中斷線與I/O設(shè)備之間的關(guān)系。 SA_INTERRUPT:中斷處理程序執(zhí)行時(shí)必須禁止中斷 SA_SHIRQ:允許其它設(shè)備共享這條中斷線。 SA_SAMPLE_RANDOM:內(nèi)核可以用它做隨機(jī)數(shù)產(chǎn)生器。 SA_PROBE:內(nèi)核正在使用這條中斷線進(jìn)行硬件設(shè)備探測(cè)。中斷線共享的數(shù)據(jù)結(jié)構(gòu)中斷
17、線共享的數(shù)據(jù)結(jié)構(gòu) struct irqaction void (*handler)(int, void *, struct pt_regs *); unsigned long flags; unsigned long mask; const char *name; void *dev_id; struct irqaction *next; ; NameName:I/O設(shè)備名 dev_iddev_id:指定I/O設(shè)備的主設(shè)備號(hào)和次設(shè)備號(hào)(參見第9章)。 NextNext:指向irqaction描述符鏈表的下一個(gè)元素 中斷線共享的數(shù)據(jù)結(jié)構(gòu)中斷線共享的數(shù)據(jù)結(jié)構(gòu) 初始化IDT表之后,必須通過 將相應(yīng)的
18、中斷服務(wù)例程掛入中斷請(qǐng)求隊(duì)列,即對(duì)其進(jìn)行。 在關(guān)閉設(shè)備時(shí),必須通過調(diào)用釋放所申請(qǐng)的中斷請(qǐng)求號(hào)。 注冊(cè)中斷服務(wù)例程注冊(cè)中斷服務(wù)例程 int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),unsigned long irqflags, const char * devname,void *dev_id) 假定一個(gè)程序要對(duì)dev/fd0/(第一個(gè)軟盤對(duì)應(yīng)的設(shè)備)設(shè)備進(jìn)行訪問,通常將IRQ6分配給軟盤控制器,給定這個(gè)中斷號(hào)6,軟盤驅(qū)動(dòng)程序就可以發(fā)出下列請(qǐng)求,以將其中斷服務(wù)例程掛入中斷請(qǐng)求隊(duì)列:
19、request_irq(6, floppy_interrupt, SA_INTERRUPT|SA_SAMPLE_RANDOM, floppy, NULL); 注冊(cè)中斷服務(wù)例程注冊(cè)中斷服務(wù)例程 所有的中斷處理程序都執(zhí)行四個(gè)基本的操作:所有的中斷處理程序都執(zhí)行四個(gè)基本的操作:在內(nèi)核棧中保存在內(nèi)核棧中保存IRQIRQ的值和寄存器的內(nèi)容。的值和寄存器的內(nèi)容。給與給與IRQIRQ中斷線相連的中斷控制器發(fā)送一個(gè)應(yīng)答,中斷線相連的中斷控制器發(fā)送一個(gè)應(yīng)答,這將允許在這條中斷線上進(jìn)一步發(fā)出中斷請(qǐng)求。這將允許在這條中斷線上進(jìn)一步發(fā)出中斷請(qǐng)求。執(zhí)行共享這個(gè)執(zhí)行共享這個(gè)IRQIRQ的所有設(shè)備的中斷服務(wù)例程的所有設(shè)備的
20、中斷服務(wù)例程(ISRISR)。)。跳到跳到ret_from_intr( )ret_from_intr( )的地址后終止。的地址后終止。中斷處理程序的執(zhí)行中斷處理程序的執(zhí)行 CPU從中斷控制器的一個(gè)端口取得中斷向量取得中斷向量I 根據(jù)I從中斷描述符表IDT中找到相應(yīng)的中斷門找到相應(yīng)的中斷門 從中斷門獲得中斷處理程序獲得中斷處理程序的入口的入口地址地址 判斷是否要進(jìn)行堆棧切換是否要進(jìn)行堆棧切換 調(diào)用調(diào)用do_IRQ()對(duì)所接收的中斷進(jìn)行應(yīng)答 ,并禁止這條中斷線 調(diào)用調(diào)用handle_IRQ_event()()來運(yùn)行對(duì)應(yīng)的中斷服務(wù)例程-。 中斷處理程序的執(zhí)行中斷處理程序的執(zhí)行 IRQn_interr
21、upt: pushl $n-256 jmp common_interruptcommon_interrupt: SAVE_ALL call do_IRQ jmp ret_from_intrdo status |= action-flags; action-handler(irq, action-dev_id, regs); action = action-next; while (action); 當(dāng)處理所有外設(shè)中斷請(qǐng)求的函數(shù)do_IRQ()執(zhí)行時(shí),內(nèi)核棧頂包含的就是do_IRQ()的返回地址,這個(gè)地址指向。 從中斷返回時(shí),CPU要調(diào)用恢復(fù)中斷現(xiàn)恢復(fù)中斷現(xiàn)場(chǎng)的宏場(chǎng)的宏RESTORE_ALL,徹
22、底從中斷返回。 從中斷返回從中斷返回 中斷服務(wù)例程在中斷請(qǐng)求關(guān)閉的條件中斷服務(wù)例程在中斷請(qǐng)求關(guān)閉的條件下執(zhí)行下執(zhí)行, ,避免嵌套使中斷控制復(fù)雜化。避免嵌套使中斷控制復(fù)雜化。 系統(tǒng)不能長時(shí)間關(guān)中斷運(yùn)行,因此內(nèi)系統(tǒng)不能長時(shí)間關(guān)中斷運(yùn)行,因此內(nèi)核應(yīng)核應(yīng),盡,盡其所能把更多的處理向后推遲。其所能把更多的處理向后推遲。 內(nèi)核把中斷處理分為兩部分:內(nèi)核把中斷處理分為兩部分:5.4 中斷的下半部處理機(jī)制 一個(gè)快速的一個(gè)快速的“”來處理來處理,它必須在一個(gè)新的中斷產(chǎn)生之前終止。它必須在一個(gè)新的中斷產(chǎn)生之前終止。 這一部分做的工作很少。這一部分做的工作很少。 運(yùn)行時(shí)是運(yùn)行時(shí)是的,而上半部運(yùn)行的,而上半部運(yùn)行時(shí)是
23、關(guān)中斷的,這是二者之間的主要區(qū)別。時(shí)是關(guān)中斷的,這是二者之間的主要區(qū)別。 LinuxLinux內(nèi)核下半部的實(shí)現(xiàn)機(jī)制在內(nèi)核的演變:內(nèi)核下半部的實(shí)現(xiàn)機(jī)制在內(nèi)核的演變:bottom half(bottom half(簡稱簡稱bh)bh)在在2.42.4以后的版本:小任務(wù)(以后的版本:小任務(wù)(tasklettasklet) 下半部可以在下半部可以在多處理機(jī)多處理機(jī)上并行執(zhí)行,并有助于驅(qū)動(dòng)程序的開發(fā)上并行執(zhí)行,并有助于驅(qū)動(dòng)程序的開發(fā)者進(jìn)行驅(qū)動(dòng)程序的開發(fā)。者進(jìn)行驅(qū)動(dòng)程序的開發(fā)。 下半部是一個(gè)的高優(yōu)先級(jí)小任務(wù)。 bh_base數(shù)組共有32項(xiàng),每一項(xiàng)都是一種下半部。下半部下半部 下半部外部設(shè)備TIMER_BH
24、 定時(shí)器T Q U E U E _ B H 周期性任務(wù)隊(duì)列S E R I A L _ B H 串行端口IMMEDIATE_BH 立即任務(wù)隊(duì)列Linux常用的下半部一個(gè)函數(shù)指針數(shù)組bh_base,它把所有的后半部分都組織起來,其大小為32,數(shù)組中的每一項(xiàng)就是一個(gè)后半部分,即一個(gè)bh 函數(shù)。設(shè)置了兩個(gè)32位無符號(hào)整數(shù)bh_active和bh_mask,每個(gè)無符號(hào)整數(shù)中的一位對(duì)應(yīng)著bh_base中的一個(gè)元素 。在在2.42.4以前的內(nèi)核中,每次執(zhí)行完以前的內(nèi)核中,每次執(zhí)行完do_IRQ()do_IRQ()中的中斷服務(wù)例程以后,以及每中的中斷服務(wù)例程以后,以及每次系統(tǒng)調(diào)用結(jié)束之前,就在一個(gè)叫次系統(tǒng)調(diào)用
25、結(jié)束之前,就在一個(gè)叫do_bottom_halfdo_bottom_half()()的函數(shù)中執(zhí)行相應(yīng)的的函數(shù)中執(zhí)行相應(yīng)的bhbh函數(shù)。函數(shù)。在在do_bottom_halfdo_bottom_half()中對(duì)()中對(duì)bhbh函數(shù)的執(zhí)行是在函數(shù)的執(zhí)行是在關(guān)中斷關(guān)中斷的情況下進(jìn)行的,這是的情況下進(jìn)行的,這是因?yàn)?,?duì)因?yàn)?,?duì)單單CPUCPU來說來說,bh bh 函數(shù)的執(zhí)行可以不嵌套;而對(duì)于函數(shù)的執(zhí)行可以不嵌套;而對(duì)于多多CPUCPU來說來說,在同,在同一時(shí)間內(nèi)最多只允許一個(gè)一時(shí)間內(nèi)最多只允許一個(gè)CPUCPU執(zhí)行執(zhí)行bhbh函數(shù)。函數(shù)。那么,在新內(nèi)核的設(shè)計(jì)中,是改進(jìn)那么,在新內(nèi)核的設(shè)計(jì)中,是改進(jìn)bhb
26、h機(jī)制還是拋棄機(jī)制還是拋棄bhbh機(jī)制,建立一種新的機(jī)機(jī)制,建立一種新的機(jī)制?制?2.42.4選擇了一種折中的辦法,繼續(xù)保留選擇了一種折中的辦法,繼續(xù)保留bhbh機(jī)制,另外增加一種或幾種機(jī)制,機(jī)制,另外增加一種或幾種機(jī)制,并把它們納入一個(gè)統(tǒng)一的框架中,這就是并把它們納入一個(gè)統(tǒng)一的框架中,這就是2.42.4內(nèi)核中的軟中斷(內(nèi)核中的軟中斷(softirqsoftirq)機(jī))機(jī)制。制。軟中斷機(jī)制軟中斷機(jī)制:軟中斷卻在任何時(shí)候都不需要串行化。軟中斷卻在任何時(shí)候都不需要串行化。Tasklet機(jī)制機(jī)制:建立在軟中斷之上,同一個(gè)建立在軟中斷之上,同一個(gè)tasklet只能運(yùn)行在一個(gè)只能運(yùn)行在一個(gè)CPU上,而上
27、,而不同的不同的tasklet可以同時(shí)運(yùn)行在不同的可以同時(shí)運(yùn)行在不同的CPU上。在這種情況下,上。在這種情況下,tasklet就不需就不需要是可重入的,因此,編寫要是可重入的,因此,編寫tasklet比編寫一個(gè)軟中斷要容易。比編寫一個(gè)軟中斷要容易。 Bh機(jī)制在機(jī)制在2.4中依然存在,但不是作為一個(gè)單獨(dú)的機(jī)制存在,而是建立在中依然存在,但不是作為一個(gè)單獨(dú)的機(jī)制存在,而是建立在tasklet之上。因此,在之上。因此,在2.4版中,設(shè)備驅(qū)動(dòng)程序的開發(fā)者必須更新他們?cè)瓉戆嬷?,設(shè)備驅(qū)動(dòng)程序的開發(fā)者必須更新他們?cè)瓉淼尿?qū)動(dòng)程序,用的驅(qū)動(dòng)程序,用tasklet代替代替bh。下半部下半部 ,其數(shù)據(jù)結(jié)構(gòu)為,每個(gè)結(jié)
28、構(gòu)代表一個(gè)獨(dú)立的小任務(wù)。 小任務(wù)既可以靜態(tài)地創(chuàng)建,也可以動(dòng)態(tài)地創(chuàng)建。 小任務(wù)機(jī)制小任務(wù)機(jī)制 struct tasklet_struct Struct tasklet_struct *next;unsigned long state; atomic_t count; void (*func) (unsigned long);unsigned long data; ; 如果準(zhǔn)備個(gè)小任務(wù)(也就是對(duì)它直接引用直接引用),使用下面兩個(gè)宏中的一個(gè): DECLARE_TASKLET(name, func, data) DECLARE_TASKLET_DISABLED(name, func, data)這兩個(gè)
29、宏都能根據(jù)給定的名字靜態(tài)地創(chuàng)建一個(gè)tasklet_struct結(jié)構(gòu)。第一個(gè)宏把創(chuàng)建的小任務(wù)的引用計(jì)數(shù)器設(shè)置為0,因此,該小任務(wù)處于激活狀態(tài)。另一個(gè)把引用計(jì)數(shù)器設(shè)置為1,所以該小任務(wù)處于禁止?fàn)顟B(tài)。例如: DECLARE_TASKLET(my_tasklet, my_tasklet_handler, dev); 這行代碼其實(shí)等價(jià)于 struct tasklet_struct my_tasklet = NULL, 0, ATOMIC_INIT(0),tasklet_handler, dev;聲明和使用小任務(wù)聲明和使用小任務(wù),不能在小任務(wù)中使用信號(hào)量或者其它產(chǎn)生阻塞的函數(shù)。但它通過調(diào)用并傳遞給它相應(yīng)的
30、tasklet_struct指針,該小任務(wù)就會(huì)被調(diào)度以便適當(dāng)?shù)臅r(shí)候執(zhí)行: tasklet_schedule(&my_tasklet)在小任務(wù)被調(diào)度以后,只要有機(jī)會(huì)它就會(huì)盡可能早的運(yùn)行。調(diào)用來禁止某個(gè)指定的小任務(wù)。 tasklet_disable(&my_tasklet); 調(diào)用可以激活一個(gè)小任務(wù)。 tasklet_enable(&my_tasklet); 可以調(diào)用從掛起的隊(duì)列中去掉一個(gè)小任務(wù)。編寫并調(diào)度自己的小任務(wù)編寫并調(diào)度自己的小任務(wù)就是指以形式連接起來的任務(wù)鏈表,每一個(gè)鏈表元素都描述了一個(gè)可執(zhí)行的內(nèi)可執(zhí)行的內(nèi)核任務(wù)核任務(wù)。來描述任務(wù)隊(duì)列中的每一個(gè)鏈表成員。 三個(gè)特殊
31、的任務(wù)隊(duì)列:tq _immediatetq _immediate任務(wù)隊(duì)列任務(wù)隊(duì)列,由IMMEDIATE_BH下半部運(yùn)行,該隊(duì)列中包括要執(zhí)行的內(nèi)核函數(shù)和標(biāo)準(zhǔn)的下半部。 tq_timertq_timer任務(wù)隊(duì)列任務(wù)隊(duì)列,由TQUEUE_BH下半部運(yùn)行,每次時(shí)鐘中斷都激活這個(gè)下半部。tq_disktq_disk任務(wù)隊(duì)列任務(wù)隊(duì)列,用于塊設(shè)備任務(wù)。任務(wù)隊(duì)列任務(wù)隊(duì)列 大部分PC機(jī)中有兩個(gè)時(shí)鐘源,分別是實(shí)時(shí)實(shí)時(shí)時(shí)鐘(時(shí)鐘(RTCRTC)和和 操作系統(tǒng)(操作系統(tǒng)(OSOS)時(shí)鐘。)時(shí)鐘。也叫,它靠電池供電,即使系統(tǒng)斷電,也可以維持日期和時(shí)間。 RTC和OS時(shí)鐘之間的關(guān)系通常也被稱作操作系統(tǒng)的時(shí)鐘運(yùn)作機(jī)制 。
32、不同的操作系統(tǒng),其時(shí)鐘運(yùn)作機(jī)制也不同。 5.5 5.5 中斷的應(yīng)用時(shí)鐘中斷中斷的應(yīng)用時(shí)鐘中斷 時(shí)鐘運(yùn)作機(jī)制 OS時(shí)鐘是由可編程定時(shí)/計(jì)數(shù)器產(chǎn)生的輸出脈沖觸發(fā)中斷而產(chǎn)生的。 操作系統(tǒng)的“時(shí)間基準(zhǔn)” 由設(shè)計(jì)者決定,Linux的時(shí)間基準(zhǔn)是 OS時(shí)鐘記錄的時(shí)間就是系統(tǒng)時(shí)間。系統(tǒng)時(shí)間以“”為單位。 Linux中用全局變量表示系統(tǒng)自啟動(dòng)以來的時(shí)鐘節(jié)拍數(shù)目。每次時(shí)鐘中斷 LinuxLinux時(shí)間系統(tǒng)時(shí)間系統(tǒng) 每一次時(shí)鐘中斷的產(chǎn)生都觸發(fā)下列幾個(gè)主每一次時(shí)鐘中斷的產(chǎn)生都觸發(fā)下列幾個(gè)主要的操作:要的操作:自系統(tǒng)啟動(dòng)以來所花費(fèi)的時(shí)間加自系統(tǒng)啟動(dòng)以來所花費(fèi)的時(shí)間加1 1更新時(shí)間和日期更新時(shí)間和日期確定當(dāng)前進(jìn)程在確定當(dāng)前進(jìn)程在CPU 上已運(yùn)行了多長時(shí)間,上已運(yùn)行了多長時(shí)間,如果已經(jīng)超過了分配給它的時(shí)間,則搶占它如果已經(jīng)超過了分配給它的時(shí)間,則搶占它更新資源使用統(tǒng)計(jì)數(shù)更新資源使用統(tǒng)計(jì)數(shù)檢查定時(shí)器時(shí)間間隔是否已到,如果是,則檢查定時(shí)器時(shí)間間隔是否已到,如果是,則調(diào)用適當(dāng)?shù)暮瘮?shù)調(diào)用適當(dāng)?shù)暮瘮?shù) 時(shí)鐘中斷處理程序時(shí)鐘中斷處理程序 時(shí)鐘中斷處理程序本身來完成通過TIMER_BH和TQUEUE_BH下半部調(diào)用的函數(shù)來完成與TIMER_BH 下半部相關(guān)聯(lián),它在。 TIMER_BH 下半部以關(guān)中斷調(diào)用,該函數(shù)會(huì)以關(guān)中斷來更新。 更新了系統(tǒng)時(shí)鐘xtime之后,up
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國串聯(lián)恒功率電伴熱帶數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 統(tǒng)編版二年級(jí)語文下冊(cè)期中達(dá)標(biāo)測(cè)試卷(提升版)(含答案)
- 2025年《義務(wù)教育小學(xué)道德與法治課程標(biāo)準(zhǔn)測(cè)試卷2022版》測(cè)試題庫及答案
- 2022-2023學(xué)年廣東省廣州市天河區(qū)匯景實(shí)驗(yàn)學(xué)校七年級(jí)(下)期中數(shù)學(xué)試卷(含答案)
- 遺產(chǎn)繼承遺囑效力確認(rèn)合同(2篇)
- 采購與施工分包合同(2篇)
- 物流配送路徑優(yōu)化對(duì)比表
- 開幕致辭與企業(yè)愿景演講實(shí)錄
- 蘇武牧羊的紅色故事征文
- 抵押房產(chǎn)借款合同
- 2024年04月北京中信銀行總行社會(huì)招考(420)筆試歷年參考題庫附帶答案詳解
- 2025年中遠(yuǎn)海運(yùn)集團(tuán)招聘筆試參考題庫含答案解析
- 【含答案、詳細(xì)解析】2024年山東省青島市中考數(shù)學(xué)試題
- 小學(xué)安全教育四年級(jí)
- 開題報(bào)告:實(shí)現(xiàn)綜合育人價(jià)值的中學(xué)勞動(dòng)教育課程體系研究
- 《人工智能:AIGC基礎(chǔ)與應(yīng)用》題庫 填空題
- 文本數(shù)據(jù)質(zhì)量評(píng)估標(biāo)準(zhǔn)-洞察分析
- 血透護(hù)士進(jìn)修匯報(bào)
- Python程序設(shè)計(jì) 課件 第4章 字符串、列表、元組和文件
- “學(xué)-訓(xùn)-評(píng)”一體化師范生實(shí)踐能力培養(yǎng)模式的探索與實(shí)踐
- 錢三強(qiáng)完整版本
評(píng)論
0/150
提交評(píng)論