




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、1,第六章 Linux設備管理,設備管理概述 總線、橋、端口、接口 設備驅動 Linux塊設備管理 塊設備 buffer head bio和bio_vec I/O請求隊列(Request queue) 調度算法 deadline、as、cfq、noop Linux其他設備管理 字符設備 網(wǎng)絡設備/時鐘設備/終端設備 設備管理相關技術 中斷 DMA,2,設備分類 (1),輸入設備、輸出設備 輸入設備:鍵盤、鼠標 輸出設備:顯示器、打印機 輸入/輸出設備:磁盤、網(wǎng)絡、串口設備 系統(tǒng)設備與外部設備 系統(tǒng)設備:系統(tǒng)時鐘、系統(tǒng)揚聲器、總線接口 系統(tǒng)設備的驅動由內(nèi)核本身完成 外部設備: 外部設備的驅動由專
2、門的驅動程序實現(xiàn),以內(nèi)核模塊的方式附加到內(nèi)核中 外部設備可以被安裝和卸載,而系統(tǒng)設備則不能,3,設備分類 (2),獨占設備與共享設備 獨占設備:在某一時間段內(nèi)只能被一個進程所使用的設備 打印機、終端設備等 共享設備: 允許多個進程同時使用的設備。 磁盤等存儲設備:允許多個進程同時訪問文件,存取文件的數(shù)據(jù) 字符設備與塊設備 字符設備:終端設備(顯示器、鍵盤、鼠標等)、打印機、串口設備 順序訪問 塊設備:磁盤、光盤、閃存 隨即訪問 塊設備都是以“文件系統(tǒng)掛載”的方式進行訪問,4,設備管理,設備管理目標 從資源的角度出發(fā) 要盡可能地提高設備的使用效率,提高I/O系統(tǒng)的性能; 從用戶的角度出發(fā) 設備管
3、理系統(tǒng)要屏蔽各種設備的物理特性,為用戶提供一個統(tǒng)一的、方便的I/O操作界面 設備管理功能 設備分配 根據(jù)設備的特點對設備進行合理的分配和調度 設備驅動 根據(jù)進程的I/O請求,啟動設備操作,控制數(shù)據(jù)傳輸 設備中斷處理:對設備產(chǎn)生的中斷進行處理 虛擬設備:用共享設備模擬獨占設備,實現(xiàn)虛擬設備,5,設備與系統(tǒng)的接口,外部物理設備無法直接與CPU相連接的,存在以下差異 控制方式不同 CPU是數(shù)字化命令,而設備需要物理信號來控制 傳輸方式不同 CPU以字節(jié)為數(shù)據(jù)傳輸單位,設備可能以位或者塊為單位 速度不匹配 設備的工作速度要比CPU慢許多 時序不一致 設備的定時控制電路,難以與CPU的時鐘一致 信息形式
4、不同 CPU處理信息是數(shù)字的,設備則可能是模擬的 總線、橋、端口、接口 Busses, Bridges, Ports, and Interfaces,6,第六章 Linux設備管理,設備管理概述 總線、橋、端口、接口 設備驅動 Linux塊設備管理 塊設備 buffer head bio和bio_vec I/O請求隊列(Request queue) 調度算法 deadline、as、cfq、noop Linux其他設備管理 字符設備 網(wǎng)絡設備/時鐘設備/終端設備 設備管理相關技術 中斷 DMA,7,總線 (bus) 與 橋(bridge),總線(bus) 以總線為紐帶,系統(tǒng)板上的部件都通過總線
5、相連,所有的信號都要通過總線進行傳輸。 a processor communicates with its surrounding devices is through a series of electrical connections (line). address bus data bus control bus 北橋 vs. 南橋 Bridge是兩個bus之間連接硬件,front-side bus,8,總線 (bus),Intel Hubs The newer Intel system architecture has moved to the concept of hubs GMCH
6、 Graphics and Memory Controller Hub ICH I/O Controller Hub,9,總線 (bus),AMD HyperTransport PCI compatible,10,總線(bus),總線由CPU控制 CPU通過總線訪問內(nèi)存和設備,以及控制在內(nèi)存和設備之間傳輸數(shù)據(jù) 獨占使用方式 總線采用獨占使用方式,任何設備若需要直接和內(nèi)存交換數(shù)據(jù),先要申請總線使用權,獲得使用權后獨占總線進行通信 數(shù)據(jù)交換 字符設備 CPU與慢速字符設備交換數(shù)據(jù)時,由CPU控制設備與內(nèi)存之間的數(shù)據(jù)交換 輸入時,CPU從控制器中將數(shù)據(jù)讀到CPU的寄存器中,再寫到內(nèi)存單元 輸出時,將
7、內(nèi)存數(shù)據(jù)讀到CPU的寄存器中,再寫到控制器的數(shù)據(jù)寄存器中 塊設備 CPU與某些高速的塊設備交換數(shù)據(jù)時,以DMA方式進行 DMA控制器先申請總線使用權,然后控制設備直接與內(nèi)存?zhèn)鬏敂?shù)據(jù),11,端口、接口,設備適配器與設備 顯卡 vs. 顯示器 聲卡 vs. 音響 網(wǎng)卡 vs. 網(wǎng)線 設備適配器(控制器)通過總線插槽(ISA或PCI等)接入系統(tǒng)總線,12,端口、接口,出于通用性設計的考慮,計算機硬件結構都提供了一些標準的設備接口,這些接口遵照統(tǒng)一的標準來設計,不同的設備只要遵從同一標準即可通過該接口與系統(tǒng)連接。 I/O接口分為兩類 通用接口 如串口、并口、USB接口 專用接口 IDE(Integra
8、ted Device Electronics,集成設備電路) SCSI接口 一個I/O接口可以帶多個同類型的設備 例如一個IDE接口可以帶兩個IDE磁盤驅動器 標準的I/O接口為設備的開發(fā)和使用提供了方便,13,端口、接口,設備資源 I/O設備與系統(tǒng)通信必須首先獲得一些系統(tǒng)資源 I/O端口地址 適配器中的每個I/O端口寄存器都有一個唯一的地址,一個適配器所擁有的I/O端口地址的總和稱為該設備的I/O范圍。 如COM1的I/O范圍為0 x03f80 x03ff。 中斷申請?zhí)朓RQ 設備申請中斷使用的中斷號碼 緩沖區(qū)地址 適配器中的緩沖區(qū)所映射的內(nèi)存地址范圍 DMA通道號 設備申請DMA使用的DM
9、A通道號碼 在安裝設備時,由系統(tǒng)為適配器分配這些資源,并保證各個設備的資源彼此不相沖突。,14,第六章 Linux設備管理,設備管理概述 總線、橋、端口、接口 設備驅動 Linux塊設備管理 塊設備 buffer head bio和bio_vec I/O請求隊列(Request queue) 調度算法 deadline、as、cfq、noop Linux其他設備管理 字符設備 網(wǎng)絡設備/時鐘設備/終端設備 設備管理相關技術 中斷 DMA,15,I/O設備的軟件結構,16,設備識別,設備號 主設備號 (8bit) major number usually referred to a device
10、 driver or controller 次設備號 (8bit) minor number was a particular device within that controller 主設備號標識設備的控制器,次設備號用來區(qū)分同一控制器下的不同設備實例 主設備號與設備的驅動程序一一對應,而次設備號供驅動程序內(nèi)部使用 devfs: 通過devfs(設備文件系統(tǒng))訪問 (Linux的新動向) With devfs, a module can register a device by name rather than a major/minor number pair 通過一個16bit設備號進
11、行識別 為了兼容,devfs可以將major:minor模式轉換為唯一的16bit設備號,17,設備驅動,The hardware device driver 直接操控底層硬件 熟知底層設備的物理特性 register locations, I/O, timing, 設備管理方式 interrupt, DMA 封裝對物理設備的操作 提供open、close、read、write等操作函數(shù),18,通用塊設備驅動, Generic Block Driver register_blkdev (major, dev_name, fops) 注冊 struct gendisk *alloc_disk (
12、int minors); include/linux/genhd.h 創(chuàng)建gendisk結構體 blk_init_queue(request_fn_proc, spinlock_t) 初始化I/O請求隊列 void add_disk (struct gendisk *disk); 使得內(nèi)核對該塊設備可見,19,訪問塊設備,Device driver registers itself at driver initialization time This adds the driver to the kernels driver table mapping the device number /d
13、evices name (每個設備被視為一個文件) to the block_device_operations structure,20,第六章 Linux設備管理,設備管理概述 總線、橋、端口、接口 設備驅動 Linux塊設備管理 塊設備 buffer head bio和bio_vec I/O請求隊列(Request queue) 調度算法 deadline、as、cfq、noop Linux其他設備管理 字符設備 網(wǎng)絡設備/時鐘設備/終端設備 設備管理相關技術 中斷 DMA,21,塊設備 硬盤,扇區(qū) Sector(扇區(qū)) 512B Sector是磁盤存儲的最小物理單位 塊(block)
14、塊(block)由若干個相鄰的扇區(qū)組成 塊是對存儲空間的邏輯劃分 塊是分區(qū)格式化時指定的“最小存儲單位” Sblock = 2k Ssector (但小于或等于頁的大小) 常見塊大?。?512B, 1KB,4KB 說明 扇區(qū):設備的最小尋址單位 塊: 文件系統(tǒng)的最小尋址單位 文件系統(tǒng)以塊為單位對磁盤進行讀/寫,22,Buffer Head結構體 (1),buffer The buffer represents a disk block in memory 當磁盤上的一個block調入內(nèi)存時,其存儲在一個buffer中 每個buffer和一個block對應 一個page可存儲一個或多個block
15、 buffer_head結構體 buffer_head是buffer的描述符 記錄了buffer與block對應關系:來自哪個設備、哪個block 記錄了內(nèi)核操作buffer的所需信息: 狀態(tài)、計數(shù)等 A buffer_head contains all the information necessary to map a physical block to a buffer in physical memory.,23,Buffer 與 Buffer Head (2),buffer_head結構體 (include/linux/buffer_head.h L50) 說明 b_data指向bu
16、ffer在內(nèi)存的起始地址 b_data + b_size即為buffer在內(nèi)存中的結束地址,24,Buffer 與 Buffer Head (3),unsigned long b_state; /* buffer state flags */,25,bio (block I/O)和bio_vec結構體 (1),為了更好地利用內(nèi)存碎片,一個磁盤block能否對應多個不連續(xù)內(nèi)存片段呢? bio_vec 來描述內(nèi)存中的片段(segment),這些segment可位于不同的page bio被引入用來描述一個磁盤block與多個內(nèi)存片段對應,26,bio和bio_vec結構體 (2),bio結構體 (i
17、nclude/linux/bio.h L70),27,bio和bio_vec結構體 (3),bio_vec結構體 (include/linux/bio.h L56) 描述一個segment片段,28,buffer_head 與 bio總結,buffer_head描述一個連續(xù)內(nèi)存空間,它與磁盤上一個block對應 bio用來描述一個磁盤block與多個內(nèi)存片段對應 bio_vec 來描述內(nèi)存中的片段(segment),這些segment可位于不同的物理page,29,訪問塊設備,通用塊設備層(Generic Block Device Layer) request queue,30,請求隊列,Re
18、quest Queues and Scheduling I/O When a read or write request traverses the layers from VFS, through the filesystem drivers and page cache, it eventually ends up entering the block device driver to perform the actual I/O on the device that holds the data requested I/O請求隊列(I/O request queue) 每個塊設備擁有自己
19、的I/O request queue 進程在對request queue“更新”前,須先對該隊列加“鎖” attempting to optimizes throughput but does not indefinitely postpone requests. (吞吐率 vs. 等待延遲),31,I/O請求隊列,request_queue結構體 (include/linux/blkdev.h L287) 字段 struct list_head queue_head; /指向I/O請求隊列頭 struct request *last_merge; /最近剛合并的請求 elevator_t *
20、elevator; /電梯調度算法(三者之一) struct request_list rq; /read請求隊列和write請求隊列 只要請求隊列不為空,對應的塊設備驅動就從隊列頭獲取請求,然后處理。 在Linux2.6內(nèi)核,塊設備通過在_init()函數(shù)中調用 request_queue_t *blk_init_queue(request_fn_proc *rfn, spinlock_t *lock) 來初始化請求隊列. (drivers/block/ll_rw_blk.c L1505),32,I/O請求,request結構體 (include/linux/blkdev.h L108) r
21、equest_queue中的每一項I/O請求用request結構體描述 字段 struct bio *bio; /第一個bio struct bio *biotail; /最后一個bio sector_t hard_sector; /* next sector to complete */ unsigned long hard_nr_sectors; /* no. of sectors left to complete */ unsigned int hard_cur_sectors; /* no. of sectors left to complete in the current segm
22、ent */ struct gendisk *rq_disk; /指向磁盤 unsigned long start_time; unsigned int timeout; 說明: 一個request可能涉及多個連續(xù)的磁盤block,每個block用一個bio表示 磁盤上的block必須連續(xù),但在內(nèi)存中并不一定連續(xù),即每個bio結構體可以組織多個內(nèi)存segment (每個segment用bio_vec來描述),33,下課了!,34,I/O調度,為什么需要I/O調度? 磁盤尋址是指將磁頭定位到特定的塊 磁盤尋址是整個計算機中最慢的操作之一 想一想:若按request提交的次序響應操作,會怎么樣?
23、磁頭頻繁來回移動 (相當于電梯為每一個請求來回跑),非常耗時 I/O scheduler I/O scheduler的工作是管理塊設備的request queue 決定隊列中request的排列順序,及派發(fā)request的時機 目標:減少全局磁盤尋址時間、提高吞吐率 為了提高系統(tǒng)整體性能,可能對某些request不公平 法寶:對request進行預處理 合并(merging)和排序(sorting),35,I/O調度,排序(sorting) 將請求隊列按照扇區(qū)地址同向方向有序排列 新提交的請求可以“插隊” 合并(merging) 在磁盤訪問時,若block相鄰的兩個請求可以合并,36,The
24、Linus Elevator,說明 在Linux 2.4中,linux elevator是默認的I/O調度程序 在Linux 2.6中,被deadline和as算法替代 當一個新request加入隊列中時 當一個新請求到來時,先檢查隊列看能否合并 如果隊列中已存在一個相鄰磁盤扇區(qū)操作的請求,則新請求和這個已存在的請求合并 否則,新請求被插入到隊列中一個合適的位置 按扇區(qū)地址增長原則,能否插入到兩個請求之間 否則,新請求加入到隊列尾 特殊情況 若隊列中某個請求等待時間超過了一個閥值(threadhold),新請求被加入到隊列尾部,防止其他請求饑餓 缺點:并不能真正地防止饑餓,37,Deadlin
25、e I/O Scheduler (1),為了消除饑餓,特別是讀請求饑餓,提出了Deadline I/O Scheduler drivers/block/deadline-iosched.c 區(qū)分read request和write request的緊迫程度 Read request: 必須和進程同步,因為進程必須掛起,直到讀操作完成 Write request:可以和進程異步執(zhí)行 (但頁不能讓write reqeust等太久才執(zhí)行) 缺省的deadline 每個請求都有一個超時時間(an expiration time) Read請求: 500ms write請求: 5s 三個隊列 在sort
26、ed queue,請求按磁盤扇區(qū)地址增長方向排列 在read queue和write queue,請求按FIFO排列,38,Deadline I/O Scheduler (2),Deadline I/O Scheduler 新請求到來時 在sorted queue中進行插入或合并 以保證sorted queue中請求按磁盤扇區(qū)地址增長方向排列 根據(jù)請求類型,按FIFO加入到read queue或者write queue的隊尾 處理請求(讀請求優(yōu)先) 先檢查read queue的隊首元素,若該請求已到期限,則馬上處理 若無read請求到期,則去檢查write queue的隊首元素 若無read請
27、求和write請求到期,則按sorted queue進行處理 缺點: 降低了系統(tǒng)吞吐率 有可能多次尋址,39,Anticipatory I/O Scheduler (預測、期待),Anticipatory I/O scheduler目標是 通過短暫時間停滯,期待臨近地址的請求到來,以減少磁頭頻繁來回尋址 attempts to anticipate what the next operation is and aims to improve I/O throughput. drivers/block/as-iosched.c 與deadline I/O scheduler異同 相同點 Read
28、 queue, write queue, sorted queue 對每個請求設置deadline:read request 500ms, write request 5s 不同點 處理完一個請求后, Anticipatory并不馬上處理其他請求,而是暫停6ms(預等待期),以等待一個位置臨近的請求到來 若在預等待期內(nèi),有一個臨近區(qū)域的請求到來,則處理該請求 過了預等待期,則調度程序回歸正常操作(和deadline調度一樣),40,cfq: Complete Fair Queuing I/O Scheduler,cfq (完全公平調度算法)是為特殊任務設計的 Round robin per-p
29、rocess disk scheduling drivers/block/cfq-iosched.c 核心思想 cfg為每個進程創(chuàng)建一個I/O請求隊列 在每個隊列中,I/O請求按序排列(支持“插隊”或“合并”) 以時間片輪轉調度進程的I/O請求 This provides fairness at a per-process level, assuring that each process receives a fair slice of the disks bandwidth. 說明: The intended workload is multimedia cfq is recommende
30、d for desktop workloads,41,The noop I/O Scheduler (no-operation),no-op I/O Scheduler drivers/block/noop-iosched.c It is intended only for random-access devices, e.g., flash memory cards. 核心思想 Noop面向random-access device,故不存在磁頭來回移動問題,故無需使I/O request按地址增長方向排序(無需插隊) reqeust queue I/O請求按FIFO排隊 對地址相鄰的兩個請求
31、進行“合并” 故在noop中,請求隊列是一種near-FIFO(近似FIFO)隊列 說明 常用于無磁盤的嵌入式系統(tǒng)(RAM),42,I/O調度算法總結,Linux2.6提供了以上四種塊設備I/O請求調度算法 在啟動階段,可以通過命令行修改 elevator=foo 激活新的I/O調度算法,43,第六章 Linux設備管理,設備管理概述 總線、橋、端口、接口 設備驅動 Linux塊設備管理 塊設備 buffer head bio和bio_vec I/O請求隊列(Request queue) 調度算法 deadline、as、cfq、noop Linux其他設備管理 字符設備 網(wǎng)絡設備/時鐘設備/
32、終端設備 設備管理相關技術 中斷 DMA,44,其他設備 (1),字符設備(Character device) 字符設備與主機之間的I/O通過字符或者字符流 例如:key board (serial devices) Block device和character device比較 All Linux device I/O is based on files. All Linux device I/O is either character or block Random access Block device (Yes) vs. character device (No) 請求隊列(Reque
33、st queue) Block device需要request queue,而character device不需要 中斷(Interrupt) 對無buffer的character device來說,每接受一個字符須發(fā)生中斷 而對于Block device而言,一個數(shù)據(jù)塊才發(fā)生一次中斷,45,其他設備 (2),網(wǎng)絡設備(Network Devices) Network devices have attributes of both block and character devices Like a character device, at the physical level, data
34、is transmitted serially. Like a block device, data is packetized and moved to and from the network controller via direct memory access(DMA). 時鐘設備(Clock Devices) Clocks are I/O devices that count the hardware heartbeat of the system. Without the concept of elapsed time, Linux would cease to function.
35、 終端設備(Terminal Devices) tty: send and receive text data,46,第六章 Linux設備管理,設備管理概述 總線、橋、端口、接口 設備驅動 Linux塊設備管理 塊設備 buffer head bio和bio_vec I/O請求隊列(Request queue) 調度算法 deadline、as、cfq、noop Linux其他設備管理 字符設備 網(wǎng)絡設備/時鐘設備/終端設備 設備管理相關技術 中斷 DMA,47,中斷,中斷(interrupt) 在計算機運行期間,當系統(tǒng)內(nèi)部或外部發(fā)生了某個異步事件需要CPU處理時,CPU將暫時中止當前正在執(zhí)
36、行的程序,而轉去執(zhí)行相應的事件處理程序,待處理完畢后又返回原來被中斷處,繼續(xù)執(zhí)行或者調度新的進程執(zhí)行,這個過程就稱為“中斷”。 異步事件指與系統(tǒng)運行沒有時序關系的、不可預期的事件 用戶按下鍵盤按鍵、磁盤傳輸數(shù)據(jù)完成、系統(tǒng)硬件出現(xiàn)故障等 中斷最早應用在I/O傳輸過程中,它使外部設備和CPU的并行工作成為可能 中斷技術已擴大到設備之外的其他事件 凡是需要CPU干涉或處理的異步事件都采用中斷的手段進行處理。 中斷對于操作系統(tǒng)的意義重大,它是系統(tǒng)一切并發(fā)活動的基礎,因而是操作系統(tǒng)最基本的技術。,48,中斷,中斷源與中斷分類 引起中斷發(fā)生的事件稱為中斷源。 通常中斷源是由硬件產(chǎn)生的信號,通知CPU某個需
37、要處理的事件 例,當敲打鍵盤時,鍵盤控制器就會產(chǎn)生一個鍵盤中斷源信號 中斷種類 I/O中斷: 由設備數(shù)據(jù)傳輸過程中發(fā)生的中斷屬于I/O中斷 時鐘中斷:周期性的時鐘中斷 其他中斷: 由內(nèi)部故障或程序故障引起的“異?!?exception) 電源掉電、CPU故障、除數(shù)為0、內(nèi)存溢出、執(zhí)行了陷入指令,49,中斷,中斷請求 中斷源通過中斷線送到中斷控制器的輸入端,這稱為中斷請求。 中斷控制器 一個硬件裝置,它負責捕獲中斷請求,并以一定的方式向CPU提交中斷。 競爭 由于同時可能會有多個中斷信號產(chǎn)生,它們需要共用有限的中斷控制線。 因此,當設備要使用中斷控制線時就要先進行中斷請求(IRQ),以獲得中斷控制線的使用權。,50,中斷,中斷響應 CPU在收到來自中斷控制器的中斷信號后,暫停執(zhí)行當前的進程,轉入相應的中斷處理程序進行處理,這個反應的過程稱為中斷響應。 通常CPU在執(zhí)行完一條指令后,會檢查有無中斷請求。如有,則會立即作出響應。 由硬件和軟件相結合的一整套中斷機構實施 中斷響應由硬件實施,中斷處理主要由軟件實施 中斷實施過程 保存現(xiàn)場 中止當前進程的執(zhí)行,對被響應的中斷進行應答,保存當前進程的斷點信息(主要是程序狀態(tài)字P
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 文明活動系列活動方案
- 春節(jié)包餃子活動方案方案
- 新公司國外團建活動方案
- 新歲簽到活動方案
- 日本公園圣誕節(jié)活動方案
- 春游戶外拓展活動方案
- 新年活動圣誕節(jié)活動方案
- 新年第一天攝像活動方案
- 春天冰淇淋活動方案
- 旅游強縣活動方案
- 《鈴兒響叮當?shù)淖冞w》教學設計(江蘇省市級優(yōu)課)-九年級音樂教案
- 裝修常用數(shù)據(jù)手冊(空間布局和尺寸)
- 處方銷毀申請登記表
- 河南省2014年中考語文現(xiàn)代文閱讀真題
- 外研版一起小學英語四下《Module-6Unit-1-Ill-draw-the-pictures》課件
- 三明市公安局招聘警務輔助人員考試歷年真題
- 冷鐓機 質量要求技術條件
- 衛(wèi)生部手術分級目錄(2023年1月份修訂)
- LY/T 2121-2013檀香栽培技術規(guī)程
- 骨科出科試題帶答案
- 河道基槽土方開挖專項施工方案
評論
0/150
提交評論