GRUB2及啟動(dòng)過程詳解_第1頁(yè)
GRUB2及啟動(dòng)過程詳解_第2頁(yè)
GRUB2及啟動(dòng)過程詳解_第3頁(yè)
GRUB2及啟動(dòng)過程詳解_第4頁(yè)
GRUB2及啟動(dòng)過程詳解_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

GRUB2及啟動(dòng)過程詳解作者:南瓜剪子2016年7月28日TOC\o"1-3"\h\u142571.概述 2163962.CentOS7中GRUB2 291873.GRUB2的bootstrapimage文件 35993.1.boot.img 317983.2.diskboot.img 479403.3.kernel.img 446923.4.core.img 4159263.5.*.mod 4169084.對(duì)比GRUBLegacy 554464.1.stage1 5245284.2.*_stage1_5 5210514.3.stage2 5268365.grub2-mkimage定制core.img 6285956.GRUB2安裝 7323916.1.Linux是怎么命名設(shè)備(/dev/sda) 775246.2.MBR(MasterBootRecord) 8321736.3.MBR分區(qū)表DPT(DiskPartitionTable) 1024056.4.LBAandCHS 14304526.4.1.CHS(cylinders-heads-sectors) 14309286.4.2.LBA(LogicalBlockAddress) 14239516.5.boot.img和core.img安裝 15211306.6.硬盤總結(jié) 1890587.啟動(dòng)過程 1954237.1.BIOS 19306507.2.GRUB2中boot.img 20147077.2.1.Step1無條件跳轉(zhuǎn) 20175827.2.2.Step2初始化 20195767.2.3.Step3判斷硬盤是否支持LBA還是只支持CHS 22103947.2.4.Step4采用LBA加載core.img第一個(gè)扇區(qū) 23107287.2.5.Step5拷貝core.img第一個(gè)扇區(qū)到內(nèi)存指定位置 25215827.2.6.Step6執(zhí)行core.img第一條語句 27153227.2.7.Step7boot.img總結(jié) 27153427.3.GRUB2中core.img 2858237.3.1.diskboot.img 28142267.3.2.GRUB2coreStartup 34148367.3.3.GRUB主函數(shù)即GRUB主要功能 37230817.3.4.加載LinuxKernel 38168137.4.Linuxkernel 47143788.結(jié)束語 48320729.參考文獻(xiàn) 48概述計(jì)算機(jī)系統(tǒng)上電之后由固化到ROM中的BIOS(UEFI)進(jìn)行操作,然后導(dǎo)入硬盤MBR中BootLoader并調(diào)到其運(yùn)行,由BootLoader對(duì)操作系統(tǒng)內(nèi)核進(jìn)行加載,并將控制權(quán)交給操作系統(tǒng).下圖簡(jiǎn)單描述了CentOS7的啟動(dòng)過程(CentOS7使用GRUB2作為BootLoader):現(xiàn)在的BootLoader有很多類型,大致如下:對(duì)Linux來說GRUB2占據(jù)了統(tǒng)治地位對(duì)Windows來說Bootmgr/BCD占據(jù)了統(tǒng)治地位對(duì)Apple系統(tǒng)缺省的是BootX作為一名計(jì)算機(jī)工程師,了解BootLoader的原理是很重要。本文著重介紹GRUB2及其啟動(dòng)流程.讀完本文,相信讀者能夠?qū)ootLoader原理有一定深刻理解,并能大致知道其他BootLoader的作用.本文在介紹一些基本知識(shí)后,在第7章會(huì)引入基本的反匯編過程來講解GRUB2的啟動(dòng)流程,因?yàn)橹挥兄苯幼x代碼才能深入學(xué)習(xí)原理.需要讀者:-有一定的匯編語言知識(shí),如果讀者對(duì)匯編不敢興趣,可以跳過相關(guān)章節(jié)-同時(shí)也需要讀者有一定C語言知識(shí)本文稍微有點(diǎn)長(zhǎng),但都是作者本人的經(jīng)驗(yàn)總結(jié),如果靜下心讀完,相信對(duì)你會(huì)有幫助,相比其它GRUB一厚本書,能節(jié)約你很多時(shí)間。但由于作者水平有限,有不足之處忘諒解。CentOS7中GRUB2GRUB2是GNU下面的一個(gè)項(xiàng)目,有關(guān)其詳細(xì)信息,請(qǐng)參考官方網(wǎng)站:/software/grub/.相對(duì)于GRUB2,原先的GRUB(i.e.version0.9x)被稱為:GRUBLegacy.官網(wǎng)上說明:GRUBLegacyisnolongerbeingdeveloped.從1.x開始的新版本就稱為GRUB2(注意,雖然稱為GRUB2,但其版本號(hào)卻是從1.x開始1.99也是GRUB2).現(xiàn)在各種最新發(fā)行版本的Linux(包括CentOS7)都采用GRUB2.在CentOS7上可以查看安裝的GRUB2版本[root@controller~]#rpm-qa|grep"grub"grub2-2.02-0.34.el7.centos.x86_64在CentOS7下面/boot/grub2目錄可以看到有關(guān)GRUB2相關(guān)文件.在/boot/grub2/i386-pc目錄下是GRUB2bootstrapimages文件,該目錄大部分文件是以.mod結(jié)尾,這些文件為GRUB2模塊文件,最后在該目錄下面有以下兩個(gè)image文件:[root@controlleri386-pc]#ls-lrt*.img-rw-r--r--.1rootroot266187\u67081123:33core.img-rw-r--r--.1rootroot5127\u67081123:33boot.img以上兩個(gè)img文件都會(huì)被grub2-install命令安裝到硬盤上相應(yīng)位置(在硬盤什么位置后面會(huì)說),很有意思的是請(qǐng)注意兩點(diǎn)boot.img固定為512Bytecore.img小于32KByte如果你覺得好奇,可以用file命令查看這些image文件類型[root@controlleri386-pc]#fileboot.imgboot.img:x86bootsector;partition4:ID=0xd4,starthead205,startsector4277266767,0sectors,codeoffset0x63[root@controlleri386-pc]#filecore.imgcore.img:data[root@controlleri386-pc]#filexfs.modxfs.mod:ELF32-bitLSBrelocatable,Intel80386,version1(SYSV),notstripped對(duì)于boot.imgfile命令明確指出其為x86bootsector,而mod文件卻是ELF文件,接下來讓我們進(jìn)一步了解這些bootstrapimage文件GRUB2的bootstrapimage文件GRUB2有以下各種bootstrapimages文件,大伙應(yīng)悉知,這些image會(huì)被grub2-install安裝到硬盤相應(yīng)的位置,當(dāng)BIOS完成后,他們會(huì)被加載并引導(dǎo)系統(tǒng)繼續(xù)完成啟動(dòng).boot.img在PCBIOS系統(tǒng)中,這個(gè)image是GRUB2第一個(gè)被運(yùn)行的.它被寫在MBR(MasterBootRecord)或者在分區(qū)(partition)的bootsector中.因?yàn)镸BR或PCbootsector是固定512字節(jié),這個(gè)文件的大小也固定為512byte.boot.img功能很簡(jiǎn)單,主要是讀磁盤中core.img中的第一個(gè)扇區(qū)(sector)到內(nèi)存中并跳到該部分運(yùn)行(如果是硬盤啟動(dòng),那么該扇區(qū)就是下面要介紹的diskboot.img).因?yàn)橹挥?12字節(jié),boot.img不能夠加載文件系統(tǒng)(比如CentOS7中XFS或其它Linux的EXT4等等),并且只能是從硬盤固定的位置加載.diskboot.img當(dāng)從硬盤啟動(dòng)的時(shí)候這是core.img第一個(gè)扇區(qū)(sector)的內(nèi)容,主要功能是讀剩下的core.img到內(nèi)存中并開始運(yùn)行kernel.img.同樣diskboot.img沒有文件系統(tǒng)的功能(XFS,EXT4等),當(dāng)他讀取剩余的core.img時(shí)候,依然從硬盤固定位置讀取.根據(jù)啟動(dòng)的介質(zhì)不同,類似diskboot.img文件有很多,在安裝GRUB時(shí)候選用其中一個(gè),目前大部分都是從硬盤啟動(dòng)diskboot.imgcdboot.img:從CD-ROM啟動(dòng)pxeboot.img:從PXE網(wǎng)絡(luò)啟動(dòng)Lnxboot.img:如果從其他bootloader比如LILO(用image=’section)啟動(dòng),這個(gè)image使GRUB看上去像一個(gè)Linux內(nèi)核.kernel.img這個(gè)文件包含了GRUB2基本的運(yùn)行時(shí)支撐:對(duì)設(shè)備及文件的框架,環(huán)境變量,恢復(fù)模式下的命令行等等.一般我們不會(huì)直接使用它,但是它是core.img中必不可少的一部分.core.img這個(gè)是GRUB的核心.他是被grub2-mkimage命令生存,包含了kernel.img以及一些必須必要的modules.通常core.img包含了足夠的模塊(modules)為了訪問XFS/EXT4文件系統(tǒng)/boot/grub2目錄,并且在運(yùn)行時(shí)加載從文件系統(tǒng)(XFS)所有剩余的模塊,這些剩余模塊包含啟動(dòng)目錄處理,加載操作系統(tǒng)等等功能.模塊化的設(shè)計(jì)思路最主要的目的是使core.img保持足夠小,目前disk限制core.img安裝必須小于32KB.core.img一般被安裝在硬盤特殊區(qū)域:embeddingarea(夾層區(qū)),這個(gè)區(qū)一般有32K限制,我們?cè)诤竺鏁?huì)介紹什么是夾層區(qū).*.mod所有GRUB其他部分被稱為模塊,他們大部分被core.img在運(yùn)行時(shí)自動(dòng)動(dòng)態(tài)加載,其中一小部分被整合到core.img中,這小部分是必須,比如文件系統(tǒng)支持(xfs.mod)模塊可以手工加載,請(qǐng)參考insmodcommand(在本文不作介紹,請(qǐng)查閱相關(guān)文檔)注意:如果對(duì)以上各種image文件還是不清楚,請(qǐng)繼續(xù)往下讀,后面會(huì)有詳細(xì)說明。

對(duì)比GRUBLegacyGRUB2與GRUBLegacy不同,很多人都熟悉GRUBLegacy里面的stage1,stage1_5,stage2等等概念,而在GRUB2里面,這些被各種bootstrapimage文件替代:boot.imgdiskboot.imgcore.img大伙應(yīng)悉知以上三個(gè)imagesstage1GRUBLegacy中stage1相當(dāng)于GRUB2中boot.img,他們完成相同的功能.*_stage1_5GRUBLegacy中Stage1.5包含了足夠的文件系統(tǒng)(XFS或EXT4)代碼而允許Stage2從文件系統(tǒng)中直接載入系統(tǒng),就這個(gè)意義上來說很像GRUB2中的core.img.不過core.img功能更加強(qiáng)大,它提供了恢復(fù)shell,使能夠在不能加載其他模塊(modules)情況下(比如partitionnumber已經(jīng)改變)能夠人工恢復(fù)。Core.img能夠被靈活的創(chuàng)建,允許從LVM或者RAID加載模塊.GRUBLegacy能夠運(yùn)行stage1和stage2而不運(yùn)行stage1.5,但是對(duì)GRUB2來說,core.img是必須的。stage2GRUB2沒有對(duì)應(yīng)stage2的image.它從/boot/grub加載相應(yīng)的模塊。

grub2-mkimage定制core.img上一章介紹的core.img至少包含了一下幾個(gè)部分diskboot.imgkernel.imgrequired*.mod他們被grub2-mkimage命令整合成core.img文件,實(shí)際上當(dāng)運(yùn)行完該命令最終生成的是上一章中/boot/grub2/i386-pc目錄下的兩個(gè)image文件boot.imgcore.img有興趣的讀者請(qǐng)參照mangrub2-mkimage查閱相關(guān)信息,定制自己的core.img:[lanzhou@controllerimage]$grub2-mkimage-Oi386-pc-p/boot/grub2-v-ocore.imgxfsgrub2-mkimage:info:thetotalmodulesizeis0x26e4.grub2-mkimage:info:reading/usr/lib/grub/i386-pc/kernel.img.grub2-mkimage:info:locatingthesection.textat0x0.grub2-mkimage:info:locatingthesection.rodataat0x5494.grub2-mkimage:info:locatingthesection.dataat0x6448.grub2-mkimage:info:locatingthesection.bssat0x6bd0.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=0x2649700,kernel_size=0x6bd0.grub2-mkimage:info:thecoresizeis0x5085.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:writing0x200bytes.grub2-mkimage:info:writing0x5bc5bytes.core.img是內(nèi)核的名字,生成在當(dāng)前目錄下,i386-pc是鏡像的格式,xfs是加入內(nèi)核的模塊。常用模塊有:xfs:支持xfs文件系統(tǒng)(CentOS7缺省的文件系統(tǒng))ext2:支持ext2文件系統(tǒng)但是我們一般不直接運(yùn)行該命令,一般運(yùn)行g(shù)rub2-install.該命令會(huì)自動(dòng)調(diào)用grub2-mkimage.

GRUB2安裝當(dāng)一切準(zhǔn)備好后,我們可運(yùn)行以下命令grub2-install/dev/sda去安裝grub2(缺省的--boot-directory=/boot/)不過一般的CentOS7已經(jīng)安裝好了GRUB2,除非你感興趣,不用運(yùn)行上面命令.在繼續(xù)后面的內(nèi)容之前,下面有幾個(gè)概念大伙必須知道:Linux是怎么命名設(shè)備(/dev/sda)比如/dev/sda5,如下圖所示1)SCSI硬盤第一個(gè)SCSI接口硬盤:/dev/sda第二個(gè)SCSI接口硬盤:/dev/sdb2)USB如果只有一塊硬盤,那么第一個(gè)USB盤也可能是/dev/sdb(usb存儲(chǔ)設(shè)備也目前在內(nèi)核中在兩種驅(qū)動(dòng)方法,一種是模擬SCSI硬盤,另一種是非模擬SCSI硬盤,前一種目前比較多)3)SATA如果只有一個(gè)SATA硬盤,第一個(gè)SATA硬盤也是:/dev/sda4)IDE硬盤第一個(gè)IDE接口主盤:/dev/hda第一個(gè)IDE接口從盤:/dev/hdb第二個(gè)IDE接口主盤:/dev/hdc第二個(gè)IDE接口從盤:/dev/hdd注意:1)所以只靠/dev/sda無法知道設(shè)備類型,也許是SCSI,SATA或者U盤,但是一般來說/dev/sda都會(huì)是SCSI硬盤,本文不在詳述SCSI,IDE,SATA區(qū)別,請(qǐng)參考相關(guān)資料2)有關(guān)分區(qū),見下文6.3DPTMBR(MasterBootRecord)MBR,即主引導(dǎo)記錄,是對(duì)IBM兼容機(jī)的硬盤或者可移動(dòng)磁盤分區(qū)時(shí),在驅(qū)動(dòng)器最前端的一段引導(dǎo)扇區(qū),其地址為采用CHS尋址:MBR固定為硬盤的0柱面、0磁頭、1扇區(qū)采用LBA尋址:MBR固定LBA0(注意,我們將在后面介紹CHS與LBA,目前普片采用LBA尋址)MBR長(zhǎng)度為512字節(jié),它一般由三個(gè)部分組成:主引導(dǎo)程序硬盤分區(qū)表DPT(DiskPartitiontable)固定4個(gè)分區(qū),每分區(qū)16byte分區(qū)有效標(biāo)志,以55AA結(jié)尾的MBRStructureofaclassicalgenericMBRAddressDescriptionSize

(\o"Byte"bytes)\o"Hexadecimal"Hex\o"Decimal"Dec+000hex+0Bootstrapcodearea446+1BEhex+446Partitionentry1Partitiontable

(forprimarypartitions)16+1CEhex+462Partitionentry216+1DEhex+478Partitionentry316+1EEhex+494Partitionentry416+1FEhex+51055hexBootsignature[a]2+1FFhex+511AAhexTotalsize:446+4*16+2512本表摘自:/wiki/Master_boot_record注意1)由于后面支持EFI及GPT,上述結(jié)構(gòu)有些變化,但在本文不作描述,有興趣的讀者可以參看相關(guān)EFI及GPT文檔2)上文中的boot.img將會(huì)被grub2-install命令拷貝到MBR主引導(dǎo)程序部分(也就是Bootstrapcodearea),在后面將會(huì)詳細(xì)分析boot.img====================================================工具:導(dǎo)出并查看MBR====================================================我們可以用DD命令把MBR從硬盤中導(dǎo)出來[root@controllerimage]#ddif=/dev/sdaof=mbr.binbs=1count=512512+0recordsin512+0recordsout512bytes(512B)copied,0.00173968s,294kB/s然后我們可以使用hexdump查看其內(nèi)容[root@controllerimage]#hexdump-Cmbr.bin00000000eb6390108ed0bc00b0b800008ed88ec0|.c|00000010fbbe007cbf0006b90002f3a4ea210600|...|!..|0000002000bebe073804750b83c61081fefe0775|8.uu|00000030f3eb16b402b001bb007cb2808a74018b||...t..|000000404c02cd13ea007c0000ebfe0000000000|L||0000005000000000000000000000008001000000||0000006000000000fffa9090f6c2807405f6c270|t...p|000000707402b280ea797c000031c08ed88ed0bc|ty|..1|000000800020fba0647c3cff740288c252be057c|...d|<.t...R..||00000090b441bbaa55cd135a52723d81fb55aa75|.A..U..ZRr=..U.u|000000a03783e101743231c0894404408844ff89|7...t21..D.@.D..|000000b04402c7041000668b1e5c7c66895c0866|Df..\|f.\.f|000000c08b1e607c66895c0cc744060070b442cd|..`|f.\..D..p.B.|000000d0137205bb0070eb76b408cd13730d5a84|.r...p.vs.Z.|000000e0d20f83de00be857de98200660fb6c688|}...f|000000f064ff40668944040fb6d1c1e20288e888|d.@f.D|00000100f4408944080fb6c2c0e80266890466a1|.@.Df..f.|00000110607c6609c0754e66a15c7c6631d266f7|`|f..uNf.\|f1.f.|000001203488d131d266f774043b44087d37fec1|4..1.f.t.;D.}7..|0000013088c530c0c1e80208c188d05a88c6bb00|..0Z|00000140708ec331dbb80102cd13721e8cc3601e|p..1r...`.|00000150b900018edb31f6bf00808ec6fcf3a51f|1|0000016061ff265a7cbe807deb03be8f7de83400|a.&Z|..}}.4.|00000170be947de82e00cd18ebfe475255422000|..}GRUB.|0000018047656f6d0048617264204469736b0052|Geom.HardDisk.R|0000019065616400204572726f720d0a00bb0100|ead.Error|000001a0b40ecd10ac3c0075f4c3000000000000|<.u|000001b00000000000000000a736080000008020|6|000001c0210083dd1e3f0008000000a00f0000dd|!?|000001d01f3f8efeffff00a80f000058f0000000|.?X|000001e000000000000000000000000000000000||000001f0000000000000000000000000000055aa|U.|00000200黑色部分為啟動(dòng)代碼藍(lán)色部分為分區(qū)表DPT(下面會(huì)介紹)紅色部分為分區(qū)有效標(biāo)志55AAMBR分區(qū)表DPT(DiskPartitionTable)DPT作為MBR中的一部分,已經(jīng)使用了好長(zhǎng)一段時(shí)間,直到最近GPT及EFI的出現(xiàn)。但是DPT作為一個(gè)經(jīng)典,還是有很多東西學(xué)習(xí),在這一章我簡(jiǎn)要介紹一下DPT.====================================================工具:fdisk====================================================linux上經(jīng)典的工具fdisk就是對(duì)有關(guān)的DPT進(jìn)行操作。[root@controllersbin]#fdisk-l/dev/sdaDisk/dev/sda:8589MB,8589934592bytes,6777216sectorsUnits=sectorsof1*512=512bytesSectorsize(logical/physical):512bytes/512bytesI/Osize(minimum/optimal):512bytes/512bytesDisklabeltype:dosDiskidentifier:0x000836a7DeviceBootStartEndBlocksIdSystem/dev/sda1*2048102604751200083Linux/dev/sda210260481677721578755848eLinuxLVM可以看到我的CentOS7上面/dev/sda這個(gè)SCSI硬盤包含了兩個(gè)分區(qū):sda1,sda2注意其中sda1從2048sector(LBA2048)開始我們說了MBR在第一個(gè)sector,所有第一個(gè)分區(qū)sda1不能從0sector開始從很早前dos,第一個(gè)分區(qū)只能從LBA64開始,而從LBA2048開始是為了2011年后采用高級(jí)格式化的硬盤4k分區(qū)對(duì)齊fdisk輸出單位:1block=1024bytes=2sectors1sector=512bytes====================================================DPT解析====================================================如果把上一章6.2MBR中導(dǎo)出的mbr.binHEX中的DPT對(duì)比查看partition1:8020210083dd1e3f0008000000a00f00partition2:00dd1f3f8efeffff00a80f000058f000partition3:00000000000000000000000000000000partition4:00000000000000000000000000000000對(duì)照下面兩張表翻譯過來引導(dǎo)標(biāo)志分區(qū)類型起始扇區(qū)總扇區(qū)partition10x80(活動(dòng))0x83(Linux)0x0800(2048sectors)0xfa000(1024000sectors)partition10x000x8e(LinuxLVM)0x0fa800(1026048sectors)0xf05800(15751168sectors)與fdisk輸出完全一致====================================================DPT編碼====================================================DPT中各自段意義MBR偏移偏移長(zhǎng)度含義0x01BE0x001Byte引導(dǎo)標(biāo)志(BootIndicator):指明該分區(qū)是否是活動(dòng)分區(qū)0x01BF0x011Byte起始磁頭(StartHead)0x01C00x026位起始扇區(qū)(StartSector):只用0~5位,后面兩位被起始柱面使用0x01C10x0310位起始柱面(StartCylinder):共10位,最大值10230x01C20x041Byte分區(qū)類型描述(PartitionTypeIndicator),分區(qū)類型0x01C30x051Byte結(jié)束磁頭(EndHead)0x01C40x066位結(jié)束扇區(qū)(EndSector):只用0~5位,后面兩位被結(jié)束柱面使用0x01C50x0710位結(jié)束柱面(EndCylinder):共10位,最大值10230x01C60x084Byte本分區(qū)之前使用的扇區(qū)數(shù)(SectorsPrecedingPartition)0x01CA0x0C4Byte本分區(qū)的總扇區(qū)數(shù)(Sectorsinpartition)分區(qū)類型描述(PartitionTypeIndicator)代碼類型0x00Dos或Windows不允許使用,視為非法0x01FAT120x02XENIXroot0x03XENIXusr0x04FAT16小于32MB0x05Extended0x06FAT16大于32MB0x08AIX0x09AIXbootable0x0AOS/2BootManage0x0BWindows95FAT320x0CWindows95FAT320x0EWindows95FAT160x0FWindows95Extended(>8GB)0x10OPUS0x11HiddenFAT120x12Compaqdiagnost0x14HiddenFAT16<32M0x16HiddenFAT160x17HiddenHPFS/NTFS0x18ASTWindowsswap0x1BHiddenFAT320x1CHiddenFAT32partition(UsingLBA-modeINT13extensions)0x1EHiddenLBAVFATpartition0x24NECDOS0x3CPartitionMagic0x40Venix802860x41PPCPrePBoot0x42SFS0x4DQNX4.x0x4EQNX4.x2ndpart0x4FQNX4.x3rdpart0x50OnTrackDM0x51OnTrackDM6Aux0x52CP/M0x53OnTrackDM6Aux0x54OnTrackDM60x55EZ-Drive0x56GoldenBow0x5CPriamEdisk0x61SpeedStor0x63GNUHURDorSys0x64NovellNetware0x65NovellNetware0x70DiskSecureMult0x75PC/IX0x80OldMinix0x81Minix/OldLinux0x82Linuxswap0x83Linux0x84OS/2hiddenC:0x85LinuxExtended0x86NTFSvolumeSet0x87NTFSvolumeSet0x8eLinuxLVM0x93Amoebba0x94AmoebbaBBT0xA0IBMThinkpadhidden0xA5BSD/3860xA6OpenBSD0xA7NextSTEP0xB7BSDIfs0xB8BSDIswap0xC0DR-DOS/NovellDossecuredpartition0xC1DR-DOS/sec0xC4DR-DOS/sec0xC6DR-DOS/sec0xC7Syrinx0xDBCP/M/CTOS0xE1DOSaccess0xE3DOSR/00xE4SpeedStor0xEBBeOSfs0xF1SpeedStor0xF2DOS3.3+secondarypartition0xF4SpeedStor0xFELANStep0xFFBBT采用DPT同一塊硬盤可以安裝多種文件系統(tǒng)而互不影響====================================================擴(kuò)展分區(qū)====================================================按照DPT中要求,linux最多限制有4個(gè)主分區(qū)1)也就是你可以把硬盤分為4個(gè)主分區(qū)/dev/sda1(主分區(qū))/dev/sda2(主分區(qū))/dev/sda3(主分區(qū))/dev/sda4(主分區(qū))如果需要把硬盤分為多4個(gè)分區(qū),那么必須使用擴(kuò)展分區(qū),擴(kuò)展分區(qū)做多1個(gè),在擴(kuò)展分區(qū)下面在設(shè)立若干個(gè)邏輯分區(qū):/dev/sda1(主分區(qū))/dev/sda2(主分區(qū))/dev/sda3(擴(kuò)展分區(qū))/dev/sda5(邏輯分區(qū))/dev/sda6(邏輯分區(qū))/dev/sda7(邏輯分區(qū))注意:擴(kuò)展分區(qū)的分區(qū)類型描述(PartitionTypeIndicator)為0x85邏輯分區(qū)并不是從sda4開始,sda4固定分配給主分區(qū)

LBAandCHS關(guān)于硬盤的尋址與定位有兩種方式:CHS是24位尋址,LBS是可以支持64位尋址CHS(cylinders-heads-sectors)CHS尋址模式將硬盤劃分為磁頭(Heads)、柱面(Cylinder)、扇區(qū)(Sector)。柱面(Cylinder):所有磁片中半徑相同的同心磁道構(gòu)成“柱面",意思是這一系列的磁道垂直疊在一起,就形成一個(gè)柱面的形狀。簡(jiǎn)單地理解,柱面數(shù)=磁道數(shù)。磁頭(Heads):每張磁片的正反兩面各有一個(gè)磁頭,一個(gè)磁頭對(duì)應(yīng)一張磁片的一個(gè)面。因此,用第幾磁頭就可以表示數(shù)據(jù)在哪個(gè)磁面。扇區(qū)(Sector):將磁道劃分為若干個(gè)小的區(qū)段,就是扇區(qū)。雖然很小,但實(shí)際是一個(gè)扇子的形狀,故稱為扇區(qū)。每個(gè)扇區(qū)的容量為512字節(jié)。知道了磁頭數(shù)、柱面數(shù)、扇區(qū)數(shù),就可以很容易地確定數(shù)據(jù)保存在硬盤的哪個(gè)位置。也很容易確定硬盤的容量,其計(jì)算公式是:硬盤容量=磁頭數(shù)×柱面數(shù)×扇區(qū)數(shù)×512字節(jié)CHS限制1:BIOSINT13h接口柱面地址10位 1024磁頭地址8位 256扇區(qū)地址6位 63(扇區(qū)從1開始,并不是從0開始)共24位的尋址方式,最大硬盤空間8GBCHS限制2:IDE(ATA)柱面地址16位 65536磁頭地址4位 16扇區(qū)地址6位 63共24位的尋址方式,最大硬盤空間127.5GBCHS目前基本上不再使用,由于24位尋址空間的局限太大,目前普片采用LBA方式采用CHS尋址,MBR地址為0柱面、0磁頭、1扇區(qū)LBA(LogicalBlockAddress)LBA是非常單純的一種尋址模式﹔從0開始編號(hào)來定位區(qū)塊,第一區(qū)塊LBA=0,第二區(qū)塊LBA=1,依此類推。這種尋址模式取代了原先操作系統(tǒng)必須面對(duì)存儲(chǔ)設(shè)備硬件構(gòu)造的方式。最具代表性的首推CHS(cylinders-heads-sectors,磁柱-磁頭-扇區(qū))尋址模式LBA最大的好處能偷突破CHS24bit限制,老式設(shè)備支持28bitLBA,新設(shè)備一般支持48bitLBA采用LBA尋址,MBR地址為L(zhǎng)BA-0boot.img和core.img安裝在了解上面的基礎(chǔ)知識(shí)后,在回到我們的GRUB2,我們知道boot.img將會(huì)拷貝到MBR,也就是LBA-0的位置,那么core.img將會(huì)被放置在什么地方?MBR與GPT有不同解決方案:請(qǐng)參考/software/grub/manual/grub.html#BIOS-installationMBR在MBR和第一個(gè)partition之間有一段空白磁盤空間。大伙還記得5.3DPT中fdisk命令查看第一個(gè)分區(qū)的位置從2048sector(LBA2048)開始,那么前面之一段都是空白。這個(gè)空白磁盤空間有各種名稱"boottrack","MBRgap","embeddingarea",但是有至少必須32Kbyte,一般來說core.img將會(huì)被拷貝到這個(gè)區(qū)域中2)GPTGPT作為UEF的一部分,也能夠被使用在BIOS平臺(tái)上,但是必須得有一個(gè)專門的GPT分區(qū),這個(gè)分區(qū)至少32KB大小,建議1M,名字為BIOSBootPartition,然后core.img拷貝到這個(gè)分區(qū)。采用GPT方案有好處,不會(huì)使用"MBRgap"區(qū)域。本文中將描述第一種MBR方案,也就是當(dāng)運(yùn)行g(shù)rub2-install命令,至少會(huì)做兩件事情拷貝boot.img到LBA-0的MBR引導(dǎo)代碼中拷貝core.img到LBA-1開始到LBA-31中的空閑代碼中====================================================深入研究mbr.bin====================================================除了上面的,其實(shí)grub2-install還完成了其它的工作,有興趣可以研究下,在這里進(jìn)行一個(gè)額外的對(duì)比給大家看看:mbr.bin(我們已經(jīng)在6.2MBR中使用DD命令導(dǎo)出的MBR)/boot/grub2/i386-pc/boot.img然后使用命令hexdump導(dǎo)出文件[root@controlleri386-pc]#hexdump-Cvboot.img00000000eb639000000000000000000000000000|.c|0000001000000000000000000000000000000000||0000002000000000000000000000000000000000||0000003000000000000000000000000000000000||0000004000000000000000000000000000000000||0000005000000000000000000000008001000000||0000006000000000fffaeb05f6c2807405f6c270|t...p|000000707402b280ea797c000031c08ed88ed0bc|ty|..1|000000800020fba0647c3cff740288c252be057c|...d|<.t...R..||00000090b441bbaa55cd135a52723d81fb55aa75|.A..U..ZRr=..U.u|000000a03783e101743231c0894404408844ff89|7...t21..D.@.D..|000000b04402c7041000668b1e5c7c66895c0866|Df..\|f.\.f|000000c08b1e607c66895c0cc744060070b442cd|..`|f.\..D..p.B.|000000d0137205bb0070eb76b408cd13730d5a84|.r...p.vs.Z.|000000e0d20f83de00be857de98200660fb6c688|}...f|000000f064ff40668944040fb6d1c1e20288e888|d.@f.D|00000100f4408944080fb6c2c0e80266890466a1|.@.Df..f.|00000110607c6609c0754e66a15c7c6631d266f7|`|f..uNf.\|f1.f.|000001203488d131d266f774043b44087d37fec1|4..1.f.t.;D.}7..|0000013088c530c0c1e80208c188d05a88c6bb00|..0Z|00000140708ec331dbb80102cd13721e8cc3601e|p..1r...`.|00000150b900018edb31f6bf00808ec6fcf3a51f|1|0000016061ff265a7cbe807deb03be8f7de83400|a.&Z|..}}.4.|00000170be947de82e00cd18ebfe475255422000|..}GRUB.|0000018047656f6d0048617264204469736b0052|Geom.HardDisk.R|0000019065616400204572726f720d0a00bb0100|ead.Error|000001a0b40ecd10ac3c0075f4c3000000000000|<.u|000001b000000000000000000000000000002412|$.|000001c00f090052bebd7d31c0cd13468a0c84c9|...R..}1...F|000001d0750fbeda7de8ccffeb96466c6f707079|u...}Floppy|000001e000bb00708ec331dbb80102b500b600cd|...p..1|000001f01372d4b601b54fe9f1fe0000000055aa|.rOU.|00000200然后可以文本比較工具進(jìn)行比較,貼圖如下,左邊是/boot/grub2/i386-pc/boot.img大致有四處不同1)0x0003~0x0040,/boot/grub2/i386-pc/boot.img全為0,在真正的磁盤MBR中,被grub2-install填入了必要的數(shù)據(jù)。注意:0x0000~0x0002為eb6360匯編為jmpshort0x0067,中間這部分被grub2-insall裝填部分?jǐn)?shù)據(jù),暫時(shí)不知道是為什么使用2)0x0066~0x0067,/boot/grub2/i386-pc/boot.img為eb05,被grub2-install修改為909090為nop指令,這里修改了兩個(gè)nop指令3)0x01b8~0x01bb,/boot/grub2/i386-pc/boot.img00000000,被grub2-install修改為a7360800,這部分代碼請(qǐng)參考/wiki/Master_boot_record其中的StructureofamodernstandardMBR,我拷貝到這里作參考被修改的這4個(gè)Byte[a7360800]為32bitDiskSignature,它是可選的,我想可能是為了UEFI使用。4)0x01be~0x01fd,DPT硬盤分區(qū)表部分,保持不變grub2-install不會(huì)去修改如果大家有興趣可以去研究代碼,知道grub2-install還有很多工作,這里就不在描述。硬盤總結(jié)一塊SCSI硬盤邏輯結(jié)構(gòu)簡(jiǎn)單來說如下圖所示:LBA0:固定存儲(chǔ)MBR,一般GRUB2的boot.img就存放在這里L(fēng)BA1~LBA2047:被稱為“EmbeddingArea”“MBRGap”,一般GRUB2的core.img就存放這里L(fēng)BA2048后面為我的兩個(gè)硬盤分區(qū),他們放在連續(xù)的區(qū)域

啟動(dòng)過程在前面介紹相關(guān)的知識(shí),咱們回歸到主題,現(xiàn)在開始啟動(dòng)過程BIOS系統(tǒng)上電之后,由固化在ROM里面的BIOS代碼運(yùn)行,進(jìn)行硬件檢查及初始化工作。有關(guān)BIOS具體運(yùn)行原理在這里不作描述,有興趣的請(qǐng)參考相關(guān)書籍。最近的EFI作為BIOS的替代或升級(jí),支持更多的功能,在這里也不做描述。BIOS運(yùn)行的最后兩步操作我們必須知道加載LBA-0(或者CHS的0柱面、0磁頭、1扇區(qū))的MBR,共512字節(jié)到內(nèi)存中0x7C00位置從內(nèi)存0x7C00位置運(yùn)行我們知道拷貝到MBR中的正式GRUB2boot.img,從這個(gè)時(shí)候開始,GRUB2正式登上歷史舞臺(tái)。但是請(qǐng)注意,并不是說BIOS就全部退出舞臺(tái),BIOS依然為GRUB2提供底層服務(wù),比如硬盤讀取等等(通過BIOSINT13功能),GRUB2在一窮二白基礎(chǔ)上還離不開BIOS============================================地址0x7C00============================================這里有個(gè)問題,為什么BIOS會(huì)加載MBR到0x7C00的位置,而不是其他的位置?答案請(qǐng)參考:/questions/2058690/what-is-significance-of-memory-at-00007c00-to-booting-sequence這個(gè)問題是應(yīng)該由最初的IBMPCBIOS的設(shè)計(jì)者們(軟件及硬件)來回答,但是簡(jiǎn)單的答案可能是0x7C00是距離地下最初32K安裝內(nèi)存有1K大小(512Bytes給MBR以及另外的512Bytes作運(yùn)行時(shí)堆棧使用)

GRUB2中boot.imgBIOS加載MBR到0x7C00并從該處運(yùn)行的時(shí)候,實(shí)際上就是boot.img開始運(yùn)行了,我們的工作來了,我們將介紹boot.img將要干什么,可以從官方網(wǎng)站/software/grub/.去使用git下載源碼,源碼是采用AT&T風(fēng)格的匯編。這里我們采用反匯編的方式取得Intel風(fēng)格代碼我們已經(jīng)在6.2MBR中使用DD命令導(dǎo)出的MBR安裝nasm[root@controlleri386-pc]#yuminstallnasmLoadedplugins:fastestmirror,langpacksLoadingmirrorspeedsfromcachedhostfile*base:*extras:*updates:Packagenasm-2.10.07-7.el7.x86_64alreadyinstalledandlatestversionNothingtodo進(jìn)行反匯編[root@controllerimage]#ndisasm-o0x7c00mbr.bin>mbr.asm這里加入-o0x7c00是告訴反匯編器這段代碼在0x7c00處運(yùn)行,使生成的mbr.asm更加容易理解在這里我把反匯編的代碼mbr.asm作為附件供參考,后面的boot.S是官方源碼:注意:boot.S是AT&T匯編語法,反編譯的mbr.asm是Intel匯編語法,兩者有區(qū)別,如果感興趣,請(qǐng)參閱相關(guān)文檔進(jìn)行學(xué)習(xí)。下面詳細(xì)講解主要流程。Step1無條件跳轉(zhuǎn)/*位于0x7C00的語句就是一條跳轉(zhuǎn)語句,跳轉(zhuǎn)到0x7c65處*/00007C00EB63jmpshort0x7c65Step2初始化/*禁止中斷目前是不安全的*/00007C65FAcli00007C6690nop00007C6790nop/**注意,BIOS在把控制權(quán)交給MBR前,會(huì)在DL中設(shè)置正確的Bit位,表明MBR來源*DL=00h1stfloppydisk(“driveA:”)*DL=01h2ndfloppydisk(“driveB:”)*DL=80h1stharddisk*DL=81h2ndharddisk*因?yàn)槲覀兪谴疟P加載的MBR,所以我們dl里面存的是0x80。*下面這段應(yīng)為來自官方源代碼注釋*ThisisaworkaroundforbuggyBIOSeswhichdon'tpassboot*drivecorrectly.IfGRUBisinstalledintoaHDD,checkif*DLismaskedcorrectly.Ifnot,assumethattheBIOSpassed*abogusvalueandsetDLto0x80,sincethisistheonly*possiblebootdrive.IfGRUBisinstalledintoafloppy,*thisdoesnothing(onlyjump).*意思是有些BIOS類型并沒有正確的設(shè)置DL寄存器,我們檢測(cè)是否DL置了0x80bit位*如過不是,我們手工設(shè)置為DL為0x80*注意test相當(dāng)于用and(位與)判斷,實(shí)際上是測(cè)試Bit位是否被置上*/00007C68F6C280testdl,0x8000007C6B7405jz0x7c72/*如果DL不在區(qū)間0-0x0fand0x80-0x8f.那么需要設(shè)置DL為0x80*如果DL在區(qū)間0x10-0x7f,那么不需要設(shè)置DL為0x80*/00007C6DF6C270testdl,0x7000007C707402jz0x7c7400007C72B280movdl,0x8000007C74EA797C0000jmpword0x0:0x7c79/*ax清零,ds賦值0,ss賦值0*/00007C7931C0xorax,ax00007C7B8ED8movds,ax00007C7D8ED0movss,ax/*設(shè)置堆棧:設(shè)置了實(shí)模式下的堆棧段地址(棧頂位置)0x2000*/00007C7FBC0020movsp,0x2000/*恢復(fù)中斷再次安全*/00007C82FBsti/*從內(nèi)存0x7c64讀入AL,在0x7c64,我們值為0xFF,比較兩個(gè)數(shù)為相等*那么不執(zhí)行0x7c8a*這里只是檢查我們是否有forceddiskreference*/00007C83A0647Cmoval,[0x7c64]00007C863CFFcmpal,0xff00007C887402jz0x7c8c00007C8A88C2movdl,alStep3判斷硬盤是否支持LBA還是只支持CHS/*在前面我們介紹了CHS及LBA,這兩種對(duì)硬盤讀尋址有很大不同*在加載后續(xù)GRUB2core.img的前,我們必須判斷硬盤是否支持LBA還是只支持CHS*//*savedrivereferencefirstthing!*/00007C8C52pushdx/*set%sitothediskaddresspacket*/00007C8DBE057Cmovsi,0x7c05/*調(diào)用BIOSINT13功能,檢查硬盤是否支持LBA*通過BIOS調(diào)用INT0x13來確定是否支持?jǐn)U展,LBA擴(kuò)展功能分兩個(gè)子集,如下:第一個(gè)子集提供了訪問大硬盤所必須的功能,包括:****************************************************************1.檢查擴(kuò)展是否存在:ah=41h,bx=0x55aa,dl=drive(0×80~0xff)2.擴(kuò)展讀:ah=42h3.擴(kuò)展寫:ah=43h4.校驗(yàn)扇區(qū):ah=44h5.擴(kuò)展定位:ah=47h6.取得驅(qū)動(dòng)器參數(shù):ah=48h****************************************************************第二個(gè)子集提供了對(duì)軟件控制驅(qū)動(dòng)器鎖定和彈出的支持,包括:****************************************************************1.檢查擴(kuò)展:ah=41h2.鎖定/解鎖驅(qū)動(dòng)器:ah=45h3.彈出驅(qū)動(dòng)器:ah=46h4.取得驅(qū)動(dòng)器參數(shù):ah=48h5.取得擴(kuò)展驅(qū)動(dòng)器改變狀態(tài):ah=49h****************************************************************我們采用的是ah=41h,bx=0x55aa,dl=0x80,所以是檢查擴(kuò)展是否存在。這個(gè)操作會(huì)改變CF標(biāo)志位的值。如果支持LBA,那么CF=0,否則CF=1。*/00007C90B441movah,0x4100007C92BBAA55movbx,0x55aa00007C95CD13int0x13/**%dlmayhavebeenclobberedbyINT13,AH=41H.*Thishappens,forexample,withASTBIOS1.04.*/00007C975Apopdx00007C9852pushdx/**下面的三個(gè)跳轉(zhuǎn)語句都到0x7cd8位置,那個(gè)位置是CHS部分*有下面幾種情況*1)探查結(jié)果CF=1(0x7c99jc0x7cd8),二話不說,跳轉(zhuǎn)到CHS模式*2)CF=0是否就采用LBA呢?也不一定,還需要判斷bx==0x55aa,如果不等則CHS模式*3)有一個(gè)FORCE_LBAByte(INT13返回寄存器cx中),如果這個(gè)位是1,那么直接采用LBAMODE*/00007C99723Djc0x7cd800007C9B81FB55AAcmpbx,0xaa5500007C9F7537jnz0x7cd800007CA183E101andcx,byte+0x100007CA47432jz0x7cd8/*由于現(xiàn)在硬盤都是LBA模式,這里我們就不在對(duì)CHS模式介紹了,直接進(jìn)入LBA*/Step4采用LBA加載core.img第一個(gè)扇區(qū)/*對(duì)于BIOSLBA讀來說,最重要的是設(shè)置SI所在內(nèi)存塊的值由si及其偏移量指向的內(nèi)存保存著磁盤參數(shù)塊SI在上面7.2.3中被設(shè)置為0x7c05,根據(jù)下面的偏移量來設(shè)置如下:******************************************************************偏移 地址 大小 位數(shù) 描述 值00h 0x7c05 BYTE 8 數(shù)據(jù)塊的大小(10hor18h) 0x1001h 0x7c06 BYTE 8 保留,必須為0 0x0002h 0x7c07 WORD 16 傳輸數(shù)據(jù)塊數(shù),傳輸完成后保存?zhèn)鬏數(shù)膲K數(shù) 0x0104h 0x7c09 DWORD 32 傳輸時(shí)的數(shù)據(jù)緩存地址 0x7000:[0x0000]08h 0x7c0d QWORD 64 起始絕對(duì)扇區(qū)號(hào)(即起始扇區(qū)的LBA號(hào)碼)0x01******************************************************************下面的很多代碼都是在初始化SI所指向的內(nèi)存注意[si+0x4]表示的是segment:offsetpointertothememorybuffertowhichsectorswillbetransferred(notethatx86is\o"Little-endian"little-endian:ifdeclaringthesegmentandoffsetseparately,theoffsetmustbedeclaredbeforethesegment)*//*下面這個(gè)首先把內(nèi)存中si+0x4的位置,傳輸數(shù)據(jù)時(shí)的數(shù)據(jù)緩存地址*也就是0x7c09~0x7c0a16bit置為0*/00007CA631C0xorax,ax00007CA8894404mov[si+0x4],ax/*AX現(xiàn)在值為0x0001*/00007CAB40incax/*setthemodetonon-zero也就是把內(nèi)存[si-1]0x7c04的值置為1*(也就是mode被置1,表示LBA擴(kuò)展讀;如果是0,就是CHS尋址讀)*/00007CAC8844FFmov[si-0x1],al/*把內(nèi)存0x7c07-0x7c0816bit的值置為1*也就是需要傳輸數(shù)據(jù)塊數(shù),這里我們將要傳輸core.img中第一個(gè)扇區(qū)*/00007CAF894402mov[si+0x2],ax/*thesizeandthereservedbyte*把內(nèi)存0x7c05的值置為0x10(固定)*把內(nèi)存0x7c06的值置為0x00(固定)*/00007CB2C7041000movword[si],0x10/*theabsoluteaddress起始絕對(duì)扇區(qū)號(hào)(即起始扇區(qū)的LBA-1號(hào)碼)0x7c0d~0x7c1132bit:內(nèi)存0x7c5c值為010000000x7c12~0x7c1532bit:內(nèi)存0x7c60值為00000000*最后就是制定LBA地址為L(zhǎng)BA1,也就是第二個(gè)扇區(qū),在前面我么說了這個(gè)/00007CB6668B1E5C7Cmovebx,[0x7c5c]00007CBB66895C08mov[si+0x8],ebx00007CBF668B1E607Cmovebx,[0x7c60]00007CC466895C0Cmov[si+0xc],ebx/*thesegmentofbufferaddress傳輸時(shí)的數(shù)據(jù)緩存地址*也就是0x7c0b~0x7c0c16bit置為0x7000*0x7c09~0x7c0a16bit置為在前面已經(jīng)被置為0*數(shù)據(jù)緩存地址為:0x7000:[0x0000]*注意0x7000為段地址,偏移為0x0000,實(shí)際物力地址將是0x70000*/00007CC8C744060070movword[si+0x6],0x7000/**調(diào)用BIOS功能"INT0x13Function0x42"*從硬盤讀指定扇區(qū)到內(nèi)存中*參數(shù)如下 %ah=0x42(在上面一節(jié)中2.擴(kuò)展讀:ah=42h)* %dl=drivenumber(在7.2.2中已經(jīng)被置為0x80)* %ds:%si=segment:offsetofdiskaddresspacket* (DS在7.2.2中已經(jīng)被初始化為0,SI在上面被置為0x7c05)*返回:* %al=0x0成功;errcodeonfailure*/00007CCDB442movah,0x4200007CCFCD13int0x13/*LBA擴(kuò)展讀失敗,可能不支持LBA,跳轉(zhuǎn)采用CHS方式*/00007CD17205jc0x7cd8/*進(jìn)入下一步,準(zhǔn)備拷貝剛讀入的core.img第一個(gè)扇區(qū)數(shù)據(jù)到指定位置*/00007CD3BB0070movbx,0x700000007CD6EB76jmpshort0x7d4e/*總結(jié),上面這段這么多的匯編代碼就是完成一個(gè)功能:調(diào)用BIOSINT14ah=0x42把硬盤LBA-1的512字節(jié)傳輸?shù)絻?nèi)存0x7000:[0x0000]位置注意:0x7000:[0x0000]實(shí)際上是段地址:[段內(nèi)偏移]實(shí)際地址為0x70000*/Step5拷貝core.img第一個(gè)扇區(qū)到內(nèi)存指定位置/**Weneedtosave%cxand%sibecausethestartupcodein*kernelusesthemwithoutinitializingthem.*/00007D4E60pushaw00007D4F1Epushds/*循環(huán)256次:0x100*/00007D50B90001movcx,0x100/*bx在上面被置為0x7000,也就是從硬盤拷貝過來的地址*/00007D538EDBmovds,bx00007D5531F6xorsi,si/*di是我們目標(biāo)地址0x8000,也就是core.img要從這個(gè)位置開始執(zhí)行*/00007D57BF0080movdi,0x8000/*初始化es為0*/00007D5A8EC6moves,si/*重復(fù)前固定操作,清除

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論