已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
转载 出色 【转】中断具体解析 1摘要:本章将向读者顺次阐明中断概念,解析Linux中的中断实现机理以及Linux下中断如何被利用。作为实例咱们第一将向i386体系构造一章中打造的体系加进一个时钟中断;第二将为大家注解RTC中断,希看通过这两个实例可能帮助读者控制中断相干的概念、实现跟编程方法。中断是什么中断的汉语阐明是半旁边产生阻隔、停顿或故障而断开。那么,在打算机体系中,咱们为什么须要阻隔、停顿跟断开呢?举个日常生活中的例子,比方说我正在厨房用煤气烧一壶水,这样就只能守在厨房里,苦苦等着水开-假如水溢出来浇灭了煤气,有可能就要产生一场灾害了。等啊等啊,外边忽然传来了惊奇的叫声怎么不关水龙头?于是我愧疚的发明,方才接水之后只顾着抱怨这份无聊的差事,竟然忘了这事,于是慌慌张张的冲向水管,三下两下关了龙头,声音又传到耳边,怎么干什么都是这么马虎?。伸伸舌头,这件小事就这么过往了,我落寞的眼神又落在了水壶上。门外忽然又传来了铿锵有力的歌声,我最爱好的古装剧要开演了,真想夺门而出,然而,听着水壶发出咕嘟咕嘟的声音,我明白:除非等到水开,否则不我享受人生的时候。这个场景跟中断有什么关联呢?假如说我一心致志等待水开是一个过程的话,那么叫声、电视里传出的音乐不都让这个过程半旁边产生阻隔、停顿或故障而断开了吗?这不就是活生生的中断吗?在这个场景中,我是独一存在处理才能的主体,不管是烧水、关龙头还是看电视,同一个时光点上我只能干一件事件。然而,在我一心致志干一件事件时,总有很多或紧急或不紧急的事件忽然呈当初面前,都须要往关注,有些还须要我停下手头的工作立刻往处理。只有在处理完之后,方能回首实现先前的任务,把一壶水彻底烧开!中断机制不仅赋予了我处理意外情况的才能,假如我能充分发挥这个机制的妙用,就可能同时实现多个任务了。回到烧水的例子,实际上,无论我在不在厨房,煤气灶老是会把水烧开的,我要做的,只不过是及时关掉煤气灶罢了,为了这么一个一秒钟就能实现的动作,却让我逝世逝世的守候在厨房里,在10分钟的时光里不停的看壶嘴是不是冒蒸汽,怎么说都不划算。我决定安下心来看电视。当然,在有生之年,我都不希看让厨房成为火海,于是我上了闹钟,10分钟当前它会发出尖叫,提示我炉子上的水烧开了,那时我再往关煤气也完全来得及。我用一个中断信号-闹铃-换来了10分钟的欢乐时光,心里不禁由衷的感慨:中断机制真是个好货色。恰是因为中断机制,我才干井井有条的同时实现多个任务,中断机制本质上帮助我进步了并发处理才能。它也能给打算机体系带来同样的好处:假如在键盘按下的时候会得到一个中断信号,CPU就不必逝世守着等待键盘输进了;假如硬盘读写实现后发送一个中断信号,CPU就可能腾出手来集中精力服务大众了-无论是仁攀类敲打键盘的指尖还是来回读写介质的磁头,跟CPU的处理速度比拟,都太慢了。不中断机制,就像咱们苦守厨房一样,打算机谈不上有什么的并行处理才能。跟人类似,CPU也一样要面对纷纷混乱的局面-事实中的意外是无处不在的-有可能是用户等得不耐烦,猛敲键盘;有可能是运算中碰到了0除数;还有可能网卡忽然接收到了一个新的数据包。这些都须要CPU具体情况具体分析,要么立刻处理,要么暂缓响应,要么束之高阁。无论如何应答,都须要CPU暂停手头的工作,拿出一种对策,只有在响应之后,方能回首实现先前的使命,把一壶水彻底烧开!先让咱们感触一下中断机制对并发处理带来的帮助。让咱们用程序来探讨一下烧水标题,假如不中断(留心,咱们这里只是模仿中断的场景,实际上是用异步事件-消息-处理机制来展示中断产生的后果。毕竟,在用户空间不办法与实际中断产生直接接洽,不过把持体系为用户空间供给的异步事件机制,可能看作是模仿中断的产物),设计如下:void StayInKitchen()bool WaterIsBoiled=false;while(WaterIsBoiled!=true)bool VaporGavenOff=false;if(VaporGavenOff)WaterIsBoiled=true;else WaterIsBoiled=false;/关煤气炉printf(Close gas oven.n);/所有安定下来,终于可能看电视了,10分钟的宝贵时光啊,逝者如此夫watching_tv();return;可能看出,全部流程如同咱们前面描述的一样,所有工作要次序履行,不办法实现并发任务。国产打印机硒鼓品牌假如用中断,在开端烧水的时候设定一个10分钟的闹铃,而后让CPU往看电视(有点难度,具体实现不在咱们关怀的范畴之内,留给读者自行解决吧:)。等闹钟响的时候再往厨房关炉子。#include sys/types.h#include unistd.h#include sys/stat.h#include signal.h#include stdio.h/闹钟到时会履行此程序void sig_alarm(int signo)/关煤气炉printf(Close gas oven.n);void watching_tv()while(1)/呵呵,优哉游哉int main()/点火后设置定时中断printf(Start to boil water,set Alarm);if(signal(SIGALRM,sig_alrm)=SIG_ERR)perror(signal(SIGALRM)error);return-1;/而后就可能观赏电视节目了printf(Watching TV!n);watching_tv();return 0;这两段程序都在用户空间履行。第二段程序跟中断也不太大的关联,实际上它只用了信号机制罢了。然而,通过这两个程序的对比,咱们可能明白地看到异步的事件处理机制是如何晋升并发处理才能的。Alarm定时器:alarm相称于体系中的一个定时器,假如咱们调用alarm(5),那么5秒钟后就会响起一个闹铃(实际上靠信号机制实现的,咱们这里不想深进细节,假如你对此很感爱好,请参考Richard Stevens不朽著述Unix环境高等编程)。在闹铃响起的时候会产生什么呢?体系会履行一个函数,至于到底是什么函数,体系容许程序自行决定。程序员编写一个函数,并调用signal对该函数进行注册,这样一旦定时到来,体系就会调用程序员供给的函数(CallBack函数?没错,不过在这里如何实现并不关键,咱们就不引进新的概念跟细节了)。上面的例子里咱们供给的函数是sig_alarm,所做的工作很简单,打印封闭煤气灶消息。上面的两个例子很简单,但很能阐明标题,首先,它证明采取异步的消息处理机制可能进步体系的并发处理才能。更重要的是,它揭示了这种处理机制的模式。用户根据须要设计处理程序,并可能将该程序跟特定的外部事件绑定起来,在外部事件产生时体系主动调用处理程序,实现相干的工作。这种模式给体系带来了同一的管理方法,也带来无尽的功能扩大空间。打算机体系实现中断机制长短常复杂的一件工作,再怎么说人都是高度智能化的生物,而打算机作为一个铁疙瘩,不程序的教导就一事无成。而处理一个中断过程,它受到的限度跟须要学习的货色太多了。首先,打算性可能接收的外部信号情势非常有限。中断是由外部的输进引起的,可能说是一种刺激。在烧水的场景中,这些输进是叫声跟电视的音乐,咱们这里只以声音为例。切实事实世界中能输进仁攀类CPU-大脑的信号很多,图像、北京月嫂公司气味一样能被咱们接收,人的信息接口很完美。而打算机则不然,接收外部信号的道路越多,设计实现就越复杂,代价就越高。因此个人打算机(PC)给所有的外部刺激只留了一种输进方法-特定格局的电信号,并对这种信号的格局、接进方法、响应方法、处理步骤都做了规约(具体内容本文后面部分会持续详解),这种信号就是中断或中断信号,而这一整套机制就是中断机制。其次,打算机不懂得如何应答信号。仁攀类的大脑可能自行处理外部输进,我素来不必往担心闹钟响时会不知所措-走进厨房关煤气,这几乎是理所当然的事件,还用大脑想啊,小腿肚子都晓得-可惜打算机不行,不程序,它就岿然不动。因此,必须有机制保障外部中断信号到来后,有正确的程序在正确的时候被履行。还有,打算机不懂得如何保持工作的持续性。我在看电视的时候假如往厨房关了煤气,回来当前能持续将电视进行到底,不受太大的影响。而打算机则不然,假如放下手头的工作直接往处理意外的中断,那么它就再也不办法想起来曾经作过什么,做到什么程度了。天然也就不什么重操旧业的机会了。这样的处理方法就不是并发履行,而是东一榔头,西一棒槌了。那么,通用的打算机体系是如何解决这些标题标呢?它是靠硬件跟软件配合来协同实现中断处理的全过程的。螺旋钢管咱们将通过Intel X86架构的实现来介绍这一过程。中断流程处理CPU履行完一条指令后,下一条指令的逻辑地址存放在cs跟eip这对存放器中。在履行新指令前,把持单元会检查在履行前一条指令的过程中是否有中断或异样产生。假如有,把持单元就会抛下指令,进进下面的流程:1.断定与中断或异样关联的向量i(0i255)2.寻找向量对应的处理程序3.保存当前的工作现场,履行中断或异样的处理程序4.处理程序履行结束后,把把持权交还给把持单元5.把持单元恢复现场,返回持续履行原程序全部流程如下图所示:让咱们深进这个流程,看看都有什么标题须要面对。1、异样是什么概念?在处理器履行到因为编程失误而导致的错误指令(例如除数是0)的时候,或者在履行期间呈现特别情况(例如缺页),须要靠把持体系来处理的时候,处理器就会产生一个异样。对大部分处理器体系构造来说,处理异样跟处理中断的方法基本是雷同的,x86架构的CPU也是如此。异样与中断还是有些差别,异样的产生必须考虑与处理器时钟的同步。实际上,异样往往被称为同步中断。2、中断向量是什么?中断向量代表的是中断源-从某种程度上讲,可能看作是中断或异样的类型。中断跟异样的品种很多,比方说被0除是一种异样,缺页又是一种异样,网卡会产生中断,声卡也会产生中断,CPU如何辨别它们呢?中断向量的概念就是由此引出的,切实它就是一个被送通往CPU数据线的一个整数。CPU给每个IRQ调配了一个类型号,通过这个整数CPU来辨认不同类型的中断。这里可能很多友人会寻问为什么还要弄个中断向量这么麻烦的货色?为什么不直接用IRQ0IRQ15就完了?比方就让IRQ0为0,IRQ1为1,这不是要简单的如许?切实这里体现了模块化设计规矩,及节俭规矩。首先咱们先谈谈节俭规矩,所谓节俭规矩就是所利用的信号线数越少越好,这样假如每个IRQ都肚冖利用一根数据线,如IRQ0用0号线,IRQ1用1号线这样,16个IRQ就会用16根线,这显然是一种挥霍。那么兴许立刻就有友人会说:那么只用4根线不就行了吗?(24=16)。这个标题,体现了模块设计规矩。咱们在前面就说过中断有很多类,可能是外部硬件触发,也可能是由软件触发,然而对CPU来说中断就是中断,只有一种,CPU不必管它到底是由外部硬件触发的还是由运行的软件本身触发的,应为对CPU来说,中断处理的过程都是一样的:中断现行程序,转到中断服务程序处履行,回到被中断的程序持续履行。CPU总共可能处理256种中断,而并不晓得,也不应当让CPU晓得这是硬件来的中断还是软件来的中断,这样,就可能使CPU的设计肚冖于中断把持器的设计,这样CPU所需实现的工作就很单纯了。CPU对其它的模块只供给了一种接口,这就是256个中断处理向量,也称为中断号。由这些中断把持器自行往利用这256个中断号中的一个与CPU进行交互,比方,硬件中断可能利用前128个号,软件中断利用后128个号,也可能软件中断利用前128个号,硬件中断利用后128个号,这与CPU完全无关了,当你须要处理的时候,只有告诉CPU你用的是哪个中断号就行,而不需告诉CPU你是来自哪儿的中断。这样也便利了当前的裁减,比方当初机器里又加了一片8259芯片,那么这个芯片就可能利用空闲的中断号,看哪一个空闲就利用哪一个,而不是必须要利用第0号,或第1号中断号了。切实这相称于一种映射机制,把IRQ信号映射到不同的中断号上,IRQ的排列或说编号是固定的,但通过改变映射机制,就可能让IRQ映射到不同的中断号,也可能说调用不同的中断服务程序。3、什么是中断服务程序?在响应一个特定中断的时候,内核会履行一个函数,该函数叫做中断处理程序(interrupt handler)或中断服务程序(interrupt service routine(ISR)。产生中断的每个设备都有相应的中断处理程序。例如,由一个函数专门处理来自体系时钟的中断,而另外一个函数专门处理由键盘产生的中断。个别来说,中断服务程序要负责与硬件进行交互,告诉该设备中断已被接收。此外,还须要实现其余相干工作。比方说网络设备的中断服务程序除了要对硬件应答,还要把来自硬件的网络数据包拷贝到内存,对其进行处理后再交给合适的协定栈或利用程序。每个中断服务程序根据其要实现的任务,复杂程度各不雷同。个别来说,一个设备的中断服务程序是它设备驱动程序(device driver)的一部分-设备驱动程序是用于对设备进行管理的内核代码。4、隔离变更不晓得你有不意识到,中断处理前面这部分的设计是何等的简单精美。人是高度智能化的,可能对碰到的各种意外情况做有针对性的处理,打算机比拟就差距甚远了,它只能根据预约的程序进行把持。对打算机来说,硬件支撑的,只能是中断这种电信号传播的方法跟CPU对这种信号的接收方法,而具体如何处理这个中断,必须得靠把持体系实现。把持体系支撑所有当时可能预感到的中断信号,实际上都不存在太大的挑衅,但在把持体系安装到打算机设备上当前,断定会时常有新的外围设备被加进体系,这可能会带来安装体系时基本无奈预感的意外中断。如何支撑这种扩大,是全部体系必须面对的。而硬件跟软件在这里的合作,给咱们带来了完美的答案。当新的设备引进新类型的中断时,CPU跟把持体系不必关注如何处理它。CPU只负责接收中断信号,并引用中断服务程序;而把持体系供给默认的中断服务-个别来说就是不理睬这个信号,返回就可能了-并负责供给接口,让用户通过该接口注册根据设备具体功能而编制的中断服务程序。假如用户注册了对应于一个中断的服务程序,那么CPU就会在该中断到来时调用用户注册的服务程序。这样,在中断降常设体系须要如何把持硬件、如何实现硬件功能这部分工作就完全肚冖于CPU架构跟把持体系的设计了。而当你须要加进新设备的时候,只须要告诉把持体系该设备占用的中断号、按照把持体系请求的接口格局撰写中断服务程序,用把持体系供给的函数注册该服务程序,设备的中断就被体系支撑了。中断跟对中断的处理被解除了耦合。这样,无论是你在须要加进新的中断时,还是在你须要改变现有中断的服务程序时、又或是撤消对某个中断支撑的时候,CPU架构跟把持体系都无需作改变。5、保存当前工作现场在中断处理结束后,打算机个别来说还要回首处理本来手头正做的工作。这给中断的概念带来些额定的内涵1。回首不是指从头再来从新做,而是要接着方才的进度持续做。这就须要在处理中断信号之前保存工作现场。现场这个词比较艰涩,切实就是指一个信息集,它能反应某个时光点上任务的状况,并能保障按照这些信息就能恢复任务到该状况,持续履行下往。再直白一点,现场不过就是一组存放器值。而如何保护现场跟恢复场景是中断机制须要考虑的重点之一。每个中断处理都要经历这个保存跟恢复过程,咱们可能形象出其中的步骤:1.保存现场2.履行具体的中断服务程序3.从中断服务返回4.恢复现场上面说过了,现场看似在始终变更,不哪个霎时雷同。但实际上组成现场的因素却不会有任何改变。也就是说,这要咱们保存了相干的存放器状况,现场就能保存下来。而恢复现场就是从新载进这些存放器。换句话说,对任何一个中断,保护现场跟恢复现场配合的都是完全雷同的把持。既然把持雷同,实现把持的过程跟代码就雷同。减少代码的冗余是模块化设计的基本准则,切实不情理让所有的中断服务程序都反复的实现这样的功能,应当将它作为一种基本的构造由底层的把持体系或硬件实现。而对中断的处理过程须要敏捷实现,因此,Intel CPU的把持器就承担了这个任务,非但如此,上面的所有步骤次序都被固化下来,由把持器驱动实现。保存现场跟恢复现场都由硬件主动实现,大大减轻了把持体系跟设备驱动程序的包袱。6、硬件对中断支撑的细节下面的部分,本来应当介绍8259、中断把持器编程、中断描述符表等内容,可是我看到了潇冷写的保护模式下的8259A芯片编程及中断处理摸索,前人之述备矣,读者直接读它好了。Linux下的中断在Linux中,中断处理程序看起来就是普个别通的C函数。只不过这些函数必须按照特定的类型申明,以便内核可能以标准的方法传递处理程序的信息,在其余方面,它们与个别的函数看起来别无二致。中断处理程序与其它内核函数的真正差别在于,中断处理程序是被内核调用来响应中断的,而它们运行于咱们称之为中断高低文的特别高低文中。对于中断高低文,咱们将在后面探讨。中断可能随时产生,因此中断处理程序也就随时可能履行。所以必须保障中断处理程序可能疾速履行,这样才干保障尽可能快地恢复被中断代码的履行。因此,只管对硬件而言,敏捷对其中断进行服务非常重要。但对体系的其它部分而言,让中断处理程序在尽可能短的时光内实现履行也同样重要。即便最精简版的中断服务程序,它也要与硬件进行交互,告诉该设备中断已被接收。但通常咱们不能像这样给中断服务程序随便减负,相反,咱们要靠它实现大量的其它工作。作为一个例子,咱们可能考虑一下网络设备的中断处理程序面临的挑衅。该处理程序除了要对硬件应答,还要把来自硬件的网络数据包拷贝到内存,对其进行处理后再交给合适的协定栈或利用程序。不言而喻,这种活动量不会太小。当初咱们来分析一下Linux把持体系为了支撑中断机制,具体都须要做些什么工作。谐波治理首先,把持体系必须保障新的中断可能被支撑。打算机体系硬件留给外设的是一个同一的中断信号接口。它固化了中断信号的接进跟传递方法,拿PC机来说,中断机制是靠两块8259跟CPU合作实现的。外设要做的只是把中断信号发送到8259的某个特定引脚上,这样8259就会为此中断调配一个标识-也就是通常所说的中断向量,通过中断向量,CPU就可能在以中断向量为索引的表-中断向量表-里找到中断服务程序,由它决定具体如何处理中断。这是硬件规定的机制,软件只能无前提服从。因此,把持体系对新中断的支撑,说简单点,就是保护中断向量表。新的外围设备加进体系,首先得明白本人的中断向量号是多少,还得供给本身中断的服务程序,而后利用Linux的内核调用界面,把中断向量号、led照明中断服务程序这对信息填写到中断向量表中往。这样CPU在接收到中断信号时就会主动调用中断服务程序了。这种注册把持个别是由设备驱动程序实现的。其次,把持体系必须供给给程序员简单坚固的编程界面来支撑中断。中断的基本流程前面已经讲了,它会打断当前正在进行的工作往履行中断服务程序,而后再回到先前的任务持续履行。这旁边有大量须要解决标题:如何保护现场、嵌套中断如何处理等等,把持体系要逐个化解。程序员,即便是驱动程序的开发人员,在写中断服务程序的时候也很少须要对被打断的过程心存恻隐。(当然,出于进步体系效力的考虑,编写驱动程序要比编写用户级程序多一些条条框框,谁让咱们顶着体系程序员的光环呢?)把持体系为咱们屏蔽了这些与中断相干硬件机制打交道的细节,供给了一套精简的接口,让咱们用极为简单的方法实现对实际中断的支撑,Linux是怎么完美的做到这一点的呢?CPU对中断处理的流程咱们首先必须懂得CPU在接收到中断信号时会做什么。没办法,把持体系必须懂得硬件的机制,不配合硬件就举步维艰。当初咱们假设内核已被初始化,CPU在保护模式下运行。CPU履行完一条指令后,下一条指令的逻辑地址存放在cs跟eip这对存放器中。在履行新指令前,把持单元会检查在履行前一条指令的过程中是否有中断或异样产生。假如有,把持单元就会抛下指令,进进下面的流程:1.断定与中断或异样关联的向量i(0i255)。2.籍由idtr存放器从IDT表中读取第i项(在下面的描述中,咱们假设该IDT表项中包含的是一个中断门或一个陷阱门)。3.从gdtr存放器获得GDT的基地址,并在GDT表中查赵冬以读取IDT表项中的抉择符所标识的段描述符。这个描述符指定中断或异样处理程序所在段的基地址。4.确信中断是由受权的(中断)产生源发出的。首先将当前特权级CPL(存放在cs存放器的低两位)与段描述符(存放在GDT中)的描述符特权级DPL比较,假如CPL小于DPL,就产生一个通用保护异样,因为中断处理程序的特权不能低于引起中断的程序的特权。对编程异样,则做进一步的保险检查:比较CPL与处于IDT中的门描述符的DPL,假如DPL小于CPL,就产生一个通用保护异样。这最后一个检查可能避免用户利用程序拜访特别的陷阱门或中断门。5.检查是否产生了特权级的变更,也就是说,CPL是否不同于所抉择的段描述符的DPL。假如是,把持单元必须开端利用与新的特权级相干的栈。通过履行以下步骤来做到这点:a.读tr存放器,以拜访运行过程的TSS段。谐波治理有怎样的运作原理?b.用与新特权级相干的栈段跟栈指针的正确值装载ss跟esp存放器。这些值可能在TSS中找到(参见第三章的任务状况段一节)。c.在新的栈中保存ss跟esp以前的值,这些值定义了与旧特权级相干的栈的逻辑地址。6.假如故障已产生,用引起异样的指令地址装载cs跟eip存放器,从而使得这条指令能再次被履行。7.在栈中保存eflag、cs及eip的内容。8.假如异样产生了一个硬错误码,则将它保存在栈中。9.装载cs跟eip存放器,其值分辨是IDT表中第i项门描述符的段抉择符跟偏移量域。hardness tester这些值给出了中断或者异样处理程序的第一条指令的逻辑地址。把持单元所履行的最后一步就是跳转到中断或者异样处理程序。换句话说,处理完中断信号后,把持单元所履行的指令就是被选中处理程序的第一条指令。中断或异样被处理完后,相应的处理程序必须0x20/0x21/0xa0/0xa1产生一条iret指令,把把持权转交给被中断的过程,这将迫使把持单元:1.用保存在栈中的值装载cs、eip、或eflag存放器。假如一个硬错误码曾被压进栈中,并且在eip内容的上面,那么,履行iret指令前必须先弹出这个硬错误码。2.检查处理程序的CPL是否等于cs中最低两位的值(这象征着被中断的过程与处理程序运行在同一特权级)。假如是,iret终止履行;否则,转进下一步。3.从栈中装载ss跟esp存放器,因此,返回到与旧特权级相干的栈。4.检查ds、es、fs及gs段存放器的内容,假如其中一个存放器包含的抉择符是一个段描述符,并且其DPL值小于CPL,那么,清相应的段存放器。把持单元这么做是为了禁止用户态的程序(CPL=3)利用内核以前所用的段存放器(DPL=0)。假如不清这些存放器,怀有歹意的用户程序就可能利用它们来拜访内核地址空间。再次,把持体系必须保障中断信息可能高效坚固的传递实例一-为本人的把持体系中加进中断中断机制的实现在这个部分,我将为大家具体介绍SagaLinux_irq中是如何处理中断的。为了更好的演示软硬件交互实现中断机制的过程,我将在前期实现的SagaLinux上加进对一个新中断-定时中断-的支撑。首先,让我介绍一下SagaLinux_irq中波及中断的各部分代码。这些代码重要包含在kernel目录下,包含idt.c,irq.c,i8259.s,boot目录下的setup.s也跟中断相干,下面将对他们进行探讨。1、boot/setup.s setup.s中绝对于中断的部分重要集中在pic_init小结,该部分实现了对中断把持器的初始化。对8259A的编程是通过向其相应的端口发送一系列的ICW(初始化命令字)实现的。总共须要发送四个ICW,它们都分辨有本人独特的格局,而且必须按次序发送,并且必须发送到相应的端口,具体细节请查阅相干材料。pic_init:cli mov al,0x11;initialize PICs;给中断存放器编程;发送ICW1:利用ICW4,级联工作out 0x20,al;825
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DLT 5580.2-2022 燃煤耦合生物质发电生物质能电量计算第2部分-农林废弃物直燃耦合
- 贵州开磷控股(集团)面试题及答案
- 公务员面试南宁面试题及答案
- 活动策划招聘题库及答案
- 公务员面试萝卜面试题及答案
- 公务员面试凌霄面试题及答案
- 公务员面试来源面试题及答案
- 杭州联合银行秋招面试题及答案
- 公务员面试济源面试题及答案
- 公务员考试收卷试题及答案
- 品质部奖罚管理制度
- 手术室麻醉科安全管理
- 小学生防轻生班会课件
- 冠心病外科护理
- 叉车儿童课件
- 《脑动静脉畸形的显》课件
- 建房补充协议合同范本
- 2024-2025北师大版(三起)小学英语六年级上册期末考试测试卷及参考答案(共5套)
- 第六课-实现人生的价值-课件-高中政治统编版必修四哲学与文化-
- 砂石料场租赁协议
- 【外研版】(三起)2025-2026学年三年级英语下册教学工作计划(及进度表)
评论
0/150
提交评论