第4章 文件系统.pdf

上传人:asd****56 文档编号:70321161 上传时间:2023-01-19 格式:PDF 页数:72 大小:1.68MB
返回 下载 相关 举报
第4章 文件系统.pdf_第1页
第1页 / 共72页
第4章 文件系统.pdf_第2页
第2页 / 共72页
点击查看更多>>
资源描述

《第4章 文件系统.pdf》由会员分享,可在线阅读,更多相关《第4章 文件系统.pdf(72页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、12011/5/23Linux操作系统分析第四章 文件系统本章知识要点文件系统的概念,路径和节点文件的有关操作,访问权限和安全性文件系统:EXT2,/proc本章要求分析的数据结构file structfiles_struct structinode structsuper_block structbuffer_head struct22011/5/23Linux操作系统分析4.1 Linux文件系统的层次结构32011/5/23Linux操作系统分析Linux文件系统结构Linux文件系统采用多级目录的树型层次结构当前目录、绝对路径和相对路径的概念类似win/dos42011/5/23Lin

2、ux操作系统分析Linux文件的分类普通文件目录文件设备文件管道文件链接文件(硬连接和符号连接)socket、/proc52011/5/23Linux操作系统分析文件的访问权限Linux中的每一个文件都归某一个特定的用户所有,而且一个用户一般总是与某个用户组相关Linux对文件的访问设定了三级权限:文件所有者,与文件所有者同组的用户,其他用户。对文件的访问主要是三种处理操作:读取、写入和执行。当文件被访问时,系统首先检验访问者的权限,只有与文件的访问权限相符时才允许对文件进行访问。62011/5/23Linux操作系统分析目录和文件Linux的一个目录是一个驻留在磁盘上的文件,称为目录文件。系

3、统对目录文件的处理方法与一般文件相同。目录由若干目录项组成,每个目录项对应目录中的一个文件。在一般操作系统的文件系统中,目录项由文件名和属性、位置、大小、建立或修改时间、访问权限等文件控制信息组成。72011/5/23Linux操作系统分析文件信息的管理与UNIX相同,把文件名和文件控制信息分开管理文件控制信息单独组成一个称为i节点(inode)的结构体,文件名存在何处?每个文件对应一个inode,它们有惟一的编号,称为inode号Linux的目录项只由两部分组成:文件名和inode号82011/5/23Linux操作系统分析文件存储块的组织方式连续方式链接方式索引方式92011/5/23Li

4、nux操作系统分析连续方式102011/5/23Linux操作系统分析链接方式112011/5/23Linux操作系统分析FAT文件系统122011/5/23Linux操作系统分析索引方式索引表132011/5/23Linux操作系统分析UNIX 7 的Inode142011/5/23Linux操作系统分析UNIX7的目录项152011/5/23Linux操作系统分析硬盘的逻辑结构162011/5/23Linux操作系统分析寻径/usr/ast/mbox的过程172011/5/23Linux操作系统分析练习:寻径182011/5/23Linux操作系统分析i-nodes的不同放置位置用于提高文

5、件系统的性能192011/5/23Linux操作系统分析硬链接(Hard Link)rootlocalhost link#ls-ltotal 1-rw-r-r-1 root root 667 Oct 15 13:39 arootlocalhost link#ln a brootlocalhost link#ls-ltotal 2-rw-r-r-2 root root 667 Oct 15 13:39 a-rw-r-r-2 root root 667 Oct 15 13:39 brootlocalhost link#rm arm:remove a?yrootlocalhost link#ls-l

6、total 1-rw-r-r-1 root root 667 Oct 15 13:39 binode/root/linkab202011/5/23Linux操作系统分析符号链接(Symbolic link)rootlocalhost symlink#ls-ltotal 1-rw-r-r-1 root root 667 Oct 15 13:39 arootlocalhost symlink#ln-s a brootlocalhost symlink#ls-ltotal 1-rw-r-r-1 root root 667 Oct 15 13:39 alrwxrwxrwx 1 root root 1

7、Oct 15 14:20 b-arootlocalhost yy#rm arm:remove a?yrootlocalhost symlink#ls-ltotal 0lrwxrwxrwx 1 root root 1 Oct 15 14:20 b-arootlocalhost symlink#cat bcat:b:No such file or directoryinode/root/linkab212011/5/23Linux操作系统分析4.2 EXT2文件系统 Linux最初引进了Minix文件系统。Minix文件系统有较大的局限性。1992年4月推出EXT(EXTended File sy

8、stem)1993年推出EXT2,已成为Linux的标准文件系统 EXT3是一种日志式文件系统(Journal File System)会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有需要时可以回朔追踪。由于资料的写入动作包含许多的细节,像是改变文件标头资料、搜寻磁盘可写入空间、一个个写入资料区段等等,每一个细节进行到一半若被中断,就会造成文件系统的不一致,因而需要重整。日志式文件系统由于详细纪录了每个细节,故当在某个过程中被中断时,系统可以根据这些记录直接回朔并重整被中断的部分,而不必花时间去检查其他的部分,故重整的工作速度相当快,几乎不需要花时间。222011/5/23Linux操

9、作系统分析4.2.1 EXT2的静态结构一个文件系统一般使用块设备的一个独立的逻辑分区物理设备的物理块号和文件系统的逻辑块号EXT2把所使用的逻辑分区划分成块组,并从0开始依次编号。232011/5/23Linux操作系统分析EXT2的超级块(super block)超级块是用来描述EXT2文件系统整体信息的数据结构主要描述文件系统的目录和文件的静态分布情况,以及描述文件系统的各种组成结构的尺寸、数量等。超级块位于每个块组的最前面,每个块组中包含的超级块内容是相同的。242011/5/23Linux操作系统分析EXT2的组描述符组描述符描述一个块组的有关信息,大小为32字节具有相同内容的组描述

10、符表放在每个块组中做为备份252011/5/23Linux操作系统分析EXT2的块位图EXT2文件系统中数据块的使用状况由块位图来描述。每个块组都有一个块位图块位图的每一位(bit)表示一个数据块的使用情况,为1表示对应的数据块已占用,为0表示数据块空闲。各位(bit)的顺序与块组中数据块的顺序一致。EXT2块位图装入一个高速缓存中。高速缓存容纳EXT2_MAX_GROUP_LOAD个块位图,该值目前定义为8。262011/5/23Linux操作系统分析EXT2的inodeEXT2文件系统中的每个文件由一个inode描述,且只能由一个inode描述272011/5/23Linux操作系统分析E

11、XT2的inode表和inode位图一个块组中所有文件的inode形成了inode表。表项的序号就是inode号。inode表存放在块组中所有数据块之前。inode表在块组中要占用几个逻辑块由超级块中s_inodes_per_group给出。inode位图反映了inode表中各个表项的使用情况,它的一位(bit)表示inode表的一个表项,若某位为1表示对应的表项已占用,为0表示表项空闲。inode位图也装入一个高速缓存中282011/5/23Linux操作系统分析EXT2的目录项结构在EXT2中,目录是一个特殊的文件,称为目录文件292011/5/23Linux操作系统分析4.2.1 EXT

12、2在内存中的结构超级位块块位图inodeinode位图目录项302011/5/23Linux操作系统分析超级块的ext2_sb_info结构在/include/linix/ext2_fs_sb.h中定义ext2_sb_info对块位图的描述s_loaded_block_bitmaps,装入高速缓存的块位图数s_block_bitmap_number,装入高速缓存的块位图的块组号,s_block_bitmap中是相应块位图在高速缓存的地址ext2_sb_info对inode位图的描述s_loaded_inode_bitmaps:装入高速缓存的inode位图的数s_block_inode_numb

13、er:装入高速缓存的inode位图的块组号s_inode_bitmap:相应inode位图在高速缓存中的地址312011/5/23Linux操作系统分析组描述符的ext2_group_desc 定义在/include/linix/ext2_fs.h中:struct ext2_group_desc_u32 bg_block_bitmap;/*本组中块位图的位置*/_u32 bg_inode_bitmap;/*本组中inode位图的位置*/_u32 bg_inode_table;/*本组中inode表的位*/_u16 bg_free_blocks_count;/*本组中空闲块数*/_u16 bg_

14、free_inodes_count;/*本组中空闲inode数*/_u16 bg_used_dirs_count;/*本组中所含目录数*/_u16 bg_pad;/*填充*/_u32 bg_reserved3;/*保留*/;322011/5/23Linux操作系统分析inode的ext2_inode_infostruct ext2_inode_info _u32i_data15;/*数据块指针数组*/_u32i_flags;/*文件标志(属性)*/_u32i_faddr;/*Fragment(片)地址*/_u8i_frag_no;/*Fragment(片)号*/_u8i_frag_size;/

15、*Fragment(片)大小*/_u16i_osync;/*同步标志*/_u32i_file_acl;/*文件访问控制链表*/_u32i_dir_acl;/*目录访问控制链表*/_u32i_dtime;/*文件删除时间*/_u32i_version;/*文件版本*/_u32i_block_group;/*inode所在块组号*/_u32i_next_alloc_block;/*下一个要分配的块*/_u32i_next_alloc_goal;/*下一个要分配的对象*_u32i_prealloc_block;*预留块首地址*/_u32i_prealloc_count;/*预留计数*/inti_ne

16、w_inode:1;/*标志,是否为新分配的inode*/;332011/5/23Linux操作系统分析目录项的ext2_dir_entrystruct ext2_dir_entry _u32inode;/*inode号*/_u16 rec_len;/*目录项长度*/_u16 name_len;/*文件名长度*/charnameEXT2_NAME_LEN;/*文件名*/;#define EXT2_NAME_LEN 255342011/5/23Linux操作系统分析EXT2保留的inode号/*Special inode numbers*/#defineEXT2_BAD_INO1/*Bad bl

17、ocks inode*/#define EXT2_ROOT_INO2/*Root inode*/#define EXT2_ACL_IDX_INO3/*ACL inode*/#define EXT2_ACL_DATA_INO4/*ACL inode*/#define EXT2_BOOT_LOADER_INO 5/*Boot loader inode*/#define EXT2_UNDEL_DIR_INO6/*Undelete directory inode*/352011/5/23Linux操作系统分析4.3VFS不同物理文件系统具有不同的组织结构和不同的处理方式。操作系统需要把各种不同的物理文

18、件系统的所有特性进行抽象,建立起一个面向各种物理文件系统的转换机制,通过这个转换机制,把各种不同物理文件系统转换为一个具有统一共性的虚拟文件系统。这种转换机制称为虚拟文件系统VFS(Virtual File System)362011/5/23Linux操作系统分析引入VFS的意义Linux支持多种实际文件系统,如EXT2、minix、msdos、sysv等称为物理文件系统。VFS实际上向Linux内核和进程提供了一个处理各种物理文件系统的公共接口,通过这个接口使得不同的物理文件系统看来都是相同的。372011/5/23Linux操作系统分析VFS示意图382011/5/23Linux操作系统

19、分析VFS在与内核模块的关系392011/5/23Linux操作系统分析VFS的使用402011/5/23Linux操作系统分析VFS role in a simple file copy operation412011/5/23Linux操作系统分析基于VFS的文件访问进程1进程1进程1file对象file对象file对象inode对象超级块磁盘进程1进程2进程3file对象file对象file对象超级块inode对象dentry对象dentry对象422011/5/23Linux操作系统分析VFS的作用对逻辑文件系统的数据结构进行抽象,以一种统一的数据结构进行管理接受用户层的系统调用,例如

20、write、open、stat、link等等。支持多种逻辑文件系统之间相互访问。接受内核其他子系统的操作请求,特别是内存管理子系统432011/5/23Linux操作系统分析VFS中的关键数据结构VFS并不是一种实际的文件系统EXT2等物理文件系统是存在于外存空间的,而VFS仅存在于内存VFS是在系统启动时建立,在系统关闭时消失的,物理文件系统是长期存在于外存。在VFS中包含着向物理文件系统转换的一系列数据结构,如VFS超级块、VFS的inode等,各种操作函数的转换入口。442011/5/23Linux操作系统分析VFS的超级块 文件系统的组织信息 如设备号s_dev、块大小s_blocks

21、ize、块位数s_blocksize_bits、文件系统署名s_magic等。文件系统的注册和安装信息,s_type指向注册链表中该文件系统的file_system_type结构体。s_covered是指向文件系统树型结构中安装目录inode的指针,s_mounted是安装到Linux中的文件系统的根目录inode的指针。超级块的属性信息,超级块的各种标志,如超级块标志s_flags、锁定标志s_lock、禁写标志s_rd_only、修改标志s_dirt 等。文件系统特有的信息 由联合体u的各个成员项表示。它们是各种文件系统的超级块在内存中的映像,如EXT2文件系统的ext2_sb_info结

22、构。u表示的是各种文件系统的个性信息。452011/5/23Linux操作系统分析VFS超级块的操作struct super_operations void(*read_inode)(struct inode*);int(*notify_change)(struct inode*,struct iattr*);void(*write_inode)(struct inode*);void(*put_inode)(struct inode*);void(*put_super)(struct super_block*);void(*write_super)(struct super_block*);

23、void(*statfs)(struct super_block*,struct statfs*,int);int(*remount_fs)(struct super_block*,int*,char*);462011/5/23Linux操作系统分析VFS的inodeVFS的inode不仅表示存储文件,而且还表示设备文件和特殊文件(pipe,socket,/pro等)VFS的inode与某个文件的对应关系是通过设备号i_dev与inode号i_ino建立的,它们惟一地指定了某个设备上的一个文件或目录。VFS的inode是设备、文件或目录的inode在内存中的统一映像,并且在u中给出了不同文件系

24、统特有的信息。这些特有信息是各种文件系统的inode在内存中的映像。如inode.u.ext2_i就是EXT2的inode在内存中的映像,即ext2_inode_info结构。472011/5/23Linux操作系统分析管理VFSinode的全局变量max_inodes,给定了inode的最大数量nr_inodes,表示当前使用的inode数量nr_free_inodes,表示空闲的inode数量482011/5/23Linux操作系统分析VFSinode的操作函数struct inode_operations struct file_operations*default_file_ops;i

25、nt(*create)(struct inode*,const char*,int,int,struct inode*);int(*lookup)(struct inode*,const char*,int,struct inode*);int(*link)(struct inode*,struct inode*,const char*,int);int(*unlink)(struct inode*,const char*,int);int(*symlink)(struct inode*,const char*,int,const char*);int(*mkdir)(struct inode

26、*,const char*,int,int);int(*rmdir)(struct inode*,const char*,int);int(*mknod)(struct inode*,const char*,int,int,int);int(*rename)(struct inode*,const char*,int,struct inode*,const char*,int,int);int(*readlink)(struct inode*,char*,int);int(*follow_link)(struct inode*,struct inode*,int,int,struct inod

27、e*);int(*readpage)(struct inode*,struct page*);int(*writepage)(struct inode*,struct page*);int(*bmap)(struct inode*,int);void(*truncate)(struct inode*);int(*permission)(struct inode*,int);int(*smap)(struct inode*,int);492011/5/23Linux操作系统分析VFS的目录项struct dentry atomic_t d_count;unsigned int d_flags;s

28、truct inode *d_inode;/*Where the name belongs to-NULL is negative*/struct dentry*d_parent;/*parent directory*/struct list_head d_hash;/*lookup hash list*/struct list_head d_lru;/*d_count=0 LRU list*/struct list_head d_child;/*child of parent list*/struct list_head d_subdirs;/*our children*/struct li

29、st_head d_alias;/*inode alias list*/int d_mounted;struct qstr d_name;unsigned long d_time;/*used by d_revalidate*/struct dentry_operations *d_op;struct super_block*d_sb;/*The root of the dentry tree*/unsigned long d_vfs_flags;void*d_fsdata;/*fs-specific data*/unsigned char d_inameDNAME_INLINE_LEN;/*

30、small names*/;502011/5/23Linux操作系统分析目录项的操作struct dentry_operations int(*d_revalidate)(struct dentry*,int);int(*d_hash)(struct dentry*,struct qstr*);int(*d_compare)(struct dentry*,struct qstr*,struct qstr*);int(*d_delete)(struct dentry*);void(*d_release)(struct dentry*);void(*d_iput)(struct dentry*,s

31、truct inode*);512011/5/23Linux操作系统分析VFS与实际文件系统的接口数据结构522011/5/23Linux操作系统分析proc文件系统/proc:一个虚拟文件系统,只存在于内存中,通过它可以查询、设置系统的运行情况及各种系统参数。系统中的很多应用都依赖于proc文件系统,如命令lsmod等同于 cat/proc/modules。文件的大小为0;很多文件名体现了内核的相应参数,可以通过这个文件名修改参数值。如#echo 2048 /proc/sys/shmmni,修改共享内存段的限制。/proc下的“数字目录”指代了相应pid的进程,如目录“1”下的内容就是1进程

32、的各种信息。532011/5/23Linux操作系统分析4.4 文件系统的注册和安装要使Linux 支持,文件系统必须注册,文件系统不再使用时则予以注销。文件系统除在VFS中注册,还必须安装到系统后才能使用。542011/5/23Linux操作系统分析文件系统的注册向系统内核注册有两种方式一种是在系统引导时在VFS中注册,在系统关闭时注销一种是把文件系统做为可装卸模块,安装时在VFS中注册,并在模块卸载时注销552011/5/23Linux操作系统分析file_system_type结构struct file_system_type struct super_block*(*read_supe

33、r)(struct super_block*,void*,int);const char*name;int requires_dev;struct file_system_type*next;对于EXT2文件系统:static struct file_system_type ext2_fs_type=ext2_read_super,ext2,1,NULL;562011/5/23Linux操作系统分析注册函数register_filesystem()内核提供注册函数register_filesystem(),把注册结构体做为参数文件系统的注册是通过内核提供的文件系统初始化函数实现的:init_e

34、xt2_fs()ext2文件系统初始化函数;init_minix_fs()minix文件系统初始化函数;init_msdos_fs()msdos文件系统初始化函数;init_proc_fs()proc文件系统初始化函数;init_sysv_fs()sysv文件系统初始化函数;572011/5/23Linux操作系统分析文件系统的安装由于EXT2是Linux的标准文件系统,所以系统把EXT2文件系统的磁盘分区做为系统的根文件系统EXT2以外的文件系统则安装在根文件系统下的某个目录下,成为系统树型结构中的一个分枝。Linux文件系统的树型层次结构中用于安装其它文件系统的目录称为安装点或安装目录。5

35、82011/5/23Linux操作系统分析文件系统的安装(mount)/binetcdevusrRoot filesystem/usr filesystemComplete hierarchy after mounting/usr/binmanlib/binetcdevusrusrbinmanlib592011/5/23Linux操作系统分析文件系统的安装(mount)rootd_mounted!=0i_sbmnt_mountpointmnt_root下挂文件系统安装点vfsmountrootd_mounted!=0i_sbmnt_mountpointmnt_root下挂文件系统安装点vfsm

36、ount602011/5/23Linux操作系统分析已安装文件系统的描述static LIST_HEAD(vfsmntlist);struct vfsmountstruct list_head mnt_hash;struct vfsmount*mnt_parent;/*fs we are mounted on*/*fs we are mounted on*/struct dentry*mnt_mountpoint;/*dentry of mountpoint*/*dentry of mountpoint*/struct dentry*mnt_root;/*root of the mounted

37、 tree*/*root of the mounted tree*/struct super_block*mnt_sb;/*pointer to superblock*/*pointer to superblock*/struct list_head mnt_mounts;/*list of children,anchored here*/*list of children,anchored here*/struct list_head mnt_child;/*and going through their mnt_child*/*and going through their mnt_chi

38、ld*/atomic_t mnt_count;int mnt_flags;char*mnt_devname;/*Name of device e.g./dev/dsk/hda/*Name of device e.g./dev/dsk/hda1 1*/*/struct list_head mnt_list;612011/5/23Linux操作系统分析这里所检查的是对路径中各层目录(而不是目标文件)的访问访问权限。注意:对于中间节点所需的权限为“执行”权,即MAYEXEC。如果权限不符,则permission返回一个出错代码,从而通过break语句结束循环,搜索就失败了。622011/5/23Li

39、nux操作系统分析已安装文件系统的描述mnt_sbmnt_sbs_types_typemnt_sbmnt_sbvfsmntlistvfsmountsuper_blockfile_system_typefile_systems632011/5/23Linux操作系统分析已安装文件系统的管理642011/5/23Linux操作系统分析4.5 Linux的文件管理和操作对于系统中打开的文件,主要从两个方面进行管理一是由系统通过系统打开文件表进行统一管理,一是由进程通过私有数据结构进行管理。文件打开后要进行各种操作,VFS提供了面向文件操作的统一接口。652011/5/23Linux操作系统分析Lin

40、ux文件管理逻辑结构图662011/5/23Linux操作系统分析进程的文件管理 对于一个进程打开的所有文件,由进程的两个私有结构进行管理,fs_struct结构记录着文件系统根目录和当前目录 files_struct结构包含着进程的打开文件表 进程每打开一个文件时,建立一个file结构体,并加入到系统打开文件表中,然后把该file结构体的首地址写入fd数组的第一个空闲元素中 一个进程所有打开的文件都记载在fd数组中,数组的下标称为文件标识号 在Linux中,进程使用文件名打开一个文件。在此之后对文件的识别就不再使用文件名,而直接使用文件标识号 在系统启动时文件标识号0、1、2由系统分配:0标

41、准输入设备,1标准输出设备,2标准错误输出设备。672011/5/23Linux操作系统分析files_struct结构体struct files_struct atomic_t count;rwlock_t file_lock;/*Protects all the below members.Nests inside tsk-alloc_lock*/int max_fds;int max_fdset;int next_fd;struct file*fd;/*current fd array*/fd_set*close_on_exec;fd_set*open_fds;fd_set close_

42、on_exec_init;fd_set open_fds_init;struct file*fd_arrayNR_OPEN_DEFAULT;682011/5/23Linux操作系统分析fs_struct结构体struct fs_struct int count;/*共享此结构的计数值*/unsigned short umask;/*文件掩码*/struct inode*root,*pwd;/*根目录和当前目录inode指针*/;root是指向当前目录所在的文件系统的根目录inode,在按照绝对路径访问文件时就从这个指针开始。pwd是指向当前目录inode的指针,相对路径则从这个指针开始。692

43、011/5/23Linux操作系统分析系统打开文件表Linux系统内核把所有进程打开的文件集中管理,把它们组成“系统打开文件表”。系统打开文件表是一个双向链表,它的每个表项(节点)是一个file结构,称为文件描述符,其中存放着一个已打开文件的管理控制信息进程每次打开一个文件就建立一个file结构体,并把它加入到系统打开文件链表中。全局变量first_file指向系统打开文件表的表头。702011/5/23Linux操作系统分析file结构体struct file mode_t f_mode;/*文件的打开模式*/loff_t f_pos;/*文件的当前读写位置*/unsigned short

44、f_flags;/*文件操作标志*/unsigned short f_count;/*共享该结构体的计数值*/unsigned long f_reada,f_ramax,f_raend,f_ralen,f_rawin;struct file*f_next,*f_prev;/*链接前后节点的指针*/struct fown_struct f_owner;/*SIGIO用PID*/struct inode*f_inode;/*指向文件对应的inode*/struct file_operations*f_op;/*指向文件操作结构体的指针*/unsigned long f_version;/*文件版本

45、*/void*private_data;/*指向与文件管理模块有关的私有数据的指针*/;712011/5/23Linux操作系统分析文件资源的继承当一个进程通过fork()创建一个子进程后,子进程共享父进程的打开文件表,子进程两者的打开文件表中下标相同的两个元素指向同一个file结构。这时file的f_count计数值增1。一个文件可以被某个进程多次打开,每次都分配一个file,并占用该进程打开文件表fd的一项,得到一个文件标识号。但它们的file中的f_inode都指向同一个inode。722011/5/23Linux操作系统分析文件操作函数(VFS)struct file_operatio

46、ns int(*lseek)(struct inode*,struct file*,off_t,int);int(*read)(struct inode*,struct file*,char*,int);int(*write)(struct inode*,struct file*,const char*,int);int(*readdir)(struct inode*,struct file*,void*,filldir_t);int(*select)(struct inode*,struct file*,int,select_table*);int(*ioctl)(struct inode*

47、,struct file*,unsigned int,unsigned long);int(*mmap)(struct inode*,struct file*,struct vm_area_struct*);int(*open)(struct inode*,struct file*);void(*release)(struct inode*,struct file*);int(*fsync)(struct inode*,struct file*);int(*fasync)(struct inode*,struct file*,int);int(*check_media_change)(kdev_t dev);int(*revalidate)(kdev_t dev);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁