




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、選題要求:在 Linux 內(nèi)核中增加一個系統(tǒng)調(diào)用,并編寫對應的 linux 應用程序。 利用該系統(tǒng)調(diào)用能夠遍歷系統(tǒng)當前所有進程的任務描述符, 并按進程父子關系將 這些描述符所對應的進程id ( PID)組織成樹形結構顯示。目錄一. 程序的主要設計思路,實現(xiàn)方式 41.1 添加系統(tǒng)調(diào)用的兩種方法 4.1.1.1 編譯內(nèi)核法 41.1.2 內(nèi)核模塊法 41.2 程序的主要設計思路 5.1.3 環(huán)境 5.二. 程序的模塊劃分,及對每個模塊的說明 52.1 通過內(nèi)核模塊實現(xiàn)添加系統(tǒng)調(diào)用 5.2.1.1 修改系統(tǒng)調(diào)用的模塊 52.1.2 獲取 sys_call_table 的地址 52.1.3 清除內(nèi)存
2、區(qū)域的寫保護 62.2 編寫系統(tǒng)調(diào)用指定自己的系統(tǒng)調(diào)用 7.2.2.1 內(nèi)核的初始化函數(shù) 72.2.2自己的系統(tǒng)調(diào)用服務例程 72.2.3 移除內(nèi)核模塊時,將原有的系統(tǒng)調(diào)用進行還原 92.2.4 模塊注冊相關 92.3 編寫用戶態(tài)的測試程序 9.2.4 編寫 Makefile 文件 1.0.三 . 所遇到的問題及解決的方法 113.1 進程個數(shù)確定 1.13.2 被更改的系統(tǒng)調(diào)用號的選擇 1.13.3 獲取系統(tǒng)調(diào)用表的地址 1.13.4 內(nèi)核和用戶態(tài)數(shù)據(jù)交換 1.1四. 程序運行結果及使用說明 114.1 將編譯出來的內(nèi)核模塊 hello.ko 加載到內(nèi)核中 114.2 通過 dmesg 查看
3、輸出信息是否正確 1.14.3 運行測試程序,輸出樹狀打印結果(部分結果截圖) 124.4 卸載自定義模塊 1.3五 . 附錄 145.1 內(nèi)核模塊程序 hello.c1.45.2 測試程序 hello_test.c 1.7.5.3 Makefile 文件 1.7.程序的主要設計思路,實現(xiàn)方式1.1添加系統(tǒng)調(diào)用的兩種方法1.1.1編譯內(nèi)核法編寫好源碼之后?修改內(nèi)核的系統(tǒng)調(diào)用庫函數(shù)usri nclude/asm-ge neric/u nistd.h,在這里面可以使用在SySCall_table 中沒有用到的 223號?添加系統(tǒng)調(diào)用號,讓系統(tǒng)根據(jù)這個號,去找到SySCall_table中的相應表項
4、。在archx86kernelSySCaILtable_32.s文件中添加系統(tǒng)調(diào)用號和調(diào)用函數(shù)的對應關系?接著就是my_syscall的實現(xiàn)了,在這里有兩種方法:第一種方法是在kernel下自己新建一個目錄添加自己的文件,但是要編寫 Makefile ,而且要修改全局的Makefile 。第二種比較簡便的方法是,在kernel/sys.c中添加自己的服務函數(shù),這樣子不用修改Makefile.以上準備工作做完之后,然后就要進行編譯內(nèi)核了,以下是編譯內(nèi)核的一個過程1. make menuconfig ( 使用圖形化的工具,更新 .config 文件)2. make -j3 bzImage(編譯,-
5、j3指的是同時使用 3個CPU來編譯,bzImage指的是更新grub ,以便重新引導)3. make modules(對模塊進行編譯)4. make modules_i nstall(安裝編譯好的模塊)5. depmod(進行依賴關系的處理)6. reboot(重啟看到自己編譯好的內(nèi)核)1.1.2內(nèi)核模塊法內(nèi)核模塊可以作為獨立程序來編譯的函數(shù)和數(shù)據(jù)類型的集合。之所以提供模塊機制,是因為LinUX本身是一個單內(nèi)核。單內(nèi)核由于所有內(nèi)容都集成在一起,效率很高,但可擴展性和可維護性相對較差,模塊機制可以彌補這一缺陷。LinUX模塊可以通過靜態(tài)或動態(tài)的方法加載到內(nèi)核空間,靜態(tài)加載是指在內(nèi)核啟動過程中加
6、載;動態(tài)加載是指在內(nèi)核運行的過程中隨時加載。一個模塊被加載到內(nèi)核中時,就成為內(nèi)核代碼的一部分。模塊加載入系統(tǒng)時,系統(tǒng)修改內(nèi)核中的符號表,將新加載的模塊提供的資源和符號添加到內(nèi)核符號表中,以便模塊間通信。這種方法是采用系統(tǒng)調(diào)用攔截的一種方式,改變某一個系統(tǒng)調(diào)用號對應的服務程序為我們自己的編寫的程序,從而相當于添加了我們自己的系統(tǒng)調(diào)用。下面的內(nèi)容,會詳述用內(nèi)核模塊法實現(xiàn)目標的過程。1.2程序的主要設計思路二是編寫系統(tǒng)調(diào)用指定自己程序分三部分,一部分是通過內(nèi)核模塊實現(xiàn)添加系統(tǒng)調(diào)用, 的系統(tǒng)調(diào)用,最后是編寫用戶態(tài)的測試程序。1.3環(huán)境Ubu ntu14.04 + 3.13.0 內(nèi)核版本內(nèi)核版本:vir
7、tual nachine:/boot# nae aLiriuX Iinux irtual nachic 3.13.0 24 gcrerlc *46 UbUrItU SMP ThU APr 10 19i0; 14Irr匚 2014 i60e CthIOn 6Sfi CNUZLtnJX二.程序的模塊劃分,及對每個模塊的說明2.1通過內(nèi)核模塊實現(xiàn)添加系統(tǒng)調(diào)用這種方法其實是系統(tǒng)調(diào)用攔截的實現(xiàn)。系統(tǒng)調(diào)用服務程序的地址是放在sys_caILtable中通過系統(tǒng)調(diào)用號定位到具體的系統(tǒng)調(diào)用地址,那么我們通過編寫內(nèi)核模塊來修改SyS_call_table中的系統(tǒng)調(diào)用的地址為我們自己定義的函數(shù)的地址,就可以實現(xiàn)系
8、統(tǒng)調(diào)用的攔截。通過模塊加載時,將系統(tǒng)調(diào)用表里面的那個系統(tǒng)調(diào)用號的那個系統(tǒng)調(diào)用號對應的系統(tǒng)調(diào)用服務例程改為我們自己實現(xiàn)的系統(tǒng)歷程函數(shù)地址。2.1.1修改系統(tǒng)調(diào)用的模塊在 usri ncludei386-li nux-g nu/asm/u nistd_32.h 文件中查看系統(tǒng)調(diào)用序號:rootinux virtual machine:/usr/includc/i.3B6 AiPUX gnu/osn# gcdt UrliEtd 32rh找到結果(部分截圖)tfdefte _NR_fCritl.64 221«defte _NR_getttd 224 defte _NR_readahead 2
9、Z5#defte _NR-SetXattr 226 defte NR_lSetXattr 227可以看到,222號和223號系統(tǒng)調(diào)用是空的,因此選取223作為新的系統(tǒng)調(diào)用號。2.1.2 獲取 SyS_call_table的地址 在/boot/SyStem.map-3.16.0-30-generic查看系統(tǒng)調(diào)用表的內(nèi)存地址:rootnuX-ViLrtUal-FIeChie: / boot# gedtt SyStenknaP-3.13.-24-generic找到結果:cl6Sel40 R SyS_c5ll_table為 0xc165e1402.1.3清除內(nèi)存區(qū)域的寫保護得到了 sys_caILta
10、bIe的地址,該符號對應的內(nèi)存區(qū)域是只讀的。所以我們要修改它,必須對它進行清除寫保護,這里介紹兩種方法:第一種方法:我們知道控制寄存器 Cro的第16位是寫保護位。Cro的第16位置為了禁止超 級權限,若清零了則允許超級權限往內(nèi)核中寫入數(shù)據(jù),這樣我們可以再寫入之前,將那一位清零,使我們可以寫入。然后寫完后,又將那一位復原就行了。/使cr0寄存器的第17位設置為0 (即是內(nèi)核空間可寫)Un Sig ned int clear_a nd_retur n_cr0(Void)Un Sig ned int cr0 = 0;Un Sig ned int ret;asm("movl %cr0, %
11、eax":"=a"(cr0);/將cr0寄存器的值移動到 eax寄存器中,同時輸出到cr0變量中ret = cr0;cr0 &= OXfffeffff;/將 cr0 變量的第 17 位清 0asm("movl %eax, %cr0":"a"(cr0);/將cr0變量的值放入寄存器 eax中,并且放入cr0寄存器中return ret;/讀取val的值到eax寄存器,再將eax寄存器的值放入 cr0寄存器中-改變內(nèi)核地址空間參數(shù)void SetbaCk_cr0 (Un Sig ned int val)asm volat
12、ile("movl %eax, %cr0":"a"(val);第二種方法:通過設置虛擬地址對應的也表項的讀寫屬性來設置。int make_rw (Un Sig ned Iong address)Un Sig ned int level;Pte_t *pte = lookup_address(address, & level);/查找虛擬地址所在的頁表地址if (pte->pte & _PAGE_RW)/設置頁表讀寫屬性pte->pte I=_PAGE_RW;return 0;int make_r O(Un Sig ned Io
13、ng address)Un Sig ned int level;Pte_t *pte = IookUP_address(address, &level);pte->pte &= _PAGE_RW; Zz 設置只讀屬性return 0;2.2編寫系統(tǒng)調(diào)用指定自己的系統(tǒng)調(diào)用2.2.1內(nèi)核的初始化函數(shù)此函數(shù)內(nèi)采用的是2.1.3中的第一種方法。StatiC int _in it ini t_addsyscall(void)Prin tk("hello, yinyu kern eln");ZZ獲取系統(tǒng)調(diào)用服務首地址SyS_call_table = (Un Sig
14、 ned Iong *)sys_caILtabIe_address;Prin tk("%xn",sys_call_table);ZZ保存系統(tǒng)調(diào)用表中的NUM位置上的系統(tǒng)調(diào)用anythin g_SaVed = (in t(*)(void) (SyS_call_tablemy_SySCall_ nu m);ZZ使內(nèi)核地址空間可寫orig_cr0 = clear_a nd_retur n_crO();ZZ用自己的系統(tǒng)調(diào)用替換NUM位置上的系統(tǒng)調(diào)用SyS_call_tablemy_SySCall_ num= (Un Sig ned Iong)& SyS_mycall;ZZ使
15、內(nèi)核地址空間不可寫SetbaCk_cr0(orig_cr0);return 0;2.2.2自己的系統(tǒng)調(diào)用服務例程部分一:創(chuàng)建進程樹void PrOCeSStree(StrUCt task_StrUCt * p,i nt b);結果需要以樹狀形式展示所有進程的父子關系。為此,我們定義PrOCeSStree()歸函數(shù)來訪問遍歷,并且將結果存儲在數(shù)組中,以便提供給用戶態(tài)訪問。void PrOCeSStree(StrUCt task_StrUCt * p,i nt b)ZZ創(chuàng)建進程樹(進程,深度)StrUCt list_head * I;aco Un ter.pid = P -> pid;aco
16、 Un ter.depth = b;CoUn ter +;for(l = P -> ChiIdre n.n ext; I != & (p->childre n); I = l->n ext)StrUCt task_StrUCt *t = list_e ntry(l,struct task_StrUCt,sibli ng); PrOCeSStree(t,b+1);其中,特別使用了宏:#defi ne list_e ntry(ptr, type, member) / (type*)(Char*)(ptr)-( Un Sig nedIong)(&(type *)0)
17、->member)Ptr是指向list_head類型鏈表的指針;type為一個結構;member為結構type中的一個域,類型為 list_head ;這個宏返回指向type結構的指針。目的:從一個結構的成員指針找到其容器的指針部分二:創(chuàng)建自己的系統(tǒng)調(diào)用服務asmli nkage Iong SyS_mycall(char _USer * buf);在SyS_mycall()中,從當前進程開始,遞歸調(diào)用 PrOCeSStree()函數(shù),將進程信息存儲在數(shù) 組中。然后利用copy_to_USer函數(shù)將內(nèi)核信息傳遞給用戶態(tài)下,用戶態(tài)下的測試程序對結果進行展示。asmli nkage Iong
18、SyS_mycall(char _USer * buf)int b = 0;StrUCt task_StrUCt * p;Prin tk("This is yinyU _SySCall!n");for(p = CUrre nt; P != &ini t_task; P = p->pare nt ); PrOCeSStree(P,b);if(copy_to_USer(StrUCt PrOCeSS *)bUf,a,512*sizeof(strUCt PrOCeSS)retUrn -EFAULT;elseretUr n SiZeOf(a);223移除內(nèi)核模塊時,將原
19、有的系統(tǒng)調(diào)用進行還原StatiC Void _exit exit_addsyscall(Void)/設置Cro中對SyS_call_table 的更改權限。orig_cr0 = clear_a nd_retur n_cr0();/恢復原有的中斷向量表中的函數(shù)指針的值。SyS_call_tablemy_SySCall_num= (UnSigned Iong)anything_saved;恢復原有的cr0的值SetbaCk_cr0(orig_cr0);Prin tk("call yinyu exit n");2.2.4模塊注冊相關模塊構造函數(shù)module_ in it(i ni
20、 t_addsyscall);執(zhí)行insmod或modprobe指令加載內(nèi)核模塊時會調(diào)用的初始化函數(shù)。函數(shù)原型必須是module_init(),內(nèi)是函數(shù)指針。模塊析構函數(shù)module_exit(exit_addsyscall);執(zhí)行rmmod指令卸載模塊時調(diào)用的函數(shù)。函數(shù)原型是module_exit();模塊許可聲明MODULE_LICENSE("GPL");函數(shù)原型是MoDULE_LICENSE(),告訴內(nèi)核程序使用的許可證,不然在加載時它會提示該模塊污染內(nèi)核。一般會寫GPL。2.3編寫用戶態(tài)的測試程序#in clude <li nux/uni std.h>#
21、in clude VSySCaIl.h>asmli nkage#in clude <systypes.h>#i nclude <stdio.h>StrUCt PrOCeSSint pid;int depth;StrUCt ProCeSS a512;int mai n()int i,j;SyS_mycall()中。通/在內(nèi)核中將223本來對應的系統(tǒng)調(diào)用,臨時鏈到我們自定義的 過該系統(tǒng)調(diào)用后獲得數(shù)組aPrin tf("the result is:%dn",syscall(223, &a);for(i = 0; i < 512; i+)
22、for(j = 0; j V ai.depth; j+)Prin tf("-");Prin tf("%dn",ai.pid); if(ai+1.pid = 0)break;return 0;2.4編寫Makefile文件KVERS = $(shell Un ame -r)# Kernel modulesobj-m += hello.o# SPeCify flags for the module compilati on.#EXTRA_CFLAGS=-g -OObuild: kern el_modules USer_testkern el_modules:
23、make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modulesUSer_test:gcc -o hello_test hello_test.cclea n:make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clea n三所遇到的問題及解決的方法3.1進程個數(shù)確定系統(tǒng)可運行的最大進程數(shù),通過Ulimit - U查看有7863個rootlinux-Vtrtual-Piachtne:usricludei386-Iinux-guasnff IJIiFIit u 7863我們通過PS - efwc - l命令實
24、際查看當前運行進程數(shù)量為191個rootliu-Virtualnachtne:usrtcude 1386*Iinux-guas PS *efc -I 191存儲進程信息的數(shù)組大小為512是夠用的。3.2被更改的系統(tǒng)調(diào)用號的選擇見 2.1.1。3.3獲取系統(tǒng)調(diào)用表的地址見 2.1.2。3.4內(nèi)核和用戶態(tài)數(shù)據(jù)交換我們在內(nèi)核模塊程序中,將進程遍歷信息存儲在數(shù)組中,然后需要將其傳遞給用戶態(tài)下。采用copy_from_user()和copy_to_user()這兩個函數(shù),這兩個函數(shù)負責在用戶空間和內(nèi)核空間傳遞數(shù)據(jù)。因此我們在測試程序中,將空數(shù)組a的地址作為參數(shù)傳遞給內(nèi)核模塊程序,在內(nèi)核中使用copy_t
25、o_user()函數(shù)將內(nèi)核中的數(shù)組信息傳遞給用戶態(tài)下的地址。四.程序運行結果及使用說明4.1將編譯出來的內(nèi)核模塊hello.ko加載到內(nèi)核中加載內(nèi)核模塊命令:in smodhello.koroot®ItnUX-VtrtUal-machine:h!elluxUixl.tJ3,i-2 Insmod hell.o + ko roctlinux - VirtUaX rIJaChine; o,eltuxUniX/1LnUX li 2fl ISrlOd headModuleSLZeUsed Ihello16743SndcrlSI3712A5A72bnd_d<.97_cadetID57091
26、Snd-tfS1371ac97-bs126421snd.ac97_COdeCgaeport151S91sdes1371sndc3 5501nddt_97 codec J J e13715nd_Page_alloc142331snd,pen12967Ut1«P1&S9524.2通過dmesg查看輸出信息是否正確rootltux-vtrtual-nachte:h01e/Linux/UriiX/linux_ll_2# dmesg tail1974.23S391 task: e6O676 ti: e6256 task.ti: e6250GOL8O74.23352548074÷
27、;Z389Z;1H74.7S96;“B的 4 23999rlfi74.23903'1874,2399' ;2fl303.625174 2<3309.55936EIP; 0073;<b752d886> EFLGS; ODOIOZe6 CPU; O EIP Is t b7>2d836FAX: bfb4ef77 -BX: b76Sd0f)f) E£I: b63646S EDI: bfb4cf77FCX : OaOOf)fi FrJX :EBP: O&OQ0O1-4 ESPi63mb6c6aldcOO7b ES;07b FS; COoeGS:
28、0033 SSI 007bCall yinyu pit hcllo>yi.nyu kernel20309.955930 Cl5el4O4.3運行測試程序,輸出樹狀打印結果(部分結果截圖)root®ILnUX-Vrtual-nachme:/home/nuxLJntX/lInUX_Ii_2# helo-testth* result is:405& lI-II -324I-II 323I-II -463ITI 469I-II -499I-I -509I-513I-I -563I-II 十578卜I 616I-II -b02I-II 769I-I -854I-I -028blI
29、 -933I-99MI -941I-I M4LdI -yaHbbl-I-234Hl-hblI -2322I-I-PldI -2340m-I *2334-I-I-I-II -2355I-I-I-I-I -237&HlJ'blI -2461IlI十!* -2468I-I-I-I-I! - I -2469-I-I-I-I- -2930-*l-PlH 十 I-;931Hl-I-I-II - I -3237I-I-I-I-I - -1-3555I-I-I-1<I-I-HMI 479I-I-I-I-卜卜卜I-II-4680I-I-I-I-Ikl-kl-lI F I -6334I-Id
30、-MI -2990'I-I-I-II -31CI - I-1018I-I-W61I-I-112I-1116I - I-12534.4卸載自定義模塊卸載內(nèi)核模塊命令:in Smodhello.koI root linux-v Irtual-achlfetjhoellif Urititj/Ltu,Lt2tf FpIOd hellorootgli-i<j- virtualmachtre: hoe Yiux UnLxltux-lt2ffIsnodI hedMOdUleStZeLlSed bysd-es1371?4S472sndc97COdeC1057D91Snd_CnSl371ac57_
31、bu&L26421Snd_ac97_CodeCgameport151891Snd_ensl371sdp 5SSS012Sndac97cdec,SndenS1371SndPdgeaIVoc1423015ftd_PCIrlCC32-PCTFlJI12967QIbneP188952rcomn536640五附錄5.1內(nèi)核模塊程序hello.c#in elude <li nux/in it.h>#i nclude <li nu xmodule.h>#i nclude <li nu x/kernel.h>/list_head#in elude <li nu
32、x/uni std.h>#in elude <asm/UaCCeSs.h>#in elude <li nu x/sched.h>/task_StrUCt#defi ne my_SySCall_ num 223#defi ne SyS_call_table_address 0xc165e140StatiC int coun ter = 0;StrUCt PrOCeSSint pid;int depth;;StrUCt PrOCeSS a512;Un Sig ned int clear_a nd_retur n_crO(Void);void SetbaCk_cr0 (
33、Un Sig ned int val);asmli nkage Iong SyS_mycall(char _USer *buf);int orig_cr0;Un Sig ned Iong *sys_call_table = 0;StatiC in t (*a nythin g_SaVed)(Void);創(chuàng)建進程樹(進程,深度)void PrOCeSStree(StrUCt task_StrUCt * p,i nt b)/ StrUCt list_head * l;aco Un ter.pid = P -> pid;aco Un ter.depth = b;CoUn ter +;for(l
34、 = P -> ChiIdre n.n ext; l != & (p->childre n); l = l->n ext)StrUCt task_StrUCt *t = list_e ntry(l,struct task_StrUCt,sibli ng);PrOCeSStree(t,b+1);UnSigned int clear_and_return_crO(Void)/使 cr0 寄存器的第 17 位設置為 O (即是內(nèi)核空間可寫)Un Sig ned int cr0 = 0;Un Sig ned int ret;asm("movl %cr0, %eax&
35、quot;:"=a"(cr0);/將cr0寄存器的值移動到 eax寄存器中,同時輸出到cr0變量中ret = cr0;cr0 &= OXfffeffff;/將 cr0 變量的第 17 位清 0asm("movl %eax, %cr0":"a"(cr0);/將cr0變量的值放入寄存器eax中,并且放入cr0寄存器中return ret;void SetbaCk_cr0(unsigned int val)/讀取val的值到eax寄存器,再將 eax寄存器的值放入cr0寄存器中-改變內(nèi)核地址空間參數(shù)asm volatile(&quo
36、t;movl %eax, %cr0":"a"(val);StatiC int _in it ini t_addsyscall(Void)/保存原來系統(tǒng)調(diào)用表中此地址中的系統(tǒng)調(diào)用Prin tk("hello, yinyu kern eln");SyS_call_table= (Un Sig nedIong *)sys_caILtable_address;獲取系統(tǒng)調(diào)用服務首地址Prin tk("%xn",sys_call_table);any thi ng_saved = (in t(*)(void) (SyS_call_tab
37、lemy_SySCall_ num);/保存系統(tǒng)調(diào)用表中的NUM位置上的系統(tǒng)調(diào)用orig_cr0 = clear_a nd_retur n_cr0();使內(nèi)核地址空間可寫sys_caILtablemy_syscall_ num= (Un Sig ned Iong)& sys_mycall;用自己的系統(tǒng)調(diào)用替換NUM位置上的系統(tǒng)調(diào)用SetbaCk_crO(orig_crO);使內(nèi)核地址空間不可寫return 0;asmli nkage Iong SyS_mycall(char _USer * buf)int b = 0;StrUCt task_StrUCt * p;Prin tk(&qu
38、ot;This is yinyu _SySCall!n");for(p = CUrre nt; P != &ini t_task; P = p->pare nt );PrOCeSStree(P,b);if(copy_to_USer(StrUCt PrOCeSS *)buf,a,512*sizeof(struct process)/將內(nèi)核空間內(nèi)容復制到用戶空間return -EFAULT;elseretur n SiZeOf(a);StatiC void _exit exit_addsyscall(void)/設置cr0中對SyS_call_table 的更改權限。orig_cr0 = clear_a nd_retur n_crO
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 推動非遺保護傳承的面臨的問題、機遇與挑戰(zhàn)
- 抽水蓄能與其他儲能方式的協(xié)同優(yōu)勢
- 小麥白粉病抗性育種的群體遺傳學分析
- 創(chuàng)新引領未來之路
- 多元協(xié)同推進學院建設風險管理評估
- 2025學校食堂廚師聘用合同
- 護理管理提升班
- 統(tǒng)計教育培訓試題及答案
- 內(nèi)蒙古對口高考試題及答案
- 2025標準購房合同模板下載
- 二手房買賣合同范本下載可打印
- 幼兒園大班語言課件:《畢業(yè)詩》
- 人教版二年級下冊口算題天天練1000道可打印帶答案
- 江蘇省南通市如皋市如城實驗小學2023-2024學年五年級下學期期末模擬測試語文試卷
- 2021利達JB-QG-LD988EL JB-QT-LD988EL 火災報警控制器 消防聯(lián)動控制器調(diào)試手冊
- 山東省煙臺市萊州市2023-2024學年八年級下學期期中數(shù)學試題
- 教育資源調(diào)查報告
- 水穩(wěn)基層雙層連鋪專項方案
- 中國加速康復外科臨床實踐指南(2021)解讀
- 叮咚智能鎖說明書
- DB32T 4719-2024酒店服務與廚師職業(yè)技能等級認定工作規(guī)范
評論
0/150
提交評論