![LINUX 操作系統(tǒng) 第6章 中斷和中斷處理程序_第1頁](http://file3.renrendoc.com/fileroot3/2021-11/21/b017fadb-4708-4d08-a17d-570b6c5a6f82/b017fadb-4708-4d08-a17d-570b6c5a6f821.gif)
![LINUX 操作系統(tǒng) 第6章 中斷和中斷處理程序_第2頁](http://file3.renrendoc.com/fileroot3/2021-11/21/b017fadb-4708-4d08-a17d-570b6c5a6f82/b017fadb-4708-4d08-a17d-570b6c5a6f822.gif)
![LINUX 操作系統(tǒng) 第6章 中斷和中斷處理程序_第3頁](http://file3.renrendoc.com/fileroot3/2021-11/21/b017fadb-4708-4d08-a17d-570b6c5a6f82/b017fadb-4708-4d08-a17d-570b6c5a6f823.gif)
![LINUX 操作系統(tǒng) 第6章 中斷和中斷處理程序_第4頁](http://file3.renrendoc.com/fileroot3/2021-11/21/b017fadb-4708-4d08-a17d-570b6c5a6f82/b017fadb-4708-4d08-a17d-570b6c5a6f824.gif)
![LINUX 操作系統(tǒng) 第6章 中斷和中斷處理程序_第5頁](http://file3.renrendoc.com/fileroot3/2021-11/21/b017fadb-4708-4d08-a17d-570b6c5a6f82/b017fadb-4708-4d08-a17d-570b6c5a6f825.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第6章章 中斷和中斷處理程序中斷和中斷處理程序26.1 中斷、陷阱和異常中斷、陷阱和異常l中斷中斷(interrupt):設備發(fā)出的中斷,此類中斷):設備發(fā)出的中斷,此類中斷的發(fā)生是的發(fā)生是無法預測無法預測的,它是的,它是被動被動的。用戶空間和的。用戶空間和系統(tǒng)空間都可能發(fā)生中斷。系統(tǒng)空間都可能發(fā)生中斷。l陷阱陷阱(trap):由軟件產生的中斷,它是由專設):由軟件產生的中斷,它是由專設的指令,如的指令,如X86的的“int n”在程序中在程序中有意設置有意設置的,的,他是他是主動主動的。陷阱只發(fā)生在用戶空間。的。陷阱只發(fā)生在用戶空間。l異常異常(exception):由于違規(guī)操作產生的,如
2、除):由于違規(guī)操作產生的,如除法操作法操作DIV的除數(shù)為的除數(shù)為0。多半是不小心,。多半是不小心, 而而不是不是故意故意的,也是的,也是被動被動的。的。l系統(tǒng)調用,通過系統(tǒng)調用,通過int 0 x80實現(xiàn),同實現(xiàn),同“陷阱陷阱”。3中斷、陷阱和異常中斷、陷阱和異常l共同點共同點:CPU對它們的響應過程基本一致。即:對它們的響應過程基本一致。即:在執(zhí)行完當前指令后,或者在執(zhí)行當前指令的中在執(zhí)行完當前指令后,或者在執(zhí)行當前指令的中途,就途,就根據(jù)根據(jù)中斷源所提供的中斷源所提供的“中斷向量中斷向量”,在內,在內存中存中找到相應的服務程序的入口地址找到相應的服務程序的入口地址,并,并調用該調用該服務程
3、序服務程序。l“中斷中斷”的向量是由軟件或硬件設置好了的;陷的向量是由軟件或硬件設置好了的;陷阱的向量是在阱的向量是在“自陷自陷”指令中發(fā)出的指令中發(fā)出的(int n中的中的n);而各種異常的向量則是而各種異常的向量則是CPU的硬件結構中預先規(guī)的硬件結構中預先規(guī)定好的。定好的。l因此,在實踐中常常將它們作為統(tǒng)一的模式加以因此,在實踐中常常將它們作為統(tǒng)一的模式加以考慮和實現(xiàn),而且常常統(tǒng)稱為考慮和實現(xiàn),而且常常統(tǒng)稱為“中斷中斷”。4中斷中斷l(xiāng)中斷使硬件得以與處理器進行通信。中斷使硬件得以與處理器進行通信。l中斷隨時可能發(fā)生,因此內核隨時可能因中斷隨時可能發(fā)生,因此內核隨時可能因為新到來的中斷而被打
4、斷。為新到來的中斷而被打斷。l不同的設備對應的中斷不同,不同的設備對應的中斷不同,每個中斷都每個中斷都通過一個唯一的數(shù)字標識通過一個唯一的數(shù)字標識,從而使得操作,從而使得操作系統(tǒng)能夠對中斷進行區(qū)分。系統(tǒng)能夠對中斷進行區(qū)分。l這些中斷值通常被稱為中斷請求這些中斷值通常被稱為中斷請求(IRQ)線,線,通常通常IRQ都是一些數(shù)值量。都是一些數(shù)值量。56.2 中斷處理程序中斷處理程序l在響應一個特定中斷的時候,內核會執(zhí)行在響應一個特定中斷的時候,內核會執(zhí)行一個函數(shù)一個函數(shù)中斷處理程序中斷處理程序(或叫(或叫中斷服中斷服務例程務例程)。)。l一個設備的中斷處理程序是它的設備驅動一個設備的中斷處理程序是它
5、的設備驅動程序的一部分。程序的一部分。l中斷處理程序與其他內核函數(shù)的真正區(qū)別:中斷處理程序與其他內核函數(shù)的真正區(qū)別:中斷處理程序是被內核調用來響應中斷的,中斷處理程序是被內核調用來響應中斷的,它們運行于中斷上下文中它們運行于中斷上下文中。6l中斷隨時可能發(fā)生,因此中斷處理程序也中斷隨時可能發(fā)生,因此中斷處理程序也就隨時可能執(zhí)行。所以就隨時可能執(zhí)行。所以必須保證中斷處理必須保證中斷處理程序能夠快速執(zhí)行程序能夠快速執(zhí)行,這樣才能保證盡可能,這樣才能保證盡可能快地恢復中斷代碼的執(zhí)行??斓鼗謴椭袛啻a的執(zhí)行。l因此,盡管對硬件而言,迅速對其中斷進因此,盡管對硬件而言,迅速對其中斷進行服務非常重要;但對
6、系統(tǒng)的其它部分而行服務非常重要;但對系統(tǒng)的其它部分而言,讓中斷處理程序在盡可能短的時間內言,讓中斷處理程序在盡可能短的時間內完成運行也同樣重要。完成運行也同樣重要。7上半部與下半部上半部與下半部l對中斷處理程序而言,既想它運行得快,對中斷處理程序而言,既想它運行得快,又想它完成的工作量多,鑒于這兩個目的又想它完成的工作量多,鑒于這兩個目的之間的矛盾,一般把中斷處理分為兩個部之間的矛盾,一般把中斷處理分為兩個部分:分:n上半部上半部:中斷處理程序,接收到一個中斷,:中斷處理程序,接收到一個中斷,它就立即開始執(zhí)行,但只做有嚴格時限的工它就立即開始執(zhí)行,但只做有嚴格時限的工作。這些工作都是在所有中斷
7、被禁止的情況作。這些工作都是在所有中斷被禁止的情況下完成的。下完成的。n下半部下半部:能夠被允許稍后執(zhí)行的工作推遲到:能夠被允許稍后執(zhí)行的工作推遲到下半部執(zhí)行。下半部在開中斷的情況下執(zhí)行。下半部執(zhí)行。下半部在開中斷的情況下執(zhí)行。8上半部和下半部分開的例子上半部和下半部分開的例子l例:網卡接收數(shù)據(jù)包例:網卡接收數(shù)據(jù)包l應在上半部完成的工作:應在上半部完成的工作:應答硬件,拷貝應答硬件,拷貝最新的網絡數(shù)據(jù)包到內存,讀取網卡上更最新的網絡數(shù)據(jù)包到內存,讀取網卡上更多的數(shù)據(jù)包。多的數(shù)據(jù)包。l可以在下半部完成的工作:可以在下半部完成的工作:處理和操作數(shù)處理和操作數(shù)據(jù)包。據(jù)包。96.3 注冊中斷處理程序注
8、冊中斷處理程序l中斷處理程序是驅動程序的組成部分。中斷處理程序是驅動程序的組成部分。l驅動程序通過以下函數(shù)注冊并激活一個中驅動程序通過以下函數(shù)注冊并激活一個中斷處理程序。斷處理程序。int request_irq (unsigned int irq,irqreturn_t (*handler) (int, void *, struct pt_regs *),unsigned long irqflags,const char *devname,void *dev_id)10request_irq( )的參數(shù)的參數(shù)l第第1個參數(shù)個參數(shù)irq:要分配的中斷號。:要分配的中斷號。l第第2個參數(shù)個參數(shù)h
9、andler:一個指針,指向處理這個中:一個指針,指向處理這個中斷的實際中斷處理程序。斷的實際中斷處理程序。l第第3個參數(shù)個參數(shù)irqflags:可以為:可以為0,也可以是,也可以是SA_INTERRUPT, SA_SAMPLE_ RANDOM, SA_SHIRQ其中的一個或多個標志的位掩碼。其中的一個或多個標志的位掩碼。l第第4個參數(shù)個參數(shù)devname:與中斷相關的設備的:與中斷相關的設備的ASCII文本表示法。文本表示法。l第第5個參數(shù)個參數(shù)dev_id:主要用于共享中斷線。:主要用于共享中斷線。11request_irq( )的返回值的返回值l若成功執(zhí)行,返回若成功執(zhí)行,返回0;如果返
10、回非如果返回非0值,表示有錯誤發(fā)生,在這值,表示有錯誤發(fā)生,在這種情況下,指定的中斷處理程序不會被注種情況下,指定的中斷處理程序不會被注冊。冊。l注意:注意: request_irq( )函數(shù)可能會睡眠,因函數(shù)可能會睡眠,因此,不能在中斷上下文或其它不允許阻塞此,不能在中斷上下文或其它不允許阻塞的代碼中調用該函數(shù)。的代碼中調用該函數(shù)。12使用使用request_irq( )函數(shù)函數(shù)if (request_irq (irqn, my_interrupt, SA_SHIRQ, “my_device”, dev) ) printk(KERN_ERR “my_device: cannot regist
11、er IRQ %d, n”, irqn);return EIO;13釋放中斷處理程序釋放中斷處理程序l卸載驅動程序時,需要注銷相應的中斷處卸載驅動程序時,需要注銷相應的中斷處理程序,并釋放中斷線。理程序,并釋放中斷線。l可以調用可以調用void free_irq (unsigned int irq, void *dev_id)來釋放中斷線。來釋放中斷線。l如果指定的中斷線不是共享的,那么,該函數(shù)刪如果指定的中斷線不是共享的,那么,該函數(shù)刪除處理程序的同時將禁用這條中斷線。除處理程序的同時將禁用這條中斷線。如果中斷線是共享的,則僅刪除如果中斷線是共享的,則僅刪除dev_id所對應的所對應的處理程
12、序,而這條中斷線本身只有在刪除了最后處理程序,而這條中斷線本身只有在刪除了最后一個處理程序時才會被禁用。一個處理程序時才會被禁用。146.4 編寫中斷處理程序編寫中斷處理程序l典型的中斷處理程序聲明:典型的中斷處理程序聲明:static irqreturn_t intr_handler (int irq, void *dev_id,struct pt_regs *regs)l其返回值為其返回值為irqreturn_t型,實際上是型,實際上是int型。型。l中斷處理程序可能返回兩個特殊的值:中斷處理程序可能返回兩個特殊的值:nIRQ_NONE:當中斷處理程序檢測到一個中斷,但該:當中斷處理程序檢
13、測到一個中斷,但該中斷對應的設備并不是在注冊處理函數(shù)期間指定的產中斷對應的設備并不是在注冊處理函數(shù)期間指定的產生源時,返回該值;生源時,返回該值;nIRQ_HANDLED:當中斷處理程序被正確調用,且確:當中斷處理程序被正確調用,且確實是它所對應的設備產生了中斷時,返回該值。實是它所對應的設備產生了中斷時,返回該值。15l在在include/linux/interrupt.h中有如下幾行,中有如下幾行,定義了中斷處理程序的返回值:定義了中斷處理程序的返回值:typedef int irqreturn_t;#define IRQ_NONE(0)#define IRQ_HANDLED(1)#def
14、ine IRQ_RETVAL(x)(x) != 0)16典型中斷處理程序的參數(shù)說明典型中斷處理程序的參數(shù)說明lirq:是這個處理程序要響應的中斷的中斷線號。:是這個處理程序要響應的中斷的中斷線號?,F(xiàn)在,該參數(shù)已沒有太大用處?,F(xiàn)在,該參數(shù)已沒有太大用處。ldev_id:一個通用指針,它與傳遞給:一個通用指針,它與傳遞給request_irq( )的參數(shù)的參數(shù)dev_id必須一致。如果該值必須一致。如果該值有唯一確定性,那么它就相當于一個有唯一確定性,那么它就相當于一個cookie,可,可以用來區(qū)分共享同一中斷處理程序的多個設備。以用來區(qū)分共享同一中斷處理程序的多個設備。lregs:一個指向結構的
15、指針,該結構包含處理中:一個指向結構的指針,該結構包含處理中斷之前處理器的寄存器和狀態(tài)。除了調試,很少斷之前處理器的寄存器和狀態(tài)。除了調試,很少用到它。用到它。17中斷處理程序和重入中斷處理程序和重入l當一個給定的中斷處理程序正在執(zhí)行時,當一個給定的中斷處理程序正在執(zhí)行時,相應的中斷線在所有處理器上都會被屏蔽相應的中斷線在所有處理器上都會被屏蔽掉,以防止在同一中斷線上接收到另一個掉,以防止在同一中斷線上接收到另一個新的中斷。因此,新的中斷。因此,同一個中斷處理程序絕同一個中斷處理程序絕對不會被同時調用以處理嵌套的中斷對不會被同時調用以處理嵌套的中斷。l所以,所以,Linux的中斷處理程序是的中
16、斷處理程序是無需重入無需重入的。的。這極大地簡化了中斷處理程序的編寫。這極大地簡化了中斷處理程序的編寫。186.4.1 共享的中斷處理程序共享的中斷處理程序l共享的處理程序與非共享的處理程序在注共享的處理程序與非共享的處理程序在注冊和運行方式上比較相似,但差異主要有冊和運行方式上比較相似,但差異主要有三點:三點:nrequest_irq( )的參數(shù)的參數(shù)irqflags必須設置必須設置SA_SHIRQ標志標志。n對每個注冊的中斷處理程序來說,對每個注冊的中斷處理程序來說,dev_id參數(shù)參數(shù)必須唯一必須唯一。指向任一設備結構的指針就可以。指向任一設備結構的指針就可以滿足這一要求。滿足這一要求。
17、n中斷處理程序中斷處理程序必須能夠區(qū)分它的設備是否真必須能夠區(qū)分它的設備是否真的產生了中斷的產生了中斷。196.4.2 中斷處理程序實例中斷處理程序實例l例:來自例:來自RTC (real_time clock)驅動程序的驅動程序的一個實際的中斷處理程序,它在一個實際的中斷處理程序,它在drivers/char/rtc.c中定義。中定義。l在在RTC驅動程序裝載時,會調用驅動程序裝載時,會調用rtc_init( )函數(shù),進行初始化。函數(shù),進行初始化。l在在rtc_init( )函數(shù)中,將注冊中斷處理程序,函數(shù)中,將注冊中斷處理程序,代碼見下頁:代碼見下頁:20l其中的第其中的第2個參數(shù)是中斷處
18、理程序個參數(shù)是中斷處理程序rtc_interrupt,其代碼見下頁。,其代碼見下頁。if (request_irq(rtc_irq, rtc_interrupt, SA_INTERRUPT, rtc, (void *)&rtc_port) printk(KERN_ERR rtc: cannot register IRQ %dn, rtc_irq);return -EIO;21中斷處理程序中斷處理程序rtc_interrupt( )static unsigned long rtc_irq_data = 0;irqreturn_t rtc_interrupt (int irq, void
19、*dev_id, struct pt_regs *regs) spin_lock (&rtc_lock); rtc_irq_data += 0 x100; rtc_irq_data &= 0 xff; rtc_irq_data |= (CMOS_READ(RTC_INTR_FLAGS) & 0 xF0); if (rtc_status & RTC_TIMER_ON)mod_timer(&rtc_irq_timer, jiffies + HZ/rtc_freq + 2*HZ/100);22rtc_interrupt( ) (續(xù)續(xù)) spin_unlock
20、(&rtc_lock); /* Now do the rest of the actions */ spin_lock(&rtc_task_lock); if (rtc_callback) rtc_callback-func(rtc_callback-private_data); spin_unlock(&rtc_task_lock); wake_up_interruptible(&rtc_wait); kill_fasync (&rtc_async_queue, SIGIO, POLL_IN); return IRQ_HANDLED;236.5 中斷上
21、下文中斷上下文l當執(zhí)行一個中斷處理程序或下半部時,內當執(zhí)行一個中斷處理程序或下半部時,內核處于中斷上下文中。核處于中斷上下文中。l中斷上下文不能睡眠,因此不能從中斷上中斷上下文不能睡眠,因此不能從中斷上下文中調用某些會睡眠的函數(shù)。下文中調用某些會睡眠的函數(shù)。246.6 中斷處理機制的實現(xiàn)中斷處理機制的實現(xiàn)l中斷處理系統(tǒng)的實現(xiàn)依賴于體系結構。依中斷處理系統(tǒng)的實現(xiàn)依賴于體系結構。依賴于處理器、所使用的中斷控制器的類型、賴于處理器、所使用的中斷控制器的類型、體系結構的設計及機器本身。體系結構的設計及機器本身。l中斷從硬件到內核的路由見下頁圖。中斷從硬件到內核的路由見下頁圖。25中斷從硬件到內核的路由
22、中斷從硬件到內核的路由中斷控制器中斷控制器處理器處理器處理器處理器中斷內核中斷內核do_IRQ( )該線上是否有該線上是否有中斷處理程序中斷處理程序handle_IRQ_event( )在該線上運行所在該線上運行所有中斷處理程序有中斷處理程序返回內核運行返回內核運行中斷的代碼中斷的代碼ret_from_intr( )是是否否硬件硬件產生一產生一個中斷個中斷26l在內核中,中斷的旅程開始于預定義入口在內核中,中斷的旅程開始于預定義入口點,對于每條中斷線,處理器都會跳到對點,對于每條中斷線,處理器都會跳到對應的一個唯一位置。這樣,內核就可以知應的一個唯一位置。這樣,內核就可以知道所接收中斷的道所接
23、收中斷的IRQ號了。號了。l然后,內核調用然后,內核調用do_IRQ( )函數(shù)。函數(shù)。27do_IRQ( )函數(shù)函數(shù)l通過通過orig_eax讀出堆棧中的值,并將高位讀出堆棧中的值,并將高位屏蔽掉,得到屏蔽掉,得到IRQ號。號。unsigned int do_IRQ(struct pt_regs *regs)int irq = regs-orig_eax & 0 xff;return 1;28補充:補充:pt_regs結構結構struct pt_regs long ebx;long ecx;long edx;long esi;long edi;long ebp;long eax;int
24、 xds;int xes;long orig_eax;long eip;int xcs;long eflags;long esp;int xss;29do_IRQ( ) handle_IRQ_event( )int handle_IRQ_event (unsigned int irq, struct pt_regs * regs, struct irqaction * action) int status= 1;int retval = 0;if (!(action-flags & SA_INTERRUPT)local_irq_enable( );do status |= action
25、-flags;retval |= action-handler(irq, action-dev_id, regs);action = action-next; while (action);if (status & SA_SAMPLE_RANDOM)add_interrupt_randomness(irq);local_irq_disable( );return status;30補充:補充:irqaction數(shù)據(jù)結構數(shù)據(jù)結構struct irqaction irqreturn_t (*handler)(int, void *, struct pt_regs *); unsigned
26、long flags; cpumask_t mask; const char *name; void *dev_id; struct irqaction *next; int irq; struct proc_dir_entry *dir;31/proc/interruptslprocfs是一個虛擬文件系統(tǒng),它只存在于是一個虛擬文件系統(tǒng),它只存在于內核內存,一般安裝于內核內存,一般安裝于/proc目錄下。目錄下。l/proc/interrupts文件:存放系統(tǒng)中與中斷文件:存放系統(tǒng)中與中斷相關的統(tǒng)計信息。見下頁。相關的統(tǒng)計信息。見下頁。32/proc/interrupts文件的內容文件的內容3
27、36.7 中斷控制中斷控制lLinux內核提供了一組接口用于操作機器上內核提供了一組接口用于操作機器上的中斷狀態(tài)。這些接口為我們提供了能夠的中斷狀態(tài)。這些接口為我們提供了能夠禁止當前處理器的中斷系統(tǒng)、或屏蔽掉整禁止當前處理器的中斷系統(tǒng)、或屏蔽掉整個機器的一條中斷線的能力。個機器的一條中斷線的能力。346.7.1 禁止和激活中斷禁止和激活中斷l(xiāng)用于禁止當前處理器上的本地中斷,隨后用于禁止當前處理器上的本地中斷,隨后又激活它們的語句為:又激活它們的語句為:local_irq_disable( ) ;/*禁止中斷禁止中斷*/local_irq_enable( );l這兩個函數(shù)通常以單個匯編指令實現(xiàn),
28、其這兩個函數(shù)通常以單個匯編指令實現(xiàn),其代碼在代碼在include/asm-i386/system.h中,見下中,見下頁:頁:35l如果在調用如果在調用local_irq_disable( )之前已經禁之前已經禁止了中斷,那么該例程往往會帶來潛在的止了中斷,那么該例程往往會帶來潛在的危險。同樣危險。同樣local_irq_enable( )也存在潛在也存在潛在危險。危險。l因此因此需要一種機制把中斷恢復到以前的狀需要一種機制把中斷恢復到以前的狀態(tài)而不是簡單地禁止或激活態(tài)而不是簡單地禁止或激活。#define local_irq_disable( ) _asm_ _volatile_(cli: :
29、 :memory)#define local_irq_enable( )_asm_ _volatile_(sti: : :memory)36l在禁止中斷之前應該保存中斷系統(tǒng)的狀態(tài);在禁止中斷之前應該保存中斷系統(tǒng)的狀態(tài);而在準備激活中斷時,只需要把中斷恢復而在準備激活中斷時,只需要把中斷恢復到它們原來的狀態(tài)。如下所示:到它們原來的狀態(tài)。如下所示:unsigned long flags;local_irq_save(flags);/*/local_irq_restore(flags);l對對local_irq_save( )的調用和對的調用和對local_irq_restore( )的調用必須在同一個函數(shù)中進行。的調用必須在同一個函數(shù)中進行。376.7.2 禁止指定中斷線禁止指定中斷線l在某些情況下,只禁止整個系統(tǒng)中一條特在某些情況下,只禁止整個系統(tǒng)中一條特定的中斷線就夠了。這就是所謂的定的中斷線就夠了。這就是所謂的屏蔽掉屏蔽掉一條中斷線。一條中斷線。lLinux提供了四個接口:提供了四個接口:nvoid disable_irq(unsigned int irq);nvoid disable_irq_nosync(unsigned int irq);nvoid enable_irq(unsigned i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年吸聲棉項目投資價值分析報告
- 2025年中國有創(chuàng)血壓監(jiān)護模塊市場調查研究報告
- 裝修監(jiān)理合同樣本
- 加入女生部的申請書
- 2025年靜電報警器項目可行性研究報告
- 刑事救助申請書
- 通信行業(yè)人才引進居間協(xié)議
- 購物中心土地居間服務合同
- 茶葉銷售居間服務補充協(xié)議
- 審計鑒定申請書
- 2024年廣東省中考歷史真題(含解析)
- 垃圾填埋場項目經濟效益和社會效益分析
- JGJ52-2006 普通混凝土用砂、石質量及檢驗方法標準
- 組織生活個人發(fā)言稿
- (高清版)JTST 273-2024 水運工程測量定額
- 電網工程勞務分包投標技術方案(技術標)
- 有理數(shù)總復習市公開課一等獎省賽課微課金獎課件
- 幼兒園安全園本培訓
- 口腔疾病藥物臨床應用規(guī)范
- 第22課《陳涉世家》課件(共71張)
- 《字體設計》課件-企業(yè)標準字字體設計的原則
評論
0/150
提交評論