版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、WDM驅(qū)動(dòng)程序設(shè)計(jì)同步技術(shù)第 5 講主要內(nèi)容 一個(gè)同步問(wèn)題的例子 中斷請(qǐng)求級(jí) 自旋鎖 內(nèi)核同步對(duì)象 其它內(nèi)核同步原語(yǔ)一個(gè)同步問(wèn)題的例子下面利用靜態(tài)變量lActiveRequests記錄當(dāng)前未完成的I/O請(qǐng)求數(shù): static LONG lActiveRequests;NTSTATUS DispatchPnp(PDEVICE_OBJECT fdo, PIRP Irp) +lActiveRequests; . / process PNP request -lActiveRequests;有什么問(wèn)題?關(guān)于語(yǔ)句“+lActiveRequests”在X86處理器上匯編程序生成如下代碼: / +lActi
2、veRequests; mov eax, lActiveRequests add eax, 1 mov lActiveRequests, eax 上述代碼的第三條指令被執(zhí)行之前如果被同一CPU上的其它執(zhí)行線(xiàn)程打斷,或者在不同CPU上有完全相同的代碼在同時(shí)運(yùn)行都會(huì)引起+lActiveRequests的計(jì)數(shù)錯(cuò)誤。解決的辦法把load/add/store和load/subtract/store指令序列替換為原子指令: / +lActiveRequests; inc lActiveRequests / -lActiveRequests; dec lActiveRequests INC和DEC指令不能被
3、中斷,但是多處理器環(huán)境中仍然是不安全的,因?yàn)檫@兩個(gè)指令都是由幾條微代碼實(shí)現(xiàn)的。最終解決辦法 / +lActiveRequests; lock inc lActiveRequests / -lActiveRequests; lock dec lActiveRequests LOCK指令前綴可以使當(dāng)前執(zhí)行多微碼指令的CPU鎖定總線(xiàn),從而保證數(shù)據(jù)訪(fǎng)問(wèn)的完整性。兩個(gè)最差的假定驅(qū)動(dòng)程序開(kāi)發(fā)者必須做如下兩個(gè)最差的假定:操作系統(tǒng)可以在任何時(shí)間搶先任何例程并停留任何長(zhǎng)的時(shí)間,所以我們不能保證自己的任務(wù)不被干擾或延遲。即使我們能防止被搶先,但其它CPU上執(zhí)行的代碼也會(huì)干擾我們代碼的執(zhí)行,甚至一個(gè)程序的代碼可以在
4、兩個(gè)不同線(xiàn)程的上下文中并發(fā)執(zhí)行。 同步請(qǐng)求級(jí)一個(gè)確定的CPU上的活動(dòng)僅能被擁有更高IRQL的活動(dòng)搶先。IRQL與線(xiàn)程優(yōu)先級(jí)線(xiàn)程優(yōu)先級(jí)是與IRQL非常不同的概念。線(xiàn)程優(yōu)先級(jí)控制著OS線(xiàn)程調(diào)度器的調(diào)度動(dòng)作,決定何時(shí)搶先運(yùn)行線(xiàn)程以及下一次運(yùn)行什么線(xiàn)程。當(dāng)IRQL級(jí)高于或等于DISPATCH_LEVEL級(jí)時(shí)線(xiàn)程切換停止,無(wú)論當(dāng)前活動(dòng)的是什么線(xiàn)程都將保持活動(dòng)狀態(tài)直到IRQL降到DISPATCH_LEVEL級(jí)之下。在進(jìn)行線(xiàn)程調(diào)度時(shí)會(huì)切換線(xiàn)程上下文;按照IRQL進(jìn)行活動(dòng)搶先時(shí)不會(huì)切換線(xiàn)程上下文。利用IRQL進(jìn)行同步方法:將所有對(duì)共享數(shù)據(jù)的訪(fǎng)問(wèn)都應(yīng)該在同一(提升的,高于PASSIVE_LEVEL級(jí)的) IRQ
5、L上進(jìn)行。上述方法只適用于單CPU??衫肒eRaiseIrql和KeLowerIrql函數(shù)改變當(dāng)前IRQL。 KIRQL oldirql;ASSERT(KeGetCurrentIrql() QLock); .如何使用自旋鎖當(dāng)代碼運(yùn)行在低于或等于DISPATCH_LEVEL級(jí)時(shí)獲取這個(gè)鎖,并執(zhí)行需要保護(hù)的代碼,最后釋放自旋鎖。NTSTATUS DispatchSomething(.) KIRQL oldirql; PDEVICE_EXTENSION pdx = .; KeAcquireSpinLock(&pdx-QLock, &oldirql); . KeReleaseSpin
6、Lock(&pdx-QLock, oldirql);如何使用自旋鎖如果知道代碼已經(jīng)處在DISPATCH_LEVEL級(jí)上 ,如DPC、StartIo,和其它執(zhí)行在DISPATCH_LEVEL級(jí)上的驅(qū)動(dòng)程序例程,可以調(diào)用兩個(gè)專(zhuān)用函數(shù)來(lái)操作自旋鎖 :KeAcquireSpinLockAtDpcLevel(&pdx-QLock);.KeReleaseSpinLockFromDpcLevel(&pdx-QLock);內(nèi)核同步對(duì)象利用內(nèi)核同步對(duì)象可以暫時(shí)阻塞一個(gè)線(xiàn)程的執(zhí)行,同步不同線(xiàn)程的執(zhí)行動(dòng)作。內(nèi)核同步對(duì)象僅影響OS線(xiàn)程調(diào)度器的調(diào)度動(dòng)作,因此一般只在低于DISPATCH_LEVE
7、L級(jí)的代碼中用于阻塞線(xiàn)程。在驅(qū)動(dòng)程序中,只能在“非任意線(xiàn)程上下文非任意線(xiàn)程上下文”條件下利用內(nèi)核同步對(duì)象阻塞調(diào)用者的線(xiàn)程或產(chǎn)生該請(qǐng)求的線(xiàn)程。在“任意線(xiàn)程上下文任意線(xiàn)程上下文”調(diào)用等待原語(yǔ)等待原語(yǔ)只會(huì)阻塞一個(gè)“無(wú)辜”的線(xiàn)程。非任意線(xiàn)程上下文如果驅(qū)動(dòng)程序的回調(diào)例程能確切知道處于哪個(gè)線(xiàn)程上下文中,則稱(chēng)處于“非任意線(xiàn)程上下文”;大部分時(shí)間里,驅(qū)動(dòng)程序無(wú)法知道這個(gè)事實(shí),即處于“任意線(xiàn)程上下文”中。非任意線(xiàn)程上下文的例子: 設(shè)備的最高級(jí)驅(qū)動(dòng)程序的IRP處理函數(shù)可以確切地知道它執(zhí)行在發(fā)出該I/O請(qǐng)求的應(yīng)用程序線(xiàn)程的上下文中。PNP類(lèi)IRP的處理函數(shù)可以確切地知道它執(zhí)行在一個(gè)系統(tǒng)線(xiàn)程(System Threa
8、d)中。在你自己創(chuàng)建的內(nèi)核模式系統(tǒng)線(xiàn)程中。(PsCreateSystemThread)DriverEntry、AddDevice、DriverUnload等函數(shù)執(zhí)行在一個(gè)系統(tǒng)線(xiàn)程(System Thread)中。常用的內(nèi)核同步對(duì)象對(duì)象對(duì)象數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型描述描述Event(事件) KEVENT阻塞一個(gè)線(xiàn)程直到檢測(cè)到某事件發(fā)生 Semaphore(信號(hào)燈)KSEMAPHORE 控制多個(gè)線(xiàn)程對(duì)共享資源的訪(fǎng)問(wèn)Mutex(互斥)KMUTEX 執(zhí)行到關(guān)鍵代碼段時(shí),禁止其它線(xiàn)程執(zhí)行該代碼段 Timer(定時(shí)器)KTIMER推遲線(xiàn)程執(zhí)行一段時(shí)期Thread(線(xiàn)程) KTHREAD阻塞一個(gè)線(xiàn)程直到另一個(gè)線(xiàn)程結(jié)
9、束在單同步對(duì)象上等待在任何時(shí)刻,任何對(duì)象都處于兩種狀態(tài)中的一種:信號(hào)態(tài)信號(hào)態(tài)(signaled)或非信號(hào)態(tài)非信號(hào)態(tài)(not signaled) 。調(diào)用KeWaitForSingleObject或KeWaitForMultipleObjects函數(shù)可以使代碼(以及背景線(xiàn)程)在一個(gè)或多個(gè)同步對(duì)象上等待,等待它們進(jìn)入信號(hào)態(tài)。ASSERT(KeGetCurrentIrql() = DISPATCH_LEVEL);LARGE_INTEGER timeout;NTSTATUS status = KeWaitForSingleObject(object, WaitReason, WaitMode, Aler
10、table, &timeout);KeWaitForSingleObject參數(shù)含義object 指向要等待的對(duì)象,它應(yīng)該指向一個(gè)上面表中列出的同步對(duì)象。該對(duì)象必須在非分頁(yè)內(nèi)存中。WaitReason 是一個(gè)純粹建議性的值,KWAIT_REASON枚舉型,一般取值為Executive。WaitMode 是MODE枚舉類(lèi)型,該枚舉類(lèi)型僅有兩個(gè)值:KernelMode和UserMode。一般取值為KernelMode 。Alertable 參數(shù)一般指定為FALSE。timeout 是一個(gè)64位超時(shí)值的地址,單位為100納秒。正數(shù)的超時(shí)表示一個(gè)從1601年年1月月1日日起的絕對(duì)時(shí)間。負(fù)數(shù)代表
11、相對(duì)于當(dāng)前時(shí)間的時(shí)間間隔。 指定為0將使等待函數(shù)立即返回。指定為NULL代表無(wú)限期等待。KeWaitForSingleObject(object, WaitReason, WaitMode, Alertable, &timeout);KeWaitForSingleObject返回值含義STATUS_SUCCESS,表示等待被滿(mǎn)足。即你調(diào)用KeWaitForSingleObject時(shí),對(duì)象或者已經(jīng)進(jìn)入信號(hào)態(tài),或者在等待中進(jìn)入信號(hào)態(tài)使等待返回。STATUS_TIMEOUT指出在指定的超時(shí)期限內(nèi)對(duì)象未進(jìn)入信號(hào)態(tài) 。如果指定0超時(shí),則函數(shù)將立即返回。返回代碼為STATUS_TIMEOUT,代表
12、對(duì)象處于非信號(hào)態(tài),返回代碼為STATUS_ SUCCESS,代表對(duì)象處于信號(hào)態(tài)。其它兩個(gè)返回值STATUS_ALERTED和STATUS_USER_APC表示等待提前終止,對(duì)象未進(jìn)入信號(hào)態(tài) 。在多個(gè)同步對(duì)象上等待objects指向一個(gè)指針數(shù)組,每個(gè)數(shù)組元素指向一個(gè)同步對(duì)象,count表示數(shù)組中指針的個(gè)數(shù) 。WaitType是枚舉類(lèi)型,其值可以為WaitAll或WaitAny,它指出你是等到所有對(duì)象都進(jìn)入信號(hào)態(tài),還是只要有一個(gè)對(duì)象進(jìn)入信號(hào)態(tài)就可以。waitblocks參數(shù)指向一個(gè)KWAIT_BLOCK結(jié)構(gòu)數(shù)組,內(nèi)核用它來(lái)記錄每個(gè)對(duì)象在等待中的狀態(tài)。 不需要你對(duì)其進(jìn)行初始化。ASSERT(KeGe
13、tCurrentIrql() = DISPATCH_LEVEL);LARGE_INTEGER timeout;NTSTATUS status = KeWaitForMultipleObjects(count, objects, WaitType, WaitReason, WaitMode, Alertable, &timeout, waitblocks);KeWaitForMultipleObjects的返回值如果指定了WaitAll,則返回STATUS_SUCCESS表示等待的所有對(duì)象都進(jìn)入了信號(hào)態(tài)。如果指定了WaitAny,則返回值在數(shù)值上等于進(jìn)入信號(hào)態(tài)的對(duì)象在objects數(shù)組中
14、的索引。如果碰巧有多個(gè)對(duì)象進(jìn)入了信號(hào)態(tài),則返回值僅代表其中的一個(gè),可能是第一個(gè)也可能是其它。可以認(rèn)為返回值等于STATUS_WAIT_0加上數(shù)組索引。NTSTATUS status = KeWaitForMultipleObjects(.);if (NT_SUCCESS(status) iSignalled = status - STATUS_WAIT_0; .內(nèi)核事件(Event)對(duì)象用途:把一個(gè)特定的事件通知給一個(gè)等待中的線(xiàn)程。與該對(duì)象相關(guān)的內(nèi)核服務(wù)函數(shù)如下:服務(wù)函數(shù)服務(wù)函數(shù)功能功能KeInitializeEvent初始化事件對(duì)象KeSetEvent把事件設(shè)置為信號(hào)態(tài),返回前一個(gè)狀態(tài)KeR
15、esetEvent把事件設(shè)置為非信號(hào)態(tài),返回前一個(gè)狀態(tài)KeClearEvent把事件設(shè)置為非信號(hào)態(tài),不報(bào)告以前的狀態(tài)。KeReadStateEvent取事件的當(dāng)前狀態(tài)。通知事件與同步事件通知事件通知事件(notification event)有這樣的特性,當(dāng)它進(jìn)入信號(hào)態(tài)后,它將一直處于信號(hào)態(tài)直到明確地把它重置為非信號(hào)態(tài)。因此,當(dāng)通知事件進(jìn)入信號(hào)態(tài)后,所有在該事件上等待的線(xiàn)程都被釋放。同步事件同步事件(synchronization event):只要有一個(gè)線(xiàn)程被釋放,該事件就被自動(dòng)重置為非信號(hào)態(tài)。 ASSERT(KeGetCurrentIrql() = DISPATCH_LEVEL);KEVE
16、NT event;KeInitializeEvent(event, EventType, initialstate);EventType是一個(gè)枚舉值,可以為NotificationEvent或SynchronizationEvent。initialstate是布爾量,為T(mén)RUE表示事件的初始狀態(tài)為信號(hào)態(tài),為FALSE表示事件的初始狀態(tài)為非信號(hào)態(tài)。KeSetEvent函數(shù)調(diào)用KeSetEvent函數(shù)可以把事件置為信號(hào)態(tài):ASSERT(KeGetCurrentIrql() lock, SynchronizationEvent, TRUE);void thread () KeWaitForSingl
17、eObject(&pdx-lock, Executive, KernelMode, FALSE, NULL); / do something KeSetEvent(&pdx-lock, EVENT_INCREMENT, FALSE);在應(yīng)用層異步訪(fǎng)問(wèn)設(shè)備/ CreateFile的一個(gè)參數(shù)可以規(guī)定同步方式還是異步方式訪(fǎng)問(wèn)該設(shè)備的一個(gè)參數(shù)可以規(guī)定同步方式還是異步方式訪(fǎng)問(wèn)該設(shè)備hDevice = CreateFile(“.wdm1Device”, .);HANDLE waitEvent = CreateEvent(.);OVERLAPPED ol;ol.hEvent = waitEv
18、ent;ReadFile( hDevice, buffer, NumberOfBytesToRead, &ol);while(WaitForSingleObject(waitEvent, 100)=WAIT_TIMEOUT) if(!KeepRunning) CancelIo(hDevice); goto EXIT; / 從從buffer中訪(fǎng)問(wèn)數(shù)據(jù)中訪(fǎng)問(wèn)數(shù)據(jù)內(nèi)核信號(hào)燈內(nèi)核信號(hào)燈是一個(gè)有同步語(yǔ)義的整數(shù)計(jì)數(shù)器。信號(hào)燈計(jì)數(shù)器為正值時(shí)代表信號(hào)態(tài),為0時(shí)代表非信號(hào)態(tài)。計(jì)數(shù)器不能為負(fù)值。釋放信號(hào)燈將使信號(hào)燈計(jì)數(shù)器增1,在一個(gè)信號(hào)燈上等待將使該信號(hào)燈計(jì)數(shù)器減1。如果計(jì)數(shù)器值被減為0,則信號(hào)燈進(jìn)入非信
19、號(hào)態(tài),之后其它調(diào)用KeWaitXxx函數(shù)的線(xiàn)程將被阻塞。注意如果等待線(xiàn)程的個(gè)數(shù)超過(guò)了計(jì)數(shù)器的值,那么并不是所有等待的線(xiàn)程都可以恢復(fù)運(yùn)行。服務(wù)函數(shù)與使用方法KeInitializeSemaphore:初始化信號(hào)燈對(duì)象KeReadStateSemaphore:取信號(hào)燈當(dāng)前狀態(tài)KeReleaseSemaphore:釋放信號(hào)燈對(duì)象KSEMAPHORE semaphore;ASSERT(KeGetCurrentIrql() = PASSIVE_LEVEL);KeInitializeSemaphore(&semaphore, count, limit);.KeWaitForSingleObject
20、(&semaphore, .);.ASSERT(KeGetCurrentIrql() = DISPATCH_LEVEL);KeReleaseSemaphore(semaphore, boost, delta, wait);互斥對(duì)象Mutex 互斥(mutex)就是mutual exclusion的簡(jiǎn)寫(xiě)。內(nèi)核互斥對(duì)象為多個(gè)競(jìng)爭(zhēng)線(xiàn)程串行化訪(fǎng)問(wèn)共享資源提供了一種方法。雖然用其它方法也能實(shí)現(xiàn)此功能,但互斥對(duì)象加入了一些措施能防止死鎖死鎖。如果互斥對(duì)象不被某線(xiàn)程所擁有,則它是信號(hào)態(tài),反之則是非信號(hào)態(tài)。如果需要長(zhǎng)時(shí)間串行化訪(fǎng)問(wèn)一個(gè)對(duì)象,應(yīng)該首先考慮使用互斥(而不是依賴(lài)提升的IRQL和自旋鎖)。利用
21、互斥對(duì)象控制資源的訪(fǎng)問(wèn),可以使其它線(xiàn)程分布到多處理器平臺(tái)上的其它CPU中運(yùn)行,還允許導(dǎo)致頁(yè)故障的代碼仍能鎖定資源而不被其它線(xiàn)程訪(fǎng)問(wèn)。 互斥對(duì)象的服務(wù)函數(shù)KeInitializeMutex 初始化互斥對(duì)象KeReadStateMutex 取互斥對(duì)象的當(dāng)前狀態(tài)KeReleaseMutex 設(shè)置互斥對(duì)象為信號(hào)態(tài)KMUTEX mutex;ASSERT(KeGetCurrentIrql() = PASSIVE_LEVEL);KeInitializeMutex(&mutex, level);.KeWaitForSingleObject(&mutex, .);.ASSERT(KeGetCur
22、rentIrql() = PASSIVE_LEVEL);KeReleaseMutex(&mutex, wait);內(nèi)核定時(shí)器 (Timer) Timer對(duì)象可以在指定的絕對(duì)時(shí)間或間隔時(shí)間后自動(dòng)從非信號(hào)態(tài)變?yōu)樾盘?hào)態(tài)。它還可以周期性的進(jìn)入信號(hào)態(tài)。可以利用KeWaitXxxx函數(shù)等待一個(gè)Timer對(duì)象在某個(gè)時(shí)間間隔后進(jìn)入信號(hào)態(tài),也可以利用Timer對(duì)象安排一個(gè)在某個(gè)時(shí)間間隔后或定期執(zhí)行的DPC回調(diào)函數(shù)。定時(shí)器也分為通知型通知型和同步型同步型兩種。通知型定時(shí)器及時(shí)結(jié)束后一直處于信號(hào)態(tài),除非手動(dòng)改變。因此,所有等待它的線(xiàn)程都被釋放。同步定時(shí)器正相反,它只允許有一個(gè)等待線(xiàn)程。一旦有線(xiàn)程在這種定時(shí)器
23、上等待,并且開(kāi)始執(zhí)行,定時(shí)器就自動(dòng)進(jìn)入非信號(hào)態(tài)。內(nèi)核定時(shí)器的服務(wù)函數(shù)服務(wù)函數(shù)服務(wù)函數(shù)功能功能KeInitializeTimer初始化一次性的通知型定時(shí)器KeInitializeTimerEx 初始化一次性的或周期性的通知型的或同步型定時(shí)器 KeSetTimer為通知型定時(shí)器設(shè)定時(shí)間或DPC對(duì)象KeSetTimerEx為定時(shí)器設(shè)定時(shí)間、周期和其它屬性KeCancelTimer取消一個(gè)定時(shí)器KeReadStateTimer 獲取定時(shí)器的當(dāng)前狀態(tài)。一次性定時(shí)器的用法KTIMER timer; / someone gives you thisASSERT(KeGetCurrentIrql() = DI
24、SPATCH_LEVEL);KeInitializeTimerEx(&timer, NotificationTimer);/ KeInitializeTimer(timer);LARGE_INTEGER duetime;KeSetTimer(&timer, duetime, NULL);KeWaitForSingleObject(&timer, .);.周期性定時(shí)器的用法KTIMER timer; / someone gives you thisASSERT(KeGetCurrentIrql() = DISPATCH_LEVEL);KeInitializeTimerEx
25、(&timer, SynchronizationTimer);LARGE_INTEGER duetime;long period;KeSetTimerEx(&timer, duetime, period, NULL);while(True) KeWaitForSingleObject(&timer, .);.KeCancelTimer(&timer);定時(shí)器與DPCPKDPC dpc; / points to KDPC youve allocatedASSERT(KeGetCurrentIrql() = PASSIVE_LEVEL);KeInitializeTimer(timer);KeInitializeDpc(dpc, DpcRoutine, context);ASSERT(KeGetCurrentIrql() = DISPATCH_LEVEL);LARGE_INTEGER duetime;KeSetTimer(timer, duetime, dpc);. . . .VOID DpcRoutine(PKDPC dpc, PVOID context, .) .定時(shí)函數(shù) KeDelayExecutionThread :可以在PA
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度門(mén)店合伙人激勵(lì)機(jī)制服務(wù)合同4篇
- 2025年度二零二五農(nóng)行個(gè)人二手房交易貸款合同2篇
- 2025年度綠色建筑節(jié)能改造工程合同(二零二五版)4篇
- 二零二五年度商業(yè)門(mén)面租賃合同范本-@-1
- 2025年度綠色生態(tài)餐廳檔口租賃合同樣本4篇
- 2025年度城市軌道交通鋼管材料供應(yīng)與承包合同協(xié)議書(shū)范本
- 2025版南海區(qū)創(chuàng)新創(chuàng)業(yè)人才居住就業(yè)支持合同4篇
- 2025版門(mén)面租賃合同消防安全及責(zé)任承擔(dān)4篇
- 二零二五年度外賣(mài)送餐服務(wù)合同書(shū)(含增值服務(wù))
- 二零二五年度年薪制工資與員工晉升合同模板
- 衛(wèi)生服務(wù)個(gè)人基本信息表
- 醫(yī)學(xué)脂質(zhì)的構(gòu)成功能及分析專(zhuān)題課件
- 高技能人才培養(yǎng)的策略創(chuàng)新與實(shí)踐路徑
- 廣東省湛江市廉江市2023-2024學(xué)年八年級(jí)上學(xué)期期末考試數(shù)學(xué)試卷(含答案)
- 2024年湖北省知名中小學(xué)教聯(lián)體聯(lián)盟中考語(yǔ)文一模試卷
- 安徽省蕪湖市2023-2024學(xué)年高一上學(xué)期期末考試 生物 含解析
- 交叉口同向可變車(chē)道動(dòng)態(tài)控制與信號(hào)配時(shí)優(yōu)化研究
- 燃?xì)庑袠I(yè)有限空間作業(yè)安全管理制度
- 數(shù)列練習(xí)題(含答案)基礎(chǔ)知識(shí)點(diǎn)
- 人教版(2024新版)七年級(jí)上冊(cè)英語(yǔ)期中+期末學(xué)業(yè)質(zhì)量測(cè)試卷 2套(含答案)
- 通用電子嘉賓禮薄
評(píng)論
0/150
提交評(píng)論