版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第六章 設(shè)備管理實(shí)驗(yàn) 【實(shí)驗(yàn)?zāi)康摹?通過本實(shí)驗(yàn)的學(xué)習(xí),了解Linux操作系統(tǒng)中的設(shè)備驅(qū)動(dòng)程序包括哪些組成部分,并能編寫簡(jiǎn)單的字符設(shè)備(scull,Simple Character Utility for Loading Localities)和塊設(shè)備(sbull,Simple Block Utility for Loading Localities)的驅(qū)動(dòng)程序以及對(duì)所編寫設(shè)備驅(qū)動(dòng)程序的測(cè)試,最終了解Linux操作系統(tǒng)是如何管理設(shè)備的。 【準(zhǔn)備知識(shí)】 一設(shè)備驅(qū)動(dòng)程序的簡(jiǎn)單介紹 Linux設(shè)備驅(qū)動(dòng)程序集成在內(nèi)核中,實(shí)際上是處理或操作硬件控制器的軟件。從本質(zhì)上講,驅(qū)動(dòng)程序是常駐內(nèi)存的低級(jí)硬件處理程序
2、的共享庫,設(shè)備驅(qū)動(dòng)程序就是對(duì)設(shè)備的抽象處理;也即是說,設(shè)備驅(qū)動(dòng)程序是內(nèi)核中具有高特權(quán)級(jí)的、常駐內(nèi)存的、可共享的下層硬件處理例程。 設(shè)備驅(qū)動(dòng)程序軟件封裝了如何控制這些設(shè)備的技術(shù)細(xì)節(jié),并通過特定的接口導(dǎo)出一個(gè)規(guī)范的操作集合(見圖1);內(nèi)核使用規(guī)范的設(shè)備接口(字符設(shè)備接口和塊設(shè)備接口)通過文件系統(tǒng)接口把設(shè)備操作導(dǎo)出到用戶空間程序中。(由于本實(shí)驗(yàn)不涉及網(wǎng)絡(luò)設(shè)備,故在此就不作討論) 圖1 字符(塊)設(shè)備、驅(qū)動(dòng)程序和接口 字 符 設(shè) 備 驅(qū) 動(dòng) 程 序 接 口 鍵盤驅(qū)動(dòng)程序 串口驅(qū)動(dòng)程序 并口驅(qū)動(dòng)程序 其它驅(qū)動(dòng)程序 ? 塊 設(shè) 備 驅(qū) 動(dòng) 程 序 接 口 硬盤驅(qū)動(dòng)程序 軟盤驅(qū)動(dòng)程序 光盤驅(qū)動(dòng)程序 其它驅(qū)動(dòng)
3、程序 ? 在Linux中,字符設(shè)備和塊設(shè)備的I/O操作是有區(qū)別的。塊設(shè)備在每次硬件操作時(shí)把多個(gè)字節(jié)傳送到主存緩存中或從主存緩存中把多個(gè)字節(jié)信息傳送到設(shè)備中;而字符設(shè)備并不使用緩存,信息傳送是一個(gè)字節(jié)一個(gè)字節(jié)地進(jìn)行的。 Linux操作系統(tǒng)允許設(shè)備驅(qū)動(dòng)程序作為可裝載內(nèi)核模塊實(shí)現(xiàn),這也就是說,設(shè)備的接口實(shí)現(xiàn)不僅可以在Linux 操作系統(tǒng)啟動(dòng)時(shí)進(jìn)行注冊(cè),而且還可以在Linux 操作系統(tǒng)啟動(dòng)后裝載模塊時(shí)進(jìn)行注冊(cè)。 總之,Linux操作系統(tǒng)支持多種設(shè)備,這些設(shè)備的驅(qū)動(dòng)程序有如下一些特點(diǎn): (1)內(nèi)核代碼:設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,如果驅(qū)動(dòng)程序出錯(cuò),則可能導(dǎo)致系統(tǒng)崩潰。 (2)內(nèi)核接口:設(shè)備驅(qū)動(dòng)程序必須為
4、內(nèi)核或者其子系統(tǒng)提供一個(gè)標(biāo)準(zhǔn)接口。比如,一個(gè)終端驅(qū)動(dòng)程序必須為內(nèi)核提供一個(gè)文件I/O接口;一個(gè)SCSI設(shè)備驅(qū)動(dòng)程序應(yīng)該為SCSI子系統(tǒng)提供一個(gè)SCSI設(shè)備接口,同時(shí)SCSI子系統(tǒng)也必須為內(nèi)核提供文件的I/O接口及緩沖區(qū)。 (3)內(nèi)核機(jī)制和服務(wù):設(shè)備驅(qū)動(dòng)程序使用一些標(biāo)準(zhǔn)的內(nèi)核服務(wù),如內(nèi)存分配等。 (4)可裝載:大多數(shù)的Linux操作系統(tǒng)設(shè)備驅(qū)動(dòng)程序都可以在需要時(shí)裝載進(jìn)內(nèi)核,在不需要時(shí)從內(nèi)核中卸載。 (5)可設(shè)置:Linux操作系統(tǒng)設(shè)備驅(qū)動(dòng)程序可以集成為內(nèi)核的一部分,并可以根據(jù)需要把其中的某一部分集成到內(nèi)核中,這只需要在系統(tǒng)編譯時(shí)進(jìn)行相應(yīng)的設(shè)置即可。 (6)動(dòng)態(tài)性:當(dāng)系統(tǒng)啟動(dòng)且各個(gè)設(shè)備驅(qū)動(dòng)程序初始
5、化后,驅(qū)動(dòng)程序?qū)⒕S護(hù)其控制的設(shè)備。如果該設(shè)備驅(qū)動(dòng)程序控制的設(shè)備不存在也不影響系統(tǒng)的運(yùn)行,此時(shí)的設(shè)備驅(qū)動(dòng)程序只是多占用了一點(diǎn)系統(tǒng)內(nèi)存罷了。 二設(shè)備驅(qū)動(dòng)程序與外界的接口 每種類型的驅(qū)動(dòng)程序,不管是字符設(shè)備還是塊設(shè)備都為內(nèi)核提供相同的調(diào)用接口,故內(nèi)核能以相同的方式處理不同的設(shè)備。Linux為每種不同類型的設(shè)備驅(qū)動(dòng)程序維護(hù)相應(yīng)的數(shù)據(jù)結(jié)構(gòu),以便定義統(tǒng)一的接口并實(shí)現(xiàn)驅(qū)動(dòng)程序的可裝載性和動(dòng)態(tài)性。 Linux設(shè)備驅(qū)動(dòng)程序與外界的接口可以分為如下三個(gè)部分: (1)驅(qū)動(dòng)程序與操作系統(tǒng)內(nèi)核的接口:這是通過數(shù)據(jù)結(jié)構(gòu)file_operations來完成的。 (2)驅(qū)動(dòng)程序與系統(tǒng)引導(dǎo)的接口:這部分利用驅(qū)動(dòng)程序?qū)υO(shè)備進(jìn)行初
6、始化。 (3)驅(qū)動(dòng)程序與設(shè)備的接口:這部分描述了驅(qū)動(dòng)程序如何與設(shè)備進(jìn)行交互,這與具體設(shè)備密切相關(guān)。 可歸結(jié)為如下圖2: 設(shè)備驅(qū)動(dòng)程序 操作系統(tǒng)內(nèi)核 接口 數(shù)據(jù)結(jié)構(gòu) file_operations 實(shí)現(xiàn) 系統(tǒng)引導(dǎo) 接口 各設(shè)備 初始化 具體設(shè)備 接口 進(jìn)行交互 驅(qū)動(dòng)程序與設(shè)備間 圖2 設(shè)備驅(qū)動(dòng)程序與外界的接口 三設(shè)備驅(qū)動(dòng)程序的組織結(jié)構(gòu) 設(shè)備驅(qū)動(dòng)程序有一個(gè)比較標(biāo)準(zhǔn)的組織結(jié)構(gòu),一般可以分為下面三個(gè)主要組成部分: (1)自動(dòng)配置和初始化子程序 這部分程序負(fù)責(zé)檢測(cè)所要驅(qū)動(dòng)的硬件設(shè)備是否存在以及是否能正常工作。如果該設(shè)備正常,則對(duì)設(shè)備及其驅(qū)動(dòng)程序所需要的相關(guān)軟件狀態(tài)進(jìn)行初始化。這部分程序僅在初始化時(shí)被調(diào)用
7、一次。 (2)服務(wù)于I/O請(qǐng)求的子程序 該部分又可稱為驅(qū)動(dòng)程序的上半部分。系統(tǒng)調(diào)用對(duì)這部分進(jìn)行調(diào)用。系統(tǒng)認(rèn)為這部分程序在執(zhí)行時(shí)和進(jìn)行調(diào)用的進(jìn)程屬于同一個(gè)進(jìn)程,只是由用戶態(tài)變成了內(nèi)核態(tài),而且具有進(jìn)行此系統(tǒng)調(diào)用的用戶程序的運(yùn)行環(huán)境。故可以在其中調(diào)用與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。 (3)中斷服務(wù)子程序 該部分又可稱為驅(qū)動(dòng)程序的下半部分。設(shè)備在I/O請(qǐng)求結(jié)束時(shí)或其它狀態(tài)改變時(shí)產(chǎn)生中斷。中斷可以產(chǎn)生在任何一個(gè)進(jìn)程運(yùn)行時(shí),因此中斷服務(wù)子程序被調(diào)用時(shí)不能依賴于任何進(jìn)程的狀態(tài),因而也就不能調(diào)用與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。因?yàn)樵O(shè)備驅(qū)動(dòng)程序一般支持同一類型的若干設(shè)備,所以一般在系統(tǒng)調(diào)用中斷服務(wù)子程序時(shí)都帶有一個(gè)或多個(gè)參
8、數(shù),以唯一標(biāo)識(shí)請(qǐng)求服務(wù)的設(shè)備。 四設(shè)備驅(qū)動(dòng)程序的代碼 設(shè)備驅(qū)動(dòng)程序是一些函數(shù)和數(shù)據(jù)結(jié)構(gòu)的集合,這些函數(shù)和數(shù)據(jù)結(jié)構(gòu)是為實(shí)現(xiàn)管理設(shè)備的一個(gè)簡(jiǎn)單接口。操作系統(tǒng)內(nèi)核使用這個(gè)接口來請(qǐng)求驅(qū)動(dòng)程序?qū)υO(shè)備進(jìn)行I/O操作。甚至,我們可以把設(shè)備驅(qū)動(dòng)程序看成是一個(gè)抽象數(shù)據(jù)類型,它為計(jì)算機(jī)中的每個(gè)硬件設(shè)備都建立了一個(gè)通用函數(shù)接口。由于一個(gè)設(shè)備驅(qū)動(dòng)程序就是一個(gè)模塊,所以在內(nèi)核內(nèi)部用一個(gè)file結(jié)構(gòu)來識(shí)別設(shè)備驅(qū)動(dòng)程序,而且內(nèi)核使用file_operatuions結(jié)構(gòu)來訪問設(shè)備驅(qū)動(dòng)程序中的函數(shù)。 了解設(shè)備驅(qū)動(dòng)程序代碼的如下幾個(gè)部分: 驅(qū)動(dòng)程序的注冊(cè)與注銷。 設(shè)備的打開與釋放。 設(shè)備的讀寫操作。 設(shè)備的控制操作。 設(shè)備的中斷
9、和輪詢處理。 第一部分 字符設(shè)備驅(qū)動(dòng)程序的代碼 1 了解什么是字符設(shè)備 2 了解字符設(shè)備的基本入口點(diǎn) 字符設(shè)備的基本入口點(diǎn)也可稱為子程序,它們被包含在驅(qū)動(dòng)程序的file_operations結(jié)構(gòu)中。 open()函數(shù); release()函數(shù); read()函數(shù); write()函數(shù); ioctl()函數(shù); select()函數(shù)。 3 字符設(shè)備的注冊(cè) 設(shè)備驅(qū)動(dòng)程序提供的入口點(diǎn)在設(shè)備驅(qū)動(dòng)程序初始化時(shí)向系統(tǒng)登記,以便系統(tǒng)調(diào)用。Linux系統(tǒng)通過調(diào)用register_chrdev()向系統(tǒng)注冊(cè)字符型設(shè)備驅(qū)動(dòng)程序。 register_chrdev()定義如下: #include <linux/f
10、s.h> #include <linux/errno.h> int register_chrdev(unsigned int major, const char *name, struct file_operations *ops); 其中major時(shí)設(shè)備驅(qū)動(dòng)程序向系統(tǒng)申請(qǐng)的主設(shè)備號(hào)。如果它為0,則系統(tǒng)為該驅(qū)動(dòng)程序動(dòng)態(tài)地分配第一個(gè)空閑的主設(shè)備號(hào),并把設(shè)備名和文件操作表的指針置于chrdevs表的相應(yīng)位置。name是設(shè)備名,ops是對(duì)各個(gè)調(diào)用入口點(diǎn)的說明。register_chrdev()函數(shù)返回0表示注冊(cè)成功;返回-EINVAL表示申請(qǐng)的主設(shè)備號(hào)非法,一般主設(shè)備號(hào)大于系統(tǒng)所允
11、許的最大設(shè)備號(hào);返回-EBUSY表示所申請(qǐng)的主設(shè)備號(hào)正被其它設(shè)備驅(qū)動(dòng)程序使用。如果動(dòng)態(tài)分配主設(shè)備號(hào)成功,則該函數(shù)將返回所分配的主設(shè)備號(hào)。如果register_chrdev()操作成功,則設(shè)備名就會(huì)出現(xiàn)在/proc/devices文件中。 字符設(shè)備注冊(cè)以后,還必須在文件系統(tǒng)中為其創(chuàng)建一個(gè)代表節(jié)點(diǎn)。該節(jié)點(diǎn)可以是在/dev目錄中的一個(gè)節(jié)點(diǎn),這種節(jié)點(diǎn)都是文件節(jié)點(diǎn),且每個(gè)節(jié)點(diǎn)代表一個(gè)具體的設(shè)備。不過要有主設(shè)備號(hào)和從設(shè)備號(hào)兩個(gè)參數(shù)才能創(chuàng)建一個(gè)節(jié)點(diǎn)。還可以是在devfs設(shè)備文件目錄下的一個(gè)節(jié)點(diǎn),對(duì)于這種節(jié)點(diǎn)應(yīng)根據(jù)主設(shè)備號(hào)給每一種設(shè)備都創(chuàng)建一個(gè)目錄節(jié)點(diǎn),在這個(gè)目錄下才是代表具體設(shè)備的文件節(jié)點(diǎn)。 【實(shí)驗(yàn)內(nèi)容】
12、編寫一個(gè)簡(jiǎn)單的字符設(shè)備驅(qū)動(dòng)程序。要求該字符設(shè)備包括scull_open()、scull_write()、scull_read()、scull_ioctl()和scull_release()五個(gè)基本操作,并編寫一個(gè)測(cè)試程序來測(cè)試你所編寫的字符設(shè)備驅(qū)動(dòng)程序。 【實(shí)驗(yàn)指導(dǎo)】 先給出字符設(shè)備驅(qū)動(dòng)程序要用到的數(shù)據(jù)結(jié)構(gòu)定義: struct device_struct const char *name; struct file_operations *chops; ; static struct device_struct chrdevsMAX_CHRDEV; typedef struct Scull_De
13、v void *data; int quantum; / the current quantum size int qset; / the current array size unsigned long size; unsigned int access_key; / used by sculluid and scullpriv unsigned int usage; / lock the device while using it struct Scull_Dev *next; / next listitem scull; 1 字符設(shè)備的結(jié)構(gòu) 字符設(shè)備的結(jié)構(gòu)即字符設(shè)備的開關(guān)表。當(dāng)字符設(shè)備注
14、冊(cè)到內(nèi)核后,字符設(shè)備的名字和相關(guān)操作被添加到device_struct結(jié)構(gòu)類型的chrdevs全局?jǐn)?shù)組中,稱chrdevs為字符設(shè)備的開關(guān)表。下面以一個(gè)簡(jiǎn)單的例子說明字符設(shè)備驅(qū)動(dòng)程序中字符設(shè)備結(jié)構(gòu)的定義:(假設(shè)設(shè)備名為scull) * file_operation結(jié)構(gòu)定義如下,即定義chr設(shè)備的_fops * static int scull_open(struct inode *inode,struct file *filp); static int scull_release(struct inode *inode,struct file *filp); static ssize_t sc
15、ull_write(struct inode *inode,struct file *filp,const char *buffer,int count); static ssize_t scull_read(struct inode *inode,struct file *filp,char *buffer,int count); static int scull_ioctl(struct inode *inode,struct file *filp,unsigned long int cmd,unsigned long arg); struct file_operation chr_fop
16、s = NULL, / seek scull_read, / read scull_write, / write NULL, / readdir NULL, / poll scull_ioctl, / ioctl NULL, / mmap scull_open, / open NULL, / flush scull_release, / release NULL, / fsync NULL, / fasync NULL, / check media change NULL, / revalidate NULL / lock ; 2 字符設(shè)備驅(qū)動(dòng)程序入口點(diǎn) 字符設(shè)備驅(qū)動(dòng)程序入口點(diǎn)主要包括初始化字
17、符設(shè)備、字符設(shè)備的I/O調(diào)用和中斷。在引導(dǎo)系統(tǒng)時(shí),每個(gè)設(shè)備驅(qū)動(dòng)程序通過其內(nèi)部的初始化函數(shù)init()對(duì)其控制的設(shè)備及其自身初始化。字符設(shè)備初始化函數(shù)為chr_dev_init(),包含在/linux/drivers/char/mem.c中,它的主要功能之一是在內(nèi)核中登記設(shè)備驅(qū)動(dòng)程序。具體調(diào)用是通過register_chrdev()函數(shù)。register_chrdev()函數(shù)定義如下:#include <linux/fs.h>#include <linux/errno.h>int register_chrdev(unsigned int major,const char
18、*name,struct file_operation *fops); 其中major是為設(shè)備驅(qū)動(dòng)程序向系統(tǒng)申請(qǐng)的主設(shè)備號(hào)。如果為0,則系統(tǒng)為此驅(qū)動(dòng)程序動(dòng)態(tài)地分配一個(gè)主設(shè)備號(hào)。name是設(shè)備名。fops是前面定義的file_operation結(jié)構(gòu)的指針。在登記成功的情況下,如果指定了major,則register_chrdev()函數(shù)返回值為0;如果major值為0,則返回內(nèi)核分配的主設(shè)備號(hào)。并且register_chrdev()函數(shù)操作成功,設(shè)備名就會(huì)出現(xiàn)在/proc/devices文件里;在登記失敗的情況下,register_chrdev()函數(shù)返回值為負(fù)。 初始化部分一般還負(fù)責(zé)給設(shè)備驅(qū)動(dòng)
19、程序申請(qǐng)系統(tǒng)資源,包括內(nèi)存、中斷、時(shí)鐘、I/O端口等,這些資源也可以在open()子程序或別的地方申請(qǐng)。在這些資源不用的時(shí)候,應(yīng)該釋放它們,以利于資源的共享。 用于字符設(shè)備的I/O調(diào)用主要有:open()、release()、read()、write()和ioctl()。open()函數(shù)的使用比較簡(jiǎn)單,當(dāng)一個(gè)設(shè)備被進(jìn)程打開時(shí),open()函數(shù)被喚醒:static int scull_open(struct inode *inode,struct file *filp) MOD_INC_USE_COUNT; return 0;注意宏MOD_INC_USE_COUNT的使用: Linux內(nèi)核需要跟
20、蹤系統(tǒng)中每個(gè)模塊的使用信息,以確保設(shè)備的安全使用。MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT可以檢查使用驅(qū)動(dòng)程序的用戶數(shù),以保護(hù)模塊被意外地卸載。release()函數(shù)的使用和open()函數(shù)相似:static int scull_release(struct inode *inode,struct file *filp) MOD_DEC_USE_COUNT; return 0;當(dāng)設(shè)備文件執(zhí)行read()調(diào)用時(shí),將從設(shè)備中讀取數(shù)據(jù),實(shí)際上是從內(nèi)核數(shù)據(jù)隊(duì)列中讀取,并傳送給用戶空間。設(shè)備驅(qū)動(dòng)程序的write()函數(shù)的使用和read()函數(shù)相似,只不過是數(shù)據(jù)傳送的方向發(fā)生
21、了變化,即按要求的字節(jié)數(shù)count從用戶空間的緩沖區(qū)buf復(fù)制到硬件或內(nèi)核的緩沖區(qū)中。 有時(shí)需要獲取或改變正在運(yùn)行的設(shè)備的參數(shù),這時(shí)就需要用到ioctl()函數(shù): static int scull_ioctl(struct inode *inode,struct file *filp,unsigned long int cmd,unsigned long arg);其中參數(shù)cmd是驅(qū)動(dòng)程序要執(zhí)行的命令的特殊代碼;參數(shù)arg是任何類型的4字節(jié)數(shù),它為特定的cmd提供參數(shù)。在Linux中,內(nèi)核中的每個(gè)設(shè)備都有唯一的基本號(hào)(base number)及和基本號(hào)相關(guān)的命令范圍。具體的ioctl基本號(hào)可參
22、見Documentation/ioctlnumber。Linux中定義了四種ioctl()函數(shù)調(diào)用:_IO(base,command) / 可以定義所需要的命令,沒有數(shù)據(jù)傳送的問題,返回正數(shù) _IOR(base,command,size) / 讀操作的ioctl控制 _IOW(base,command,size) / 寫操作的ioctl控制 _IOWR(base,command,size) / 讀寫操作的ioctl控制 當(dāng)用到的硬件設(shè)備能產(chǎn)生中斷信號(hào)時(shí),需要中斷服務(wù)子程序。 下面給出幾個(gè)入口函數(shù)流程圖的參考設(shè)計(jì)。 2.1 函數(shù)scull_open() 2.2 函數(shù)scull_write() 2
23、.3 函數(shù)scull_read() 2.4 函數(shù)scull_ioctl() 2.5 函數(shù)scull_release() 3 字符設(shè)備驅(qū)動(dòng)程序的安裝 編寫完設(shè)備驅(qū)動(dòng)程序后,下一項(xiàng)任務(wù)是對(duì)它進(jìn)行編譯和裝入可引導(dǎo)的內(nèi)核。對(duì)字符驅(qū)動(dòng)程序,可以用下面的步驟來完成:(2)在chr_dev_init()函數(shù)的最后增加調(diào)用init_module()子程序的行(chr_dev_init()函數(shù)在drivers/char/mem.c中)。(3)編輯drivers/char目錄中的makefile,將driver.o的名稱放在OBJS定義的后面,并將driver.c名稱放在SRCS定義的后面。(4)將目錄改變到Li
24、nux源程序目錄的最上層,重新建立和安裝內(nèi)核。作為一般性預(yù)防措施,當(dāng)改變內(nèi)核的代碼時(shí),應(yīng)當(dāng)將計(jì)算機(jī)上重要的內(nèi)容作一次備份。(5)如果用lilo引導(dǎo)系統(tǒng),最好將新內(nèi)核作為試驗(yàn)項(xiàng),在lilo.conf文件中另加一個(gè)Linux引導(dǎo)段。4 測(cè)試函數(shù) 在該字符設(shè)備驅(qū)動(dòng)程序編譯加載后,再在/dev目錄下創(chuàng)建字符設(shè)備文件chrdev,使用命令: #mknod /dev/chrdev c major minor ,其中“c”表示chrdev是字符設(shè)備,“major”是chrdev的主設(shè)備號(hào)。 (該字符設(shè)備驅(qū)動(dòng)程序編譯加載后,可在/proc/devices文件中獲得主設(shè)備號(hào),或者使用命令: #cat /proc/devices | awk ”$2= ”chrdev” print$1” 獲得主設(shè)備號(hào))。該測(cè)試函數(shù)的流程圖可如下設(shè)計(jì): 第二部分 塊設(shè)備驅(qū)動(dòng)程序的代碼 1 了解什么是塊設(shè)備 2 塊設(shè)備驅(qū)動(dòng)程序描述符 塊設(shè)備驅(qū)動(dòng)程序描述符是一個(gè)blk_dev_struct類型的數(shù)據(jù)結(jié)構(gòu),器定義如下: struct blk_dev_struct / queue_proc has to be atomic request_queue_t request_queue ; queue_proc *queue ; void *date ; ; 在這個(gè)結(jié)構(gòu)中,請(qǐng)求隊(duì)列request_queu
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 水務(wù)培訓(xùn)課件教學(xué)課件
- 捉浪花課件教學(xué)課件
- 游覽路線課件教學(xué)課件
- 2024年度版權(quán)交換合同標(biāo)的及交換條件
- 2024年品牌授權(quán)經(jīng)銷合同
- 2024年度xyz公司人工智能技術(shù)授權(quán)合同
- 2024年度BIM技術(shù)在建筑可視化與展示中的應(yīng)用合同
- 2024年度培訓(xùn)費(fèi)用協(xié)議書
- 2024年度0KV電力線路施工綠化配套合同
- 2024年北京影視特效技術(shù)服務(wù)協(xié)議
- 回收PET塑料資源化利用及產(chǎn)業(yè)化進(jìn)展研究
- 《住院患者身體約束的護(hù)理》團(tuán)體標(biāo)準(zhǔn)解讀課件
- 英語-浙江省湖州、衢州、麗水2024年11月三地市高三教學(xué)質(zhì)量檢測(cè)試卷試題和答案
- 勞動(dòng)技術(shù)教案
- 廣東省深圳市2023-2024學(xué)年高一上學(xué)期生物期中試卷(含答案)
- 第七章 立體幾何與空間向量綜合測(cè)試卷(新高考專用)(學(xué)生版) 2025年高考數(shù)學(xué)一輪復(fù)習(xí)專練(新高考專用)
- 大學(xué)美育(同濟(jì)大學(xué)版)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 勞動(dòng)法律學(xué)習(xí)試題
- 過敏性休克完整版本
- 應(yīng)急第一響應(yīng)人理論考試試卷(含答案)
- DZ∕T 0213-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 石灰?guī)r、水泥配料類(正式版)
評(píng)論
0/150
提交評(píng)論