GRUB2及启动过程详解_第1页
GRUB2及启动过程详解_第2页
GRUB2及启动过程详解_第3页
GRUB2及启动过程详解_第4页
GRUB2及启动过程详解_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

GRUB2及启动过程详解作者: 南瓜剪子2016年7月28日1. 概述22. CentOS7中GRUB223. GRUB2 的 bootstrap image文件33.1. boot.img33.2. diskboot.img43.3. kernel.img43.4. core.img43.5. *.mod44. 对比GRUB Legacy54.1. stage154.2. *_stage1_554.3. stage255. grub2-mkimage定制core.img66. GRUB2安装76.1. Linux是怎么命名设备(/dev/sda)76.2. MBR(Master Boot Record)86.3. MBR分区表DPT(Disk Partition Table)106.4. LBA and CHS146.4.1. CHS(cylinders-heads-sectors)146.4.2. LBA(Logical Block Address)146.5. boot.img和core.img安装156.6. 硬盘总结187. 启动过程197.1. BIOS197.2. GRUB2中boot.img207.2.1. Step1无条件跳转207.2.2. Step2 初始化207.2.3. Step3 判断硬盘是否支持LBA还是只支持CHS227.2.4. Step4 采用LBA加载core.img第一个扇区237.2.5. Step5 拷贝core.img第一个扇区到内存指定位置257.2.6. Step6 执行core.img第一条语句277.2.7. Step7 boot.img总结277.3. GRUB2中core.img287.3.1. diskboot.img287.3.2. GRUB2 core Startup347.3.3. GRUB主函数即GRUB主要功能377.3.4. 加载Linux Kernel387.4. Linux kernel478. 结束语489. 参考文献481. 概述计算机系统上电之后由固化到ROM中的BIOS(UEFI)进行操作,然后导入硬盘MBR中Boot Loader并调到其运行,由Boot Loader对操作系统内核进行加载,并将控制权交给操作系统.下图简单描述了CentOS7的启动过程(CentOS7使用GRUB2作为Boot Loader):现在的Boot Loader有很多类型,大致如下:1 对Linux来说GRUB2占据了统治地位2 对Windows来说Bootmgr/BCD占据了统治地位3 对Apple系统缺省的是BootX作为一名计算机工程师,了解Boot Loader的原理是很重要。本文着重介绍GRUB2及其启动流程.读完本文,相信读者能够对Boot Loader原理有一定深刻理解,并能大致知道其他Boot Loader的作用.本文在介绍一些基本知识后,在第7章会引入基本的反汇编过程来讲解GRUB2的启动流程,因为只有直接读代码才能深入学习原理.需要读者:- 有一定的汇编语言知识,如果读者对汇编不敢兴趣,可以跳过相关章节- 同时也需要读者有一定C语言知识本文稍微有点长,但都是作者本人的经验总结,如果静下心读完,相信对你会有帮助,相比其它GRUB一厚本书,能节约你很多时间。但由于作者水平有限,有不足之处忘谅解。2. CentOS7中GRUB2GRUB2是GNU下面的一个项目,有关其详细信息,请参考官方网站: /software/grub/. 相对于GRUB2, 原先的GRUB(i.e. version 0.9x)被称为: GRUB Legacy. 官网上说明: GRUB Legacy is no longer being developed.从 1.x 开始的新版本就称为 GRUB 2(注意,虽然称为GRUB2,但其版本号却是从1.x开始 1.99也是GRUB2). 现在各种最新发行版本的Linux(包括CentOS7)都采用GRUB2.在CentOS7上可以查看安装的GRUB2版本rootcontroller # rpm -qa | grep grubgrub2-2.02-0.34.el7.centos.x86_64在CentOS7下面/boot/grub2目录可以看到有关GRUB2相关文件. 在/boot/grub2/i386-pc目录下是GRUB2 bootstrap images文件,该目录大部分文件是以.mod结尾,这些文件为GRUB2模块文件,最后在该目录下面有以下两个image文件:rootcontroller i386-pc# ls -lrt *.img-rw-r-r-. 1 root root 26618 7u6708 11 23:33 core.img-rw-r-r-. 1 root root 512 7u6708 11 23:33 boot.img以上两个img文件都会被grub2-install命令安装到硬盘上相应位置(在硬盘什么位置后面会说),很有意思的是请注意两点1) boot.img固定为512Byte2) core.img小于32KByte如果你觉得好奇,可以用file命令查看这些image文件类型rootcontroller i386-pc# file boot.imgboot.img: x86 boot sector; partition 4: ID=0xd4, starthead 205, startsector , 0 sectors, code offset 0x63rootcontroller i386-pc# file core.imgcore.img: datarootcontroller i386-pc# file xfs.modxfs.mod: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped对于boot.img file命令明确指出其为x86 boot sector,而mod文件却是ELF文件,接下来让我们进一步了解这些bootstrap image文件3. GRUB2 的 bootstrap image文件GRUB2有以下各种bootstrap images文件,大伙应悉知,这些image会被grub2-install安装到硬盘相应的位置,当BIOS完成后,他们会被加载并引导系统继续完成启动.3.1. boot.img在PC BIOS系统中,这个image是GRUB2第一个被运行的它被写在MBR(Master Boot Record)或者在分区(partition)的boot sector中因为MBR或PC boot sector是固定512字节,这个文件的大小也固定为512byte.boot.img功能很简单,主要是读磁盘中core.img中的第一个扇区(sector)到内存中并跳到该部分运行(如果是硬盘启动,那么该扇区就是下面要介绍的diskboot.img)因为只有512字节,boot.img不能够加载文件系统(比如CentOS7中XFS或其它Linux的EXT4等等),并且只能是从硬盘固定的位置加载.3.2. diskboot.img当从硬盘启动的时候这是core.img第一个扇区(sector)的内容,主要功能是读剩下的core.img到内存中并开始运行kernel.img. 同样diskboot.img没有文件系统的功能(XFS,EXT4等),当他读取剩余的core.img时候,依然从硬盘固定位置读取.根据启动的介质不同,类似diskboot.img文件有很多,在安装GRUB时候选用其中一个,目前大部分都是从硬盘启动diskboot.img1 cdboot.img: 从CD-ROM启动2 pxeboot.img: 从PXE网络启动3 Lnxboot.img: 如果从其他bootloader比如LILO(用image= section)启动,这个image使GRUB看上去像一个Linux内核3.3. kernel.img这个文件包含了GRUB2基本的运行时支撑:对设备及文件的框架,环境变量,恢复模式下的命令行等等一般我们不会直接使用它,但是它是core.img中必不可少的一部分.3.4. core.img这个是GRUB的核心他是被grub2-mkimage命令生存,包含了kernel.img以及一些必须必要的modules. 通常core.img包含了足够的模块(modules)为了访问XFS/EXT4文件系统/boot/grub2目录,并且在运行时加载从文件系统(XFS)所有剩余的模块,这些剩余模块包含启动目录处理,加载操作系统等等功能模块化的设计思路最主要的目的是使core.img保持足够小,目前disk限制core.img安装必须小于32KB. core.img一般被安装在硬盘特殊区域:embedding area(夹层区),这个区一般有32K限制,我们在后面会介绍什么是夹层区3.5. *.mod所有GRUB其他部分被称为模块,他们大部分被core.img在运行时自动动态加载,其中一小部分被整合到core.img中,这小部分是必须,比如文件系统支持(xfs.mod)模块可以手工加载,请参考insmod command(在本文不作介绍,请查阅相关文档)注意:如果对以上各种image文件还是不清楚,请继续往下读,后面会有详细说明。4. 对比GRUB LegacyGRUB2 与GRUB Legacy不同,很多人都熟悉GRUB Legacy里面的stage1, stage1_5,stage2等等概念,而在GRUB2里面,这些被各种bootstrap image文件替代:boot.imgdiskboot.imgcore.img大伙应悉知以上三个images4.1. stage1GRUB Legacy中stage1相当于GRUB 2中boot.img, 他们完成相同的功能. 4.2. *_stage1_5GRUB Legacy中Stage 1.5包含了足够的文件系统(XFS或EXT4)代码而允许Stage2从文件系统中直接载入系统,就这个意义上来说很像GRUB 2中的core.img.不过core.img功能更加强大,它提供了恢复shell,使能够在不能加载其他模块(modules)情况下(比如partition number已经改变)能够人工恢复。Core.img能够被灵活的创建,允许从LVM或者RAID加载模块.GRUB Legacy 能够运行stage1和stage2而不运行stage1.5, 但是对GRUB2来说,core.img是必须的。4.3. stage2GRUB 2 没有对应stage2的image. 它从/boot/grub加载相应的模块。5. grub2-mkimage定制core.img上一章介绍的core.img至少包含了一下几个部分1) diskboot.img2) kernel.img3) required *.mod他们被grub2-mkimage命令整合成core.img文件,实际上当运行完该命令最终生成的是上一章中/boot/grub2/i386-pc目录下的两个image文件1) boot.img2) core.img有兴趣的读者请参照man grub2-mkimage查阅相关信息,定制自己的core.img:lanzhoucontroller image$ grub2-mkimage -O i386-pc -p /boot/grub2 -v -o core.img xfsgrub2-mkimage: info: the total module size is 0x26e4.grub2-mkimage: info: reading /usr/lib/grub/i386-pc/kernel.img.grub2-mkimage: info: locating the section .text at 0x0.grub2-mkimage: info: locating the section .rodata at 0x5494.grub2-mkimage: info: locating the section .data at 0x6448.grub2-mkimage: info: locating the section .bss at 0x6bd0.grub2-mkimage: info: reading /usr/lib/grub/i386-pc/fshelp.mod.grub2-mkimage: info: reading /usr/lib/grub/i386-pc/xfs.mod.grub2-mkimage: info: kernel_img=0x, kernel_size=0x6bd0.grub2-mkimage: info: the core size is 0x5085.grub2-mkimage: info: reading /usr/lib/grub/i386-pc/lzma_decompress.img.grub2-mkimage: info: reading /usr/lib/grub/i386-pc/diskboot.img.grub2-mkimage: info: writing 0x200 bytes.grub2-mkimage: info: writing 0x5bc5 bytes.core.img是内核的名字,生成在当前目录下, i386-pc是镜像的格式, xfs是加入内核的模块。常用模块有:xfs: 支持 xfs 文件系统(CentOS7缺省的文件系统)ext2: 支持 ext2 文件系统但是我们一般不直接运行该命令,一般运行grub2-install. 该命令会自动调用grub2-mkimage.6. GRUB2安装当一切准备好后,我们可运行以下命令grub2-install /dev/sda去安装grub2(缺省的-boot-directory=/boot/)不过一般的CentOS7已经安装好了GRUB2,除非你感兴趣,不用运行上面命令.在继续后面的内容之前,下面有几个概念大伙必须知道:6.1. Linux是怎么命名设备(/dev/sda)比如/dev/sda5,如下图所示1) SCSI硬盘第一个SCSI接口硬盘:/dev/sda第二个SCSI接口硬盘:/dev/sdb2) USB如果只有一块硬盘,那么第一个USB盘也可能是 /dev/sdb (usb存储设备也目前在内核中在两种驱动方法,一种是模拟SCSI硬盘,另一种是非模拟SCSI硬盘,前一种目前比较多)3) SATA如果只有一个SATA硬盘,第一个SATA硬盘也是: /dev/sda4) IDE硬盘第一个IDE接口主盘:/dev/hda第一个IDE接口从盘:/dev/hdb第二个IDE接口主盘:/dev/hdc第二个IDE接口从盘:/dev/hdd注意:1) 所以只靠/dev/sda无法知道设备类型,也许是SCSI, SATA或者U盘,但是一般来说/dev/sda都会是SCSI硬盘, 本文不在详述SCSI,IDE,SATA区别,请参考相关资料2)有关分区,见下文6.3DPT6.2. MBR(Master Boot Record) MBR,即主引导记录,是对IBM兼容机的硬盘或者可移动磁盘分区时,在驱动器最前端的一段引导扇区,其地址为采用CHS寻址: MBR固定为硬盘的0柱面、0磁头、1扇区采用LBA寻址: MBR固定LBA0(注意,我们将在后面介绍CHS与LBA,目前普片采用LBA寻址)MBR长度为512字节,它一般由三个部分组成:主引导程序硬盘分区表DPT(Disk Partition table) 固定个分区,每分区16byte分区有效标志, 以55AA结尾的MBRStructure of a classical generic MBRAddressDescriptionSize(bytes)HexDec+000hex+0Bootstrap code area446+1BEhex+446Partition entry 1Partition table(for primary partitions)16+1CEhex+462Partition entry 216+1DEhex+478Partition entry 316+1EEhex+494Partition entry 416+1FEhex+51055hexBoot signaturea2+1FFhex+511AAhexTotal size: 446 + 4*16 + 2512本表摘自:/wiki/Master_boot_record注意1) 由于后面支持EFI及GPT,上述结构有些变化,但在本文不作描述,有兴趣的读者可以参看相关EFI及GPT文档2) 上文中的boot.img将会被grub2-install命令拷贝到MBR主引导程序部分(也就是Bootstrap code area),在后面将会详细分析boot.img=工具: 导出并查看MBR=我们可以用DD命令把MBR从硬盘中导出来rootcontroller image# dd if=/dev/sda of=mbr.bin bs=1 count=512512+0 records in512+0 records out512 bytes (512 B) copied, 0. s, 294 kB/s然后我们可以使用hexdump查看其内容rootcontroller image# hexdump -C mbr.bin eb 63 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.c.| fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |.|.!.| 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |.8.u.u| f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b |.|.t.| 4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00 |L.|.| 00 00 00 00 00 00 00 00 00 00 00 80 01 00 00 00 |.| 00 00 00 00 ff fa 90 90 f6 c2 80 74 05 f6 c2 70 |.t.p| 74 02 b2 80 ea 79 7c 00 00 31 c0 8e d8 8e d0 bc |t.y|.1.| 00 20 fb a0 64 7c 3c ff 74 02 88 c2 52 be 05 7c |. .d|.t.R.| b4 41 bb aa 55 cd 13 5a 52 72 3d 81 fb 55 aa 75 |.A.U.ZRr=.U.u|a0 37 83 e1 01 74 32 31 c0 89 44 04 40 88 44 ff 89 |7.t21.D.D.|b0 44 02 c7 04 10 00 66 8b 1e 5c 7c 66 89 5c 08 66 |D.f.|f.f|c0 8b 1e 60 7c 66 89 5c 0c c7 44 06 00 70 b4 42 cd |.|f.D.p.B.|d0 13 72 05 bb 00 70 eb 76 b4 08 cd 13 73 0d 5a 84 |.r.p.v.s.Z.|e0 d2 0f 83 de 00 be 85 7d e9 82 00 66 0f b6 c6 88 |.f.|f0 64 ff 40 66 89 44 04 0f b6 d1 c1 e2 02 88 e8 88 |d.f.D.| f4 40 89 44 08 0f b6 c2 c0 e8 02 66 89 04 66 a1 |.D.f.f.| 60 7c 66 09 c0 75 4e 66 a1 5c 7c 66 31 d2 66 f7 |f.uNf.|f1.f.| 34 88 d1 31 d2 66 f7 74 04 3b 44 08 7d 37 fe c1 |4.1.f.t.;D.7.| 88 c5 30 c0 c1 e8 02 08 c1 88 d0 5a 88 c6 bb 00 |.0.Z.| 70 8e c3 31 db b8 01 02 cd 13 72 1e 8c c3 60 1e |p.1.r.| b9 00 01 8e db 31 f6 bf 00 80 8e c6 fc f3 a5 1f |.1.| 61 ff 26 5a 7c be 80 7d eb 03 be 8f 7d e8 34 00 |a.&Z|.4.| be 94 7d e8 2e 00 cd 18 eb fe 47 52 55 42 20 00 |.GRUB .| 47 65 6f 6d 00 48 61 72 64 20 44 69 73 6b 00 52 |Geom.Hard Disk.R| 65 61 64 00 20 45 72 72 6f 72 0d 0a 00 bb 01 00 |ead. Error.|a0 b4 0e cd 10 ac 3c 00 75 f4 c3 00 00 00 00 00 00 |.8GB)0x10OPUS0x11Hidden FAT120x12Compaq diagnost0x14Hidden FAT16 32M0x16Hidden FAT160x17Hidden HPFS/NTFS0x18AST Windows swap0x1BHidden FAT320x1CHidden FAT32 partition(Using LBA-mode INT 13 extensions)0x1EHidden LBA VFAT partition0x24NEC DOS0x3CPartition Magic0x40Venix 802860x41PPC PreP Boot0x42SFS0x4DQNX4.x0x4EQNX4.x 2nd part0x4FQNX4.x 3rd part0x50OnTrack DM0x51OnTrack DM6 Aux0x52CP/M0x53OnTrack DM6 Aux0x54OnTrack DM60x55EZ-Drive0x56Golden Bow0x5CPriam Edisk0x61Speed Stor0x63GNU HURD or Sys0x64Novell Netware0x65Novell Netware0x70Disk Secure Mult0x75PC/IX0x80Old Minix0x81Minix/Old Linux0x82Linux swap0x83Linux0x84OS/2 hidden C:0x85Linux Extended0x86NTFS volume Set0x87NTFS volume Set0x8eLinux LVM0x93Amoebba0x94Amoebba BBT0xA0IBM Thinkpad hidden0xA5BSD/3860xA6Open BSD0xA7NextSTEP0xB7BSDI fs0xB8BSDI swap0xC0DR-DOS/Novell Dos secured partition0xC1DR-DOS/sec0xC4DR-DOS/sec0xC6DR-DOS/sec0xC7Syrinx0xDBCP/M/CTOS0xE1DOS access0xE3DOS R/00xE4SpeedStor0xEBBeOS fs0xF1Speed Stor0xF2DOS 3.3 + secondary partition0xF4Speed Stor0xFELAN Step0xFFBBT采用DPT同一块硬盘可以安装多种文件系统而互不影响=扩展分区=按照DPT中要求,linux最多限制有个主分区1)也就是你可以把硬盘分为个主分区/dev/sda1 (主分区)/dev/sda2 (主分区)/dev/sda3 (主分区)/dev/sda4 (主分区)如果需要把硬盘分为多个分区,那么必须使用扩展分区,扩展分区做多个,在扩展分区下面在设立若干个逻辑分区:/dev/sda1 (主分区)/dev/sda2 (主分区)/dev/sda3 (扩展分区)/dev/sda5 (逻辑分区)/dev/sda6 (逻辑分区)/dev/sda7 (逻辑分区)注意:1) 扩展分区的分区类型描述(Partition Type Indicator)为0x852) 逻辑分区并不是从sda4开始,sda4固定分配给主分区6.4. LBA and CHS关于硬盘的寻址与定位有两种方式:CHS是24位寻址,LBS是可以支持64位寻址6.4.1. CHS(cylinders-heads-sectors)CHS寻址模式将硬盘划分为磁头(Heads)、柱面(Cylinder)、扇区(Sector)。柱面(Cylinder):所有磁片中半径相同的同心磁道构成“柱面,意思是这一系列的磁道垂直叠在一起,就形成一个柱面的形状。简单地理解,柱面数=磁道数。磁头(Heads):每张磁片的正反两面各有一个磁头,一个磁头对应一张磁片的一个面。因此,用第几磁 头就可以表示数据在哪个磁面。扇区(Sector):将磁道划分为若干个小的区段,就是扇区。虽然很小,但实际是一个扇子的形状,故称为扇区。每个扇区的容量为512字节。知道了磁头数、柱面数、扇区数,就可以很容易地确定数据保存在硬盘的哪个位置。也很容易确定硬盘的容量,其计算公式是:硬盘容量=磁头数柱面数扇区数512字节CHS限制: BIOS INT 13h 接口柱面地址10位1024磁头地址位256扇区地址位63 (扇区从开始,并不是从开始)共24位的寻址方式, 最大硬盘空间8GBCHS限制2: IDE(ATA)柱面地址16位65536磁头地址4位16扇区地址位63共24位的寻址方式, 最大硬盘空间127.5GBCHS目前基本上不再使用,由于24位寻址空间的局限太大,目前普片采用LBA方式采用CHS寻址,MBR地址为0柱面、0磁头、1扇区6.4.2. LBA(Logical Block Address)LBA是非常单纯的一种寻址模式从0开始编号来定位区块,第一区块LBA=0,第二区块LBA=1,依此类推。这种寻址模式取代了原先操作系统必须面对存储设备硬件构造的方式。最具代表性的首推CHS(cylinders-heads-sectors,磁柱-磁头-扇区)寻址模式LBA最大的好处能偷突破CHS 24bit限制,老式设备支持28bit LBA,新设备一般支持48bit LBA采用LBA寻址,MBR地址为LBA-06.5. boot.img和core.img安装在了解上面的基础知识后,在回到我们的GRUB2,我们知道boot.img将会拷贝到MBR,也就是LBA-0的位置,那么core.img将会被放置在什么地方?MBR与GPT有不同解决方案:请参考/software/grub/manual/grub.html#BIOS-installation1) MBR在MBR和第一个partition之间有一段空白磁盘空间。大伙还记得5.3 DPT中fdisk命令查看第一个分区的位置从2048sector(LBA2048)开始,那么前面之一段都是空白。这个空白磁盘空间有各种名称 boot track, MBR gap, embedding area, 但是有至少必须32Kbyte,一般来说core.img将会被拷贝到这个区域中2) GPTGPT作为UEF的一部分,也能够被使用在BIOS平台上,但是必须得有一个专门的GPT分区,这个分区至少32KB大小,建议,名字为BIOS Boot Partition,然后core.img拷贝到这个分区。采用GPT方案有好处,不会使用MBR gap区域。本文中将描述第一种MBR方案,也就是当运行grub2-install命令,至少会做两件事情1) 拷贝boot.img到LBA-0的MBR引导代码中2) 拷贝core.img到LBA-1开始到LBA-31中的空闲代码中=深入研究mbr.bin=除了上面的,其实grub2-install还完成了其它的工作,有兴趣可以研究下,在这里进行一个额外的对比给大家看看:1) mbr.bin(我们已经在6.2MBR中使用DD命令导出的MBR)2) /boot/grub2/i386-pc/boot.img然后使用命令hexdump导出文件rootcontroller i386-pc# hexdump -Cv boot.img eb 63 90 00 00 00 00 00 00 00 00 00 00 00 00 00 |.c.| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |.| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |.| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |.| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |.| 00 00 00 00 00 00 00 00 00 00 00 80 01 00 00 00 |.| 00 00 00 00 ff fa eb 05 f6 c2 80 74 05 f6 c2 70 |.t.p| 74 02 b2 80 ea 79 7c 00 00 31 c0 8e d8 8e d0 bc |t.y|.1.| 00 20 fb a0 64 7c 3c ff 74 02 88 c2 52 be 05 7c |. .d|.t.R.| b4 41 bb aa 55 cd 13 5a 52 72 3d 81 fb 55 aa 75 |.A.U.ZRr=.U.u|a0 37 83 e1 01 74 32 31 c0 89 44 04 40 88 44 ff 89 |7.t21.D.D.|b0 44 02 c7 04 10 00 66 8b 1e 5c 7c 66 89 5c 08 66 |D.f.|f.f|c0 8b 1e 60 7c 66 89 5c 0c c7 44 06 00 70 b4 42 cd |.|f.D.p.B.|d0 13 72 05 bb 00 70 eb 76 b4 08 cd 13 73 0d 5a 84 |.r.p.v.s.Z.|e0 d2 0f 83 de 00 be 85 7d e9 82 00 66 0f b6 c6 88 |.f.|f0 64 ff 40 66 89 44 04 0f b6 d1 c1 e2 02 88 e8 88 |d.f.D.| f4 40 89 44 08 0f b6 c2 c0 e8 02 66 89 04 66 a1 |.D.f.f.| 60 7c 66 09 c0 75 4e 66 a1 5c 7c 66 31 d2 66 f7 |f.uNf.|f1.f.| 34 88 d1 31 d2 66 f7 74 04 3b 44 08 7d 37 fe c1 |4.1.f.t.;D.7.| 88 c5 30 c0 c1 e8 02 08 c1 88 d0 5a 8

温馨提示

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

评论

0/150

提交评论