第5章 交叉开发环境_第1页
第5章 交叉开发环境_第2页
第5章 交叉开发环境_第3页
第5章 交叉开发环境_第4页
第5章 交叉开发环境_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1第第5章章 交叉开发环境交叉开发环境及及内核编译内核编译5.1 交叉开发环境介绍交叉开发环境介绍5.2 交叉开发工具链交叉开发工具链5.3 主机开发环境配置主机开发环境配置5.4 启动目标板启动目标板5.5 应用程序的远程交叉调试应用程序的远程交叉调试5.6 Bootloader介绍介绍5.7 内核的编译内核的编译25.1 交叉开发环境介绍交叉开发环境介绍n5.1.1 交叉开发概念模型交叉开发概念模型n绝大多数的应用软件开发都是以绝大多数的应用软件开发都是以本地本地方式进行的,即本机方式进行的,即本机(HOST)开发、调试,本机运行的方式。这种方式通常)开发、调试,本机运行的方式。这种方式通

2、常不适合于嵌入式系统的软件开发,因为对于嵌入式系统的不适合于嵌入式系统的软件开发,因为对于嵌入式系统的开发,没有足够的资源在本机(即板子系统)运行开发工开发,没有足够的资源在本机(即板子系统)运行开发工具和调试工具。具和调试工具。 3下载内核镜像下载内核镜像HOST内核映像内核映像根文件系统根文件系统TARGET内核映像内核映像在主机上,可以安装开发工具,编辑、编译目标板的在主机上,可以安装开发工具,编辑、编译目标板的Linux引导程序、内核和文件系统,然后在目标板上运行。引导程序、内核和文件系统,然后在目标板上运行。通常这种在主机环境下开发,在目标板上运行的开发模式叫通常这种在主机环境下开发

3、,在目标板上运行的开发模式叫做交叉开发。一方面开发者可以在熟悉的主机环境下进行程做交叉开发。一方面开发者可以在熟悉的主机环境下进行程序开发;另一方面又可以在目标板上运行调试程序,可以避序开发;另一方面又可以在目标板上运行调试程序,可以避免受到目标板硬件的限制。免受到目标板硬件的限制。挂接挂接NFS文件系统文件系统图图5-1 交叉开发模型交叉开发模型 各种连接方式各种连接方式45.1.2 目标板与主机之间的连接目标板与主机之间的连接n串口连接串口连接q优点:使用简单优点:使用简单q缺点:通讯速率慢,不适合大数据量传输缺点:通讯速率慢,不适合大数据量传输n以太网接口以太网接口q优点:高度灵活,相对

4、简单,易于实现优点:高度灵活,相对简单,易于实现q缺点:驱动程序实现较麻烦缺点:驱动程序实现较麻烦nUSB接口接口q优点:即插即用,通讯速度快优点:即插即用,通讯速度快q缺点:缺点:USB设备区分主从端,分别要有不同的驱动程序设备区分主从端,分别要有不同的驱动程序nJTAG接口接口q用于芯片内部的测试及对系统进行仿真测试用于芯片内部的测试及对系统进行仿真测试55.1.3 文件传输文件传输n串口传输方式串口传输方式q通过通过minicom或或windows超级终端等工具都可以通过串口发送超级终端等工具都可以通过串口发送文件。通常波特率设置为:文件。通常波特率设置为:115200bit/s,8bi

5、t数据位,不带校数据位,不带校验位。验位。n网络传输方式网络传输方式q一般是基于一般是基于TFTP协议,它是基于协议,它是基于UDP协议传输。协议传输。nUSB接口传输方式接口传输方式q分为主从设备,主机端为主设备端,目标板为从设备端。分为主从设备,主机端为主设备端,目标板为从设备端。nJTAG接口传输方式接口传输方式qJTAG仿真器与主机之间的连接通常通过串口、并口、以太网或仿真器与主机之间的连接通常通过串口、并口、以太网或USB接口。接口。n移动存储设备移动存储设备q软盘、软盘、CDROM、USB等存储介质。等存储介质。65.1.4 网络文件系统网络文件系统n网络文件系统(网络文件系统(N

6、FS,Net File System)允许一个)允许一个系统在网络上共享目录和文件。系统在网络上共享目录和文件。Linux支持支持NFS,并,并且可以配置启动且可以配置启动NFS网络服务。网络服务。 NFS具有以下优点:具有以下优点:q本地工作站可以使用更少的磁盘空间;本地工作站可以使用更少的磁盘空间;q用户可以通过网络访问共享目录;用户可以通过网络访问共享目录;q软驱、软驱、CDROM等存储设备可以在网络上共享使用;等存储设备可以在网络上共享使用;qNFS至少有一台服务器和一台客户端两部分。至少有一台服务器和一台客户端两部分。nNFS的这些优点正好适合于嵌入式系统的开发。目的这些优点正好适合

7、于嵌入式系统的开发。目标板没有足够的存储空间,标板没有足够的存储空间,Linux内核挂接网络根文内核挂接网络根文件系统可以避免使用本地存储介质,快速建立件系统可以避免使用本地存储介质,快速建立Linux系统。系统。75.2 交叉开发工具链交叉开发工具链掌握嵌入式开发工具链的使用是进行嵌入式开发的前提条件之一与主流开发工具类似,嵌入式交叉开发工具也包括交叉编译器,编译器能够把一个源程序编译生成一个由机器语言构成的可执行程序。虽然交叉编译器本身也在主机上运行,但编译生成的不是主机认识的机器语言,而是目标机能够识别的机器语言。调试工具,即能够对执行程序进行源码或汇编级调试的软件软件工程工具,用于协助

8、多人开发或大型软件项目的管理的软件8n5.2.1 相关工具链软件相关工具链软件qGCC是编译器,不但支持是编译器,不但支持C/C+语言,而且支语言,而且支持持FORTRAN、JAVA等语言,对于等语言,对于C/C+语语言的完整支持,需要支持言的完整支持,需要支持glibc库;库;9qBINUTILS是二进制程序处理工具,包括链接器、是二进制程序处理工具,包括链接器、汇编器等目标程序处理的工具;汇编器等目标程序处理的工具;qGLIBC是应用程序编程的函数库软件包,可以是应用程序编程的函数库软件包,可以编译生成静态库和共享库;编译生成静态库和共享库;qGDB是调试工具,对程序进行源码调试;是调试工

9、具,对程序进行源码调试;qCrosstool软件实际上是一套脚本,用于编译软件实际上是一套脚本,用于编译和测试大多数体系结构的各种和测试大多数体系结构的各种GCC和和glibc的版的版本组合。本组合。105.2.2 嵌入式系统开发的全过程嵌入式系统开发的全过程11q对于对于ARM体系结构的编译器,不少网站提供下载。体系结构的编译器,不少网站提供下载。免费提供的工具链是包括免费提供的工具链是包括Binutils和和GCC,但都不,但都不提供提供gdb调试器。下面介绍几个调试器。下面介绍几个ARM Linux免费网免费网站。站。(1) .uk/(ARM

10、 Linux官方网官方网站)站) ARM Linux工具链下载的工具链下载的HTTP和和FTP地址:地址:nhttp:/ .uk/pub/armlinux/toolchainnftp:/ .uk/pub/linux/arm/toolchain(2) http:/ (Montavista公司主页网公司主页网站)站) Montavista Linux能够支持各种体系结构的开发能够支持各种体系结构的开发板,只对部分硬件平台提供预览版。板,只对部分硬件平台提供预览版。5.2.3 获取交叉开发工具链获取交叉开发工具链12n以以ARM L

11、inux站点提供的站点提供的cross-3.3.2.tar.bz2包包为例:为例:qtar jxvf cross-3.3.2.tar.bz2q这个工具链应该安装的路径是:这个工具链应该安装的路径是:/usr/local/arm/3.3.2q然后在环境变量然后在环境变量PATH中添加路径,就可以直中添加路径,就可以直接使用接使用arm-linux-gcc了了q$export PATH=$PATH:/usr/local/arm/3.3.2/bin5.2.4 安装主机工具链安装主机工具链135.3 主机开发环境配置主机开发环境配置n5.3.1 主机环境配置主机环境配置q$ ifconfig eth0

12、 n5.3.2 串口控制串口控制 台工具台工具14n5.3.3 DHCP(动态主机配置协议动态主机配置协议)服务服务q通过通过DHCP给目标板的给目标板的Bootloader或内核分配或内核分配IP地址地址;q需要配置需要配置dhcpd软件包中的软件包中的dhcpd.conf文件文件;n5.3.4 TFTP服务服务q简单的文件传输协议,适用于目标板简单的文件传输协议,适用于目标板Bootloader的使用,的使用,但文件是基于但文件是基于UDP协议,文件传输是不可靠的。协议,文件传输是不可靠的。n5.3.5 NFS服务服务qNFS服务是通过服务是通过TCP/IP网络,

13、用于文件共享的常用协议。它网络,用于文件共享的常用协议。它提供了一种在提供了一种在UNIX和类和类UNIX系统间输出和挂载文件目录的系统间输出和挂载文件目录的功能。它能很方便地将用户在宿主机功能。它能很方便地将用户在宿主机PC中的工作目录输出中的工作目录输出到到ARM linux开发平台上(通俗地讲,即通过它可以在开发开发平台上(通俗地讲,即通过它可以在开发板上跑板上跑PC机上的程序)。机上的程序)。q假设宿主机假设宿主机PC的的IP地址为地址为00,挂载,挂载NFS的方法的方法如下:如下:qmount 00:/ /tmp (即即mount 宿主机的

14、根目录宿主机的根目录到开发板的到开发板的 /tmp) 155.4 启动目标板启动目标板n5.4.1 系统引导过程系统引导过程n多数内核多采用压缩格多数内核多采用压缩格式,式,Linux系统的一般系统的一般启动过程通常划分为内启动过程通常划分为内核引导、内核启动和应核引导、内核启动和应用程序启动用程序启动3个阶段。个阶段。 Decompress KernelBootloaderInitialize HardwareInitialize Device DriverCall KernelMount Root FilesystemExicute /sbin/initLinux KernelLogin

15、PromptStart Network ServicesStart X-windowsUser Program图图5-2 Linux系统启动过程系统启动过程16n第一阶段是目标板硬件初始化,解压内核映像,再跳第一阶段是目标板硬件初始化,解压内核映像,再跳转到内核映像入口。这部分的工作一般由目标板的引转到内核映像入口。这部分的工作一般由目标板的引导程序和内核映像的自引导程序完成。导程序和内核映像的自引导程序完成。n第二阶段是内核的初始化,初始化设备驱动程序,挂第二阶段是内核的初始化,初始化设备驱动程序,挂接根文件系统。这里是接根文件系统。这里是Linux内核通用的启动函数入内核通用的启动函数入口

16、。口。n第三阶段是执行用户空间的第三阶段是执行用户空间的init程序,完成系统初始程序,完成系统初始化、启动相关服务和管理用户登录等工作,这个阶段化、启动相关服务和管理用户登录等工作,这个阶段也可以提供给用户交互界面,也可以自动执行应用程也可以提供给用户交互界面,也可以自动执行应用程序。序。n在在Linux系统启动过程中,有两个关键点。一个是内系统启动过程中,有两个关键点。一个是内核映像的解压启动,另一个是根文件系统的挂接。核映像的解压启动,另一个是根文件系统的挂接。17n5.4.2 内核解压启动内核解压启动n目标板处理器上电或复位以后,首先执行引导程目标板处理器上电或复位以后,首先执行引导程

17、序(序(Bootloader),初始化内存等硬件,然后把),初始化内存等硬件,然后把压缩的内核加载到内存中,最后跳转到内核映像压缩的内核加载到内存中,最后跳转到内核映像入口执行。这样就把控制权完全交给内核映像。入口执行。这样就把控制权完全交给内核映像。n接下来内核继续执行,完成自解压或重定位,然接下来内核继续执行,完成自解压或重定位,然后跳转到解压后的内核代码入口。这部分主要是后跳转到解压后的内核代码入口。这部分主要是Linux内核的自引导程序,又叫内核的自引导程序,又叫Linux bootloader。相对比较简单,不可代替目标板上。相对比较简单,不可代替目标板上的的Bootloader。n

18、目标板的目标板的Bootloader具有加载内核映像的功能。具有加载内核映像的功能。在嵌入式在嵌入式Linux开发中,经常用到网络加载的方开发中,经常用到网络加载的方式,就是通过式,就是通过TFTP协议把内核映像加载到目标协议把内核映像加载到目标板内存。板内存。18n5.4.3 挂接根文件系统挂接根文件系统n由于文件和应用程序都要存储在文件系统中,所由于文件和应用程序都要存储在文件系统中,所以以Linux 离不开文件系统。在内存启动的最后,离不开文件系统。在内存启动的最后,必须挂接一个根文件系统。从文件系统的目录下必须挂接一个根文件系统。从文件系统的目录下找到找到init程序,启动程序,启动i

19、nit进程。进程。n在交叉开发环境中,通常采用在交叉开发环境中,通常采用NFS文件系统。在文件系统。在内核启动过程可以挂接内核启动过程可以挂接NFS根文件系统,这种方根文件系统,这种方式可以极大地方便嵌入式系统的开发。式可以极大地方便嵌入式系统的开发。n要使目标板挂接要使目标板挂接NFS根文件系统,需要做两方面根文件系统,需要做两方面的工作。一方面,是在主机端配置相应的网络服的工作。一方面,是在主机端配置相应的网络服务;另一方面就是配置目标板的内核选项。务;另一方面就是配置目标板的内核选项。195.5 应用程序的远程交叉调试应用程序的远程交叉调试n对于交叉调试,交叉调试的对于交叉调试,交叉调试

20、的gdb运行在开发主机上,而应运行在开发主机上,而应用程序运行在目标板上。用程序运行在目标板上。NFS图图5-3 交叉调试模型交叉调试模型 gdbservergdb应用程序和源码应用程序HOSTTARGET以太网连接以太网连接n在目标板上,通过在目标板上,通过gdbserver控制要调控制要调试的程序执行,同时试的程序执行,同时与主机的与主机的gdb远程通远程通讯,可以实现交叉调讯,可以实现交叉调试的功能。这样,试的功能。这样, gdb交叉调试运行在交叉调试运行在主机端,应用程序运主机端,应用程序运行在目标板端。行在目标板端。5.5.1 交叉调试模型交叉调试模型205.5.2 交叉调试程序实例

21、交叉调试程序实例n1)、在主机上编译程序)、在主机上编译程序hello.cinclude include void main(int argc, char void main(int argc, char * * *argc)argc) int i;int i;for(i=0;i3;i+)for(i=0;i3;i+) printf(hello i=%dnprintf(hello i=%dn”,i);,i); n2)、交叉编译)、交叉编译qarm-linux-gcc o hello 3)、把可执行程序复制到)、把可执行程序复制到NFS输出目录输出目录qcp hello /usr/local/ar

22、m/3.3.2/rootfs1、交叉编译、交叉编译21n4)、在目标板也可以访问同样的程序,执行)、在目标板也可以访问同样的程序,执行n# ./hello hello i=1 hello i=2 hello i=3n2、交叉调试、交叉调试q1)在编译的时候加上)在编译的时候加上 g 选项,使得包含调试信息选项,使得包含调试信息n$ arm-linux-gcc g o hello hello.cq2)在目标板上启动)在目标板上启动gdbservern# gdbserver :2345 helloq3)在主机端,启动)在主机端,启动DDD和和gdb调试程序调试程序n$ ddd debugger a

23、rm-linux-gdb helloq4)在)在DDD下的窗口的下的窗口的GDB控制台下,建立连接控制台下,建立连接n(gdb)target remote :2345q5)设置断点,执行到断点)设置断点,执行到断点n(gdb )b main225.6 Bootloader介绍介绍nBootloader是操作系统运行之前执行的一小段程序是操作系统运行之前执行的一小段程序,通,通过这段小程序,我们可以过这段小程序,我们可以初始化硬件设备、建立内存空初始化硬件设备、建立内存空间的映射表,从而建立适当的软硬件环境间的映射表,从而建立适当的软硬件环境,为最终调用,为最终调用操作系统内核做好准备。操作系统

24、内核做好准备。n对于嵌入式系统,对于嵌入式系统, Bootloader是基于特定硬件平台来实是基于特定硬件平台来实现的。几乎不可能为所有嵌入式系统建立一个通用的现的。几乎不可能为所有嵌入式系统建立一个通用的Bootloader,不同的处理器架构有不同的,不同的处理器架构有不同的Bootloader。 Bootloader不仅依赖于不仅依赖于CPU的体系结构,而且依赖于嵌的体系结构,而且依赖于嵌入式系统板级设备的配置。入式系统板级设备的配置。n反过来,大部分反过来,大部分Bootloader仍然具有很多共性,某些仍然具有很多共性,某些Bootloader也能够支持多种体系结构的嵌入式系统。也能够

25、支持多种体系结构的嵌入式系统。23Bootloader的启动的启动n系统加电或复位以后,所有系统加电或复位以后,所有CPU都会从某个地址开始执都会从某个地址开始执行,这个是由处理器设计决定的。比如,行,这个是由处理器设计决定的。比如,X86的复位向的复位向量在高地址端,量在高地址端,CPU处理器在复位时从地址处理器在复位时从地址0 x00000000取第一条地址取第一条地址。嵌入式系统的开发板要把板上。嵌入式系统的开发板要把板上ROM或或Flash映射到这个地址。因此,必须把映射到这个地址。因此,必须把Bootloader程序程序存储在相应的存储在相应的Flash位置。系统上电以后,位置。系统

26、上电以后, CPU首先执首先执行它。行它。nBootloader可分为如下启动方式:可分为如下启动方式:q网络启动方式网络启动方式q磁盘启动方式磁盘启动方式qFlash启动方式启动方式24(1)网络启动方式网络启动方式n这种方式开发板不需要配置较大的存储介质,但在使用这种方式开发板不需要配置较大的存储介质,但在使用这种方式之前,需要把这种方式之前,需要把Bootloader安装到板上的安装到板上的EPROM或或Flash中,中,Bootloader通过以太网远程下载通过以太网远程下载Linux内核映像或文件系统。内核映像或文件系统。nDHCP/BOOTP服务为服务为Bootloader分配分配

27、IP地址,配置网络地址,配置网络参数,然后才能够支持网络服务。参数,然后才能够支持网络服务。nTFTP服务为服务为Bootloader客户端提供文件下载功能,把内客户端提供文件下载功能,把内核映像和其他文件放在核映像和其他文件放在/tftpboot目录下,这样目录下,这样Bootloader可以通过简单的可以通过简单的TFTP协议远程下载内核映像协议远程下载内核映像到内存。到内存。25图图5-4 网络启动方式网络启动方式NFSBIOS内核映像目标板文件系统启动内核HOSTTARGET以太网连接以太网连接TFTPBOOTP26(2)磁盘启动方式磁盘启动方式n传统的传统的Linux 系统运行在台式

28、或服务器上,一般系统运行在台式或服务器上,一般使用使用BIOS引导,并且使用磁盘作为存储介质。可引导,并且使用磁盘作为存储介质。可以配置以配置BIOS从软盘、光驱或某块硬盘启动,而从软盘、光驱或某块硬盘启动,而BIOS并不直接引导操作系统,在硬盘的主引导区,并不直接引导操作系统,在硬盘的主引导区,还需要一个还需要一个Bootloader用于从磁盘文件系统把操用于从磁盘文件系统把操作系统引导起来。作系统引导起来。nLinux传统上是通过传统上是通过LILO(LInux LOader)引导的,引导的,后来又出现了后来又出现了GNU的软件的软件GRUB(GRand Unified Bootloade

29、r)。GRUB能够使用能够使用TFTP和和BOOTP或或DHCP通过网络启动。通过网络启动。27(3)Flash启动方式启动方式n大多数嵌入式系统都使用大多数嵌入式系统都使用Flash存储介质,存储介质, Bootloader一般存储在一般存储在Flash中。通常需要把中。通常需要把Flash分区使用,每个分区使用,每个区的大小应该是区的大小应该是Flash擦除块大小的整数倍。擦除块大小的整数倍。文件系统内核映像Bootloader参数参数图图5-5 Flash存储示意图存储示意图nBootloader一般放在一般放在Flash的底端或顶端,要使的底端或顶端,要使Bootloader 的入口位

30、于处理器上电执行的第一条指令位置。的入口位于处理器上电执行的第一条指令位置。n参数区可用作参数区可用作Bootloader的参数保存区域。的参数保存区域。nBootloader从内核映像区把从内核映像区把Linux内核映像解压到内核映像解压到RAM中,中,然后跳转到内核映像入口执行。然后跳转到内核映像入口执行。n最后是文件系统区。最后是文件系统区。285.7 Linux内核编译与运行内核编译与运行目的目的n 学习和掌握学习和掌握Linux Linux 编译的基本步骤;编译的基本步骤; n 掌握掌握Linux Linux 配置、编译过程和固化。配置、编译过程和固化。内容内容n对Linux 的内核

31、及用户程序进行配置;n编译生成内核映象文件;n把编译的映象文件烧写到FALSH 中,查看运行结果。29n内核是内核是Linux操作系统的核心,它管理所有的系统线程、操作系统的核心,它管理所有的系统线程、进程、资源和资源分配。与其它操作系统不同的是,进程、资源和资源分配。与其它操作系统不同的是,Linux操作系统允许用户对内核进行重新设置。用户可以操作系统允许用户对内核进行重新设置。用户可以对内核进行对内核进行瘦身,增加或消除对某些特定设备或子系瘦身,增加或消除对某些特定设备或子系统的支持。在开发嵌入式系统时,开发人员经常会减少统的支持。在开发嵌入式系统时,开发人员经常会减少系统对一些无用设备的

32、支持,将节省下来的内存分配给系统对一些无用设备的支持,将节省下来的内存分配给各种应用软件。各种应用软件。 n Linux内核对各种硬件和端口的支持要靠各种硬件驱内核对各种硬件和端口的支持要靠各种硬件驱动程序来实现。这些驱动程序可以被直接写入内核,也动程序来实现。这些驱动程序可以被直接写入内核,也可以针对某些特定硬件在需要时自动加载。通常情况下,可以针对某些特定硬件在需要时自动加载。通常情况下,可以被自动加载进内核的内核编码称为自动加载内核模可以被自动加载进内核的内核编码称为自动加载内核模块。块。 30n Linux内核的设置是通过内核设置编辑器完成的。内内核的设置是通过内核设置编辑器完成的。内

33、核设置编辑器可对每个内核设置变量进行描述,帮助用核设置编辑器可对每个内核设置变量进行描述,帮助用户决定哪些变量需要被清除,哪些需要写入内核,或者户决定哪些变量需要被清除,哪些需要写入内核,或者编成一个可加载内核模块在需要时进行加载。编成一个可加载内核模块在需要时进行加载。 n 内核是为众多应用程序提供对计算机硬件的安全访内核是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的,所以内核通常提供一种

34、硬件抽硬件操作是非常复杂的,所以内核通常提供一种硬件抽象的方法来完成这些操作。硬件抽象隐藏了复杂性,为象的方法来完成这些操作。硬件抽象隐藏了复杂性,为应用软件和硬件提供了一套简洁,统一的接口,使程序应用软件和硬件提供了一套简洁,统一的接口,使程序设计更为简单。设计更为简单。 用户可以根据自己的需要编译内核。用户可以根据自己的需要编译内核。 313233硬件平台相关的硬件平台相关的引导过程引导过程平台无关的平台无关的通用引导过程通用引导过程arch/arm/kernel/head.Sinit/main.c中的start_kernel() 函数34n1.1.正在使用的内核版本过旧、或是发行商提供的非标准正在使用的内核版本过旧、或是发行商提供的非标准内核;内核;n2.2.正在使用的内核过于臃肿,需要进行裁剪;正在使用的内核过于臃肿,需要进行裁剪;n3.3.需要在一个新的嵌入式目标机上移植需要在一个新的嵌入式目标机上移植LinuxLinux(需要交叉(需要交叉编译);编译);n4.4.开发嵌入式开发嵌入式LinuxLinux驱动时,必须首先在开发用宿主机上

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论