




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1第第2 章章 構(gòu)造和運(yùn)行模塊構(gòu)造和運(yùn)行模塊Hello World 模塊模塊 模塊與應(yīng)用程序模塊與應(yīng)用程序 模塊的編譯和加載模塊的編譯和加載 內(nèi)核符號表內(nèi)核符號表 初始化和關(guān)閉初始化和關(guān)閉 模塊參數(shù)模塊參數(shù)2Hello World 模塊模塊#include #include #include MODULE_LICENSE(Dual BSD/GPL); static int hello_init(void) printk(KERN_ALERT Hello, worldn); return 0; static void hello_exit(void) printk(KERN_ALERT Good
2、bye, cruel worldn); module_init(hello_init); module_exit(hello_exit); 3Hello World 模塊模塊編譯編譯% make make1: Entering directory /usr/src/linux-2.6.10 CC M /home/ldd3/src/misc-modules/hello.o Building modules, stage 2. MODPOST CC /home/ldd3/src/misc-modules/hello.mod.o LD M /home/ldd3/src/misc-modules/he
3、llo.ko make1: Leaving directory /usr/src/linux-2.6.10 % su root# insmod ./hello.koHello, world root# rmmod hello Goodbye cruel world root#4Hello World 模塊模塊模塊常用的一些宏模塊常用的一些宏MODULE_AUTHOR(author);聲明模塊的作者聲明模塊的作者M(jìn)ODULE_DESCRIPTION(description); 說明模塊的用途說明模塊的用途MODULE_VERSION(version_string);聲明模塊的修訂號聲明模塊的修訂
4、號 MODULE_DEVICE_TABLE(table_info); 說明模塊所支持的設(shè)說明模塊所支持的設(shè)備備MODULE_ALIAS(alternate_name);說明模塊的別名說明模塊的別名EXPORT_SYMBOL (symbol); 聲明模塊導(dǎo)出的符號聲明模塊導(dǎo)出的符號EXPORT_SYMBOL_GPL (symbol);聲明模塊導(dǎo)出的符號聲明模塊導(dǎo)出的符號5第第2 章章 構(gòu)造和運(yùn)行模塊構(gòu)造和運(yùn)行模塊Hello World 模塊模塊 模塊與應(yīng)用程序模塊與應(yīng)用程序 模塊的編譯和加載模塊的編譯和加載 內(nèi)核符號表內(nèi)核符號表 初始化和關(guān)閉初始化和關(guān)閉 模塊參數(shù)模塊參數(shù)6模塊與應(yīng)用程序模塊與應(yīng)
5、用程序 應(yīng)用程序應(yīng)用程序從頭至尾執(zhí)行單個任務(wù),運(yùn)行在從頭至尾執(zhí)行單個任務(wù),運(yùn)行在用戶空間用戶空間核心模塊核心模塊可根據(jù)需要加載、卸載可根據(jù)需要加載、卸載加載時初始化并注冊自己,然后等待服務(wù)于將來的某加載時初始化并注冊自己,然后等待服務(wù)于將來的某個請求,類似于個請求,類似于事件驅(qū)動事件驅(qū)動的編程的編程退出時必須自己清理現(xiàn)場(撤銷初始化函數(shù)所做的一退出時必須自己清理現(xiàn)場(撤銷初始化函數(shù)所做的一切)切)只能使用內(nèi)核導(dǎo)出的符號(函數(shù)與變量),不能使用只能使用內(nèi)核導(dǎo)出的符號(函數(shù)與變量),不能使用函數(shù)庫函數(shù)庫libc運(yùn)行在運(yùn)行在內(nèi)核空間內(nèi)核空間7模塊與應(yīng)用程序模塊與應(yīng)用程序內(nèi)核空間和用戶空間內(nèi)核空間和用
6、戶空間03G4G0X虛擬地址空間虛擬地址空間 內(nèi)存空間內(nèi)存空間物理內(nèi)存物理內(nèi)存PAGE_OFFSET用戶空間內(nèi)核空間內(nèi)核空間地址與物理內(nèi)存地只內(nèi)核空間地址與物理內(nèi)存地只差一偏移量,故內(nèi)核空間地址差一偏移量,故內(nèi)核空間地址(虛地址)到內(nèi)存空間地址的(虛地址)到內(nèi)存空間地址的轉(zhuǎn)換是直接的,不需經(jīng)頁表轉(zhuǎn)換是直接的,不需經(jīng)頁表8模塊與應(yīng)用程序模塊與應(yīng)用程序內(nèi)核空間和用戶空間內(nèi)核空間和用戶空間03G4G0X虛擬地址空間虛擬地址空間 PAGE_OFFSET用戶空間內(nèi)核空間xx頁頁yy頁頁xx頁頁yy頁頁頁表頁表用戶空間地址(虛地址)到內(nèi)用戶空間地址(虛地址)到內(nèi)存空間地址的轉(zhuǎn)換必需經(jīng)頁表存空間地址的轉(zhuǎn)換必
7、需經(jīng)頁表內(nèi)存空間內(nèi)存空間物理內(nèi)存物理內(nèi)存9模塊與應(yīng)用程序模塊與應(yīng)用程序內(nèi)核中的并發(fā)內(nèi)核中的并發(fā)內(nèi)核編程與常見應(yīng)用程序編程的區(qū)別在于對并發(fā)的處理,內(nèi)核編程與常見應(yīng)用程序編程的區(qū)別在于對并發(fā)的處理,內(nèi)核代碼(包括驅(qū)動)必須是可重入的,必須能夠同時運(yùn)行在多內(nèi)核代碼(包括驅(qū)動)必須是可重入的,必須能夠同時運(yùn)行在多個上下文中。個上下文中。產(chǎn)生并發(fā)的原因產(chǎn)生并發(fā)的原因 Linux是多任務(wù)系統(tǒng),同時運(yùn)行多個進(jìn)程是多任務(wù)系統(tǒng),同時運(yùn)行多個進(jìn)程 產(chǎn)生中斷產(chǎn)生中斷 內(nèi)核定時器內(nèi)核定時器 對稱多處理器(對稱多處理器(SMP) 2.6內(nèi)核可搶占,在單處理器上也存在類似多處理器的內(nèi)核可搶占,在單處理器上也存在類似多處理
8、器的并發(fā)并發(fā)10模塊與應(yīng)用程序模塊與應(yīng)用程序當(dāng)前進(jìn)程當(dāng)前進(jìn)程由指向當(dāng)前進(jìn)程控制塊由指向當(dāng)前進(jìn)程控制塊struct task_struct 的指針的指針current可獲得當(dāng)前進(jìn)程可獲得當(dāng)前進(jìn)程 current-comm:當(dāng)前進(jìn)程命令名:當(dāng)前進(jìn)程命令名 current-pid :當(dāng)前進(jìn)程:當(dāng)前進(jìn)程ID早期版本中早期版本中current為一個全局變量,在為一個全局變量,在2.6中,中,current 存放在內(nèi)核棧中存放在內(nèi)核棧中內(nèi)核棧大小為內(nèi)核棧大小為4096B,由用戶進(jìn)程與內(nèi)核進(jìn)程共享,由用戶進(jìn)程與內(nèi)核進(jìn)程共享,不要聲明大的自動變量不要聲明大的自動變量11第第2 章章 構(gòu)造和運(yùn)行模塊構(gòu)造和運(yùn)行模
9、塊Hello World 模塊模塊 模塊與應(yīng)用程序模塊與應(yīng)用程序 模塊的編譯和加載模塊的編譯和加載 內(nèi)核符號表內(nèi)核符號表 初始化和關(guān)閉初始化和關(guān)閉 模塊參數(shù)模塊參數(shù)12模塊的編譯和裝載模塊的編譯和裝載編譯模塊編譯模塊模塊不是獨(dú)立的可執(zhí)行程序,需要依賴核心才能工作模塊不是獨(dú)立的可執(zhí)行程序,需要依賴核心才能工作,需要使用核心導(dǎo)出的符號,例,需要使用核心導(dǎo)出的符號,例printk()模塊不能單獨(dú)編譯,應(yīng)該用核心的構(gòu)造系統(tǒng)來構(gòu)造,模塊不能單獨(dú)編譯,應(yīng)該用核心的構(gòu)造系統(tǒng)來構(gòu)造,即使用編譯核心時所使用的編譯器、鏈接器工具及同即使用編譯核心時所使用的編譯器、鏈接器工具及同樣的內(nèi)核源代碼樹環(huán)境樣的內(nèi)核源代碼樹
10、環(huán)境模塊可放在模塊可放在內(nèi)核源碼代碼樹中構(gòu)造內(nèi)核源碼代碼樹中構(gòu)造也可放在也可放在內(nèi)核源代內(nèi)核源代碼樹外構(gòu)造碼樹外構(gòu)造13模塊的編譯和裝載模塊的編譯和裝載1.放在內(nèi)核源代碼樹中放在內(nèi)核源代碼樹中設(shè)備驅(qū)動程存放在內(nèi)核源代碼樹根目錄設(shè)備驅(qū)動程存放在內(nèi)核源代碼樹根目錄drivers/的子目錄下,例如:的子目錄下,例如:字符設(shè)備:字符設(shè)備:drivers/char/ 塊設(shè)備:塊設(shè)備:drivers/block/ USB設(shè)備:設(shè)備:drivers/usb/ char下有子目錄,也有文件,驅(qū)動程序源碼是下有子目錄,也有文件,驅(qū)動程序源碼是放在該目錄下還是創(chuàng)建一個自己的子目錄?放在該目錄下還是創(chuàng)建一個自己的子
11、目錄?14模塊的編譯和裝載模塊的編譯和裝載 放在放在drivers/char/下下拷貝拷貝hello.c到到drivers/char/目錄下目錄下打開打開drivers/char/Makefile,在其中增加一行:,在其中增加一行:obj-m +=hello.o 或若有配置選項(xiàng),增加如下一行:或若有配置選項(xiàng),增加如下一行:obj-$(CONFIG_HELLO) += hello.oobj-$(CONFIG_HELLO) += hello.o 打開配置文件打開配置文件drivers/char/Kconfig,在其中增加一項(xiàng):,在其中增加一項(xiàng):config HELLOtristate “New H
12、ello”make menuconfigmake modules在何處執(zhí)行在何處執(zhí)行make?15模塊的編譯和裝載模塊的編譯和裝載 放在放在drivers/char/下的子目錄中下的子目錄中在在 drivers/char/下創(chuàng)建子目錄下創(chuàng)建子目錄hello拷貝拷貝hello.c到到drivers/char/hello/目錄下目錄下打開打開drivers/char/Makefile,在其中增加一行:,在其中增加一行:obj-m +=hello/ 或若有配置選項(xiàng),增加如下一行:或若有配置選項(xiàng),增加如下一行:objobj-$(CONFIG_HELLO) += hello/-$(CONFIG_HELL
13、O) += hello/ 在在drivers/char/hello/下新建下新建Makefile,需一行:,需一行:obj-m += fishing.o 或若有配置選項(xiàng):或若有配置選項(xiàng):obj-$(CONFIG_HELLO) += hello.o 16模塊的編譯和裝載模塊的編譯和裝載打開配置文件打開配置文件drivers/char/Kconfig,在其中增加一項(xiàng),在其中增加一項(xiàng): config HELLOtristate “New Hello”make menuconfigmake modules17模塊的編譯和裝載模塊的編譯和裝載2. 放在內(nèi)核源代碼外放在內(nèi)核源代碼外設(shè)放在設(shè)放在/home/
14、ldd下下,則需在該目錄中新建一則需在該目錄中新建一Makefile,只需一行:,只需一行:obj-m := hello.o運(yùn)行命令運(yùn)行命令make -C /kernel/source/location SUBDIRS=$PWD modules或使用帶條件語句的復(fù)雜或使用帶條件語句的復(fù)雜makefile(見后)(見后)18模塊的編譯和裝載模塊的編譯和裝載加載卸載模塊加載卸載模塊insmod module 需指定模塊的完整文件名及路徑需指定模塊的完整文件名及路徑modprobe module modprobe 只能從標(biāo)準(zhǔn)的已安裝模塊目錄中搜索需要裝只能從標(biāo)準(zhǔn)的已安裝模塊目錄中搜索需要裝入的模塊入
15、的模塊(/lib/modules/(shell uname r)rmmod module modprobe r modules 19模塊的編譯和裝載模塊的編譯和裝載hello world 的編譯的編譯建建hello目錄,將目錄,將hello.c與與makefile放入其下,放入其下,makefile中只需一行:中只需一行: Obj-m :=hello.o在在hello目錄下運(yùn)行命令:目錄下運(yùn)行命令: make -C /kernel-2.6 M=$PWD modules或使用帶條件語句的復(fù)雜或使用帶條件語句的復(fù)雜makefile(見后)(見后)20模塊的編譯和裝載模塊的編譯和裝載帶條件語句的帶條
16、件語句的makefile:在在hello目錄下運(yùn)行命令目錄下運(yùn)行命令make# If KERNELRELEASE is defined, weve been invoked from the# If KERNELRELEASE is defined, weve been invoked from the# kernel build system and can use its language. # kernel build system and can use its language. ifneqifneq ($(KERNELRELEASE),) ($(KERNELRELEASE),) o
17、bj-m := hello.oobj-m := hello.o# Otherwise we were called directly from the command # Otherwise we were called directly from the command # line; invoke the kernel build system. # line; invoke the kernel build system. else else KERNELDIR ?= /lib/modules/$(shell unameKERNELDIR ?= /lib/modules/$(shell
18、uname -r)/build -r)/build PWD := $(shell pwdPWD := $(shell pwd) ) default: default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules $(MAKE) -C $(KERNELDIR) M=$(PWD) modules endifendif21第第2 章章 構(gòu)造和運(yùn)行模塊構(gòu)造和運(yùn)行模塊Hello World 模塊模塊 模塊與應(yīng)用程序模塊與應(yīng)用程序 模塊的編譯和加載模塊的編譯和加載 內(nèi)核符號表內(nèi)核符號表 初始化和關(guān)閉初始化和關(guān)閉 模塊參數(shù)模塊參數(shù)22內(nèi)核符號表內(nèi)核符號表內(nèi)核符號表中包含
19、了所有全局內(nèi)核項(xiàng)(函數(shù)和變量)內(nèi)核符號表中包含了所有全局內(nèi)核項(xiàng)(函數(shù)和變量)的地址,這是實(shí)現(xiàn)模塊化驅(qū)動程序所必需的,當(dāng)模塊的地址,這是實(shí)現(xiàn)模塊化驅(qū)動程序所必需的,當(dāng)模塊被裝入內(nèi)核后,它所導(dǎo)出的任何符號都會成為內(nèi)核符被裝入內(nèi)核后,它所導(dǎo)出的任何符號都會成為內(nèi)核符號表的一部分。號表的一部分。模塊可導(dǎo)出符號供其他模塊使用,也可不導(dǎo)出任何符模塊可導(dǎo)出符號供其他模塊使用,也可不導(dǎo)出任何符號,只實(shí)現(xiàn)自己的功能號,只實(shí)現(xiàn)自己的功能利用模塊導(dǎo)出的符號可以在已有模塊基礎(chǔ)上層疊新模利用模塊導(dǎo)出的符號可以在已有模塊基礎(chǔ)上層疊新模塊,這稱為塊,這稱為模塊層疊技術(shù)模塊層疊技術(shù)模塊層疊技術(shù)可將復(fù)雜模塊分為幾層,然后從上到
20、下模塊層疊技術(shù)可將復(fù)雜模塊分為幾層,然后從上到下逐層實(shí)現(xiàn),以減化實(shí)現(xiàn)的復(fù)雜性逐層實(shí)現(xiàn),以減化實(shí)現(xiàn)的復(fù)雜性23內(nèi)核符號表內(nèi)核符號表例如例如video-for-linux 驅(qū)動程序組劃分出了一個通用驅(qū)動程序組劃分出了一個通用模塊,它導(dǎo)出的符號可供下層與具體硬件相關(guān)的驅(qū)動模塊,它導(dǎo)出的符號可供下層與具體硬件相關(guān)的驅(qū)動程序使用。根據(jù)所安裝的具體硬件的不同,可以加載程序使用。根據(jù)所安裝的具體硬件的不同,可以加載通用的通用的video模塊以及與具體硬件相關(guān)的特定模塊模塊以及與具體硬件相關(guān)的特定模塊msdos文件依賴文件依賴fat模塊導(dǎo)出的符號模塊導(dǎo)出的符號USB輸入設(shè)備模塊層疊在輸入設(shè)備模塊層疊在usbc
21、ore和和input模塊之上模塊之上Modprobe是處理模塊層疊的一個實(shí)用工具是處理模塊層疊的一個實(shí)用工具如何向內(nèi)核導(dǎo)出符號?如何向內(nèi)核導(dǎo)出符號?EXPORT_SYMBOL(name); EXPORT_SYMBOL_GPL(nam )24第第2 章章 構(gòu)造和運(yùn)行模塊構(gòu)造和運(yùn)行模塊Hello World 模塊模塊 模塊與應(yīng)用程序模塊與應(yīng)用程序 模塊的編譯和加載模塊的編譯和加載 內(nèi)核符號表內(nèi)核符號表 初始化和關(guān)閉初始化和關(guān)閉 模塊參數(shù)模塊參數(shù)25初始化和關(guān)閉初始化和關(guān)閉初始化初始化模塊的初始化函數(shù)負(fù)責(zé)模塊的初始化函數(shù)負(fù)責(zé)注冊注冊模塊所提供的任何模塊所提供的任何設(shè)施設(shè)施。這里的設(shè)施指的是一個可以被
22、應(yīng)用程序訪問的新功能這里的設(shè)施指的是一個可以被應(yīng)用程序訪問的新功能,它也可能是一個完整的驅(qū)動程序或者僅僅是一個軟,它也可能是一個完整的驅(qū)動程序或者僅僅是一個軟件抽象。初始化函數(shù)定義:件抽象。初始化函數(shù)定義:static intstatic int _ _init_ _init initialization_function(void initialization_function(void) ) / /* * Initialization code here Initialization code here * */ / module_init(initialization_functionm
23、odule_init(initialization_function); );26初始化和關(guān)閉初始化和關(guān)閉_ _init修飾標(biāo)記表示在模塊裝載之后,模塊裝載器就修飾標(biāo)記表示在模塊裝載之后,模塊裝載器就會將初始化函數(shù)扔掉,以釋放其占用的內(nèi)存資源會將初始化函數(shù)扔掉,以釋放其占用的內(nèi)存資源_ _initdata 與與_ _init類似,只不過用于修飾數(shù)據(jù)類似,只不過用于修飾數(shù)據(jù)內(nèi)核源代碼中可能還會碰到內(nèi)核源代碼中可能還會碰到 _ _devinit 和和 _ _devinitdata ,此兩修飾符只有在內(nèi)核,此兩修飾符只有在內(nèi)核未被配置為支持熱插拔時被翻譯為未被配置為支持熱插拔時被翻譯為_ _init
24、 和和_ _initdata27初始化和關(guān)閉初始化和關(guān)閉清除函數(shù)清除函數(shù)清除函數(shù)負(fù)責(zé)在模塊被卸載前注銷接口并向系統(tǒng)中返清除函數(shù)負(fù)責(zé)在模塊被卸載前注銷接口并向系統(tǒng)中返回所有資源。清除函數(shù)定義:回所有資源。清除函數(shù)定義:清除函數(shù)沒有返回值清除函數(shù)沒有返回值_ _exit 表示該代碼僅用于模塊卸載表示該代碼僅用于模塊卸載static void static void _ _exit_ _exit cleanup_function(void cleanup_function(void) ) / /* * Cleanup code here Cleanup code here * */ / module
25、_exit(cleanup_functionmodule_exit(cleanup_function); );28初始化和關(guān)閉初始化和關(guān)閉初始化過程中的錯誤處理初始化過程中的錯誤處理int _ _init my_init_function(voidint _ _init my_init_function(void) ) intint err; err; / /* * registration takes a pointer and a name registration takes a pointer and a name * */ / err = register_this(ptr1, sk
26、ull);err = register_this(ptr1, skull);if (err) goto fail_thisif (err) goto fail_this; ; err = register_that(ptr2, skull); err = register_that(ptr2, skull); if (err) goto fail_thatif (err) goto fail_that; ; err = register_those(ptr3, skull); err = register_those(ptr3, skull); if (err) goto fail_those
27、if (err) goto fail_those; ; return 0; /return 0; /* * success success * */ /fail_thosefail_those: unregister_that(ptr2, skull);: unregister_that(ptr2, skull);fail_thatfail_that: unregister_this(ptr1, skull); : unregister_this(ptr1, skull); fail_thisfail_this: return err; /: return err; /* * propagat
28、e the error propagate the error * */ / 29初始化和關(guān)閉初始化和關(guān)閉模塊的清除函數(shù)需要撤銷初始化函數(shù)所注冊的所有設(shè)模塊的清除函數(shù)需要撤銷初始化函數(shù)所注冊的所有設(shè)施施void _ _exit my_cleanup_function(voidvoid _ _exit my_cleanup_function(void) ) unregister_those(ptr3, skull);unregister_those(ptr3, skull); unregister_that(ptr2, skull); unregister_that(ptr2, skull);
29、unregister_this(ptr1, skull); unregister_this(ptr1, skull); return;return; 30第第2 章章 構(gòu)造和運(yùn)行模塊構(gòu)造和運(yùn)行模塊Hello World 模塊模塊 模塊與應(yīng)用程序模塊與應(yīng)用程序 模塊的編譯和加載模塊的編譯和加載 內(nèi)核符號表內(nèi)核符號表 初始化和關(guān)閉初始化和關(guān)閉 模塊參數(shù)模塊參數(shù)31模塊參數(shù)模塊參數(shù)應(yīng)用程序可帶參數(shù)運(yùn)行,模塊裝載時若也能帶參數(shù),應(yīng)用程序可帶參數(shù)運(yùn)行,模塊裝載時若也能帶參數(shù),將會增強(qiáng)模塊的適應(yīng)性將會增強(qiáng)模塊的適應(yīng)性insmod/modprobe執(zhí)行時可指定模塊參數(shù),執(zhí)行時可指定模塊參數(shù),modprobe
30、還可從其配置文件還可從其配置文件/etc/modprobe.conf 中讀取參數(shù)中讀取參數(shù)怎么給模塊增加參數(shù)?怎么給模塊增加參數(shù)?module_param(name, type, perm); 32模塊參數(shù)模塊參數(shù)例給例給hello world模塊增加參數(shù)模塊增加參數(shù)static char *whom = world;static int howmany = 1;module_param(howmany, int, S_IRUGO);module_param(whom, charp, S_IRUGO);static int hello_init(void) int i; for (i = 0; i howm
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞動合同法在企業(yè)的實(shí)施調(diào)查報告(2025年版)
- 2025年股權(quán)轉(zhuǎn)讓框架協(xié)議
- 2025年離婚協(xié)議書兩個小孩模板
- 【單元重點(diǎn)難點(diǎn)】譯林版(三起)英語三年級上冊Unit-7-單元復(fù)習(xí)(知識梳理檢測)-(含解析)
- 2025年河北省邢臺市單招職業(yè)適應(yīng)性測試題庫學(xué)生專用
- 2024年運(yùn)載火箭遙測系統(tǒng)檢測設(shè)備項(xiàng)目資金需求報告代可行性研究報告
- 第九章 第2節(jié) 液體的壓強(qiáng)(教學(xué)設(shè)計)2024-2025學(xué)年人教版(2024)物理八年級下冊
- 2025年海口市單招職業(yè)傾向性測試題庫參考答案
- 2025年廣東省外語藝術(shù)職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫一套
- 《小數(shù)除法-誰打電話時間長》(教學(xué)設(shè)計)-2024-2025學(xué)年五年級上冊數(shù)學(xué)北師大版
- 初三九年級下冊部編人教版歷史考試必背資料(2020最新版)
- 觀賞樹木的園林特性課件
- 當(dāng)代教育心理學(xué)(范圍)課件
- 法院卷宗范本
- XX化工有限責(zé)任公司維保方案
- 冷作工工藝與技能訓(xùn)練(第三版)教學(xué)課件匯總整本書電子教案全套教學(xué)教程完整版電子教案(最新)
- 部編版六年級下冊語文課堂作業(yè)本答案
- 圖解2022年新制訂全面推進(jìn)“大思政課”建設(shè)的工作方案學(xué)習(xí)解讀《全面推進(jìn)“大思政課”建設(shè)的工作方案》課件
- 家譜樹形圖模板
- 文苑小學(xué)安全管理網(wǎng)絡(luò)圖0
- 2 遺傳圖繪制
評論
0/150
提交評論