程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 匯編語言 >> 自己編程實現多引導

自己編程實現多引導

編輯:匯編語言

如果你是一個計算機用戶相信你一定安裝過操作系統,當你用久了一個操作系統,你可能會安裝一個新的操作系統,但你往往希望保留現在的操作系統。比如當你有了一個windows98,你可以在上面再安裝windows2K或是windowsXP,這是因為Windows的NTloader可以認識比自己更早的操作系統,所以能夠給你保留先前的操作系統。但是如果你現在已經擁有了一個windows2K或是windowsXP你要在硬盤上再裝個WINDOWS98甚至一些懷舊派人士想在上面安裝一個DOS6.22,此時又該怎麼辦呢?你往往會用到第三方軟件,比如V communications,.inc的System Commander系列,PowerQuest Corporration的BootMagic等等都是很好的選擇。這些軟件的將硬盤分區設置為兩個或是兩個以上的主分區,(也就是我們所說的雙“C”盤,或是多“C”盤),把不同的操作系統安裝到不同的主分區,通過激活不同的分區來實現多重引導,其優點是安全穩定,一旦一個操作系統癱瘓,一點不影響其他操作系統,個人認為值得推薦。

本文不是一篇多操作系統實現的經驗介紹,因此有關BootMagic等第三方軟件的使用我就不再浪費篇幅來介紹,我要給大家分析的是此類軟件的實現原理。

要了解其實現原理,首先你必須對硬盤的總體結構有一定的了解,如果你對其結構不了解可參照表1。

表1:

名稱備注

1主引導扇區(Master boot sector)占用一個扇區

2第一個主分區的引導扇區(Boot sector)占用一個扇區

3第一個主分區的FAT區占用空間由磁盤大小和FAT類型來定

4第一個分區的根目錄區存放分區根目錄

5第一個分區數據區用來存放各種數據

6…

7擴展分區表 占用一個扇區

8第一個擴展分區的引導扇區占用一個扇區

9第一個擴展分區的FAT區占用空間由磁盤大小和FAT類型來定

10第一個擴展分區的根目錄區存放分區根目錄

11第一個擴展分區的數據區用來存放各種數據

12…

注意:該表以空間順序進行描述,一個硬盤允許最多四個主分區和多個擴展分區

我們還需要了解主引導扇區(Master boot sector)的結構,它是硬盤的第一個扇區, 由主引導程序(MasterBoot Record簡稱MBR),硬盤分區表(Disk Partition Table簡稱DPT )和結束標識三部分組成。其結構如表2。

表2:

在主引導扇區中的位置名稱備注

1偏移 00H~1BDH主引導程序占446個字節,但實際可能並未用滿

2偏移1BEH~1FDH硬盤主分區表占64個字節,每個分區項占16個字節,最多可有4個分區項:1BEH~1CDH 分區項11CEH~1DDH 分區項21DBH~1EDH 分區項31EFH~1FDH 分區項4

3偏移1FEH~1FFH結束標識占2個字節,用來判斷分區表的有效性

主引導程序我在此就不分析了,需要注意的是在主引導程序中有一些出錯信息,一些引導型病毒往往會覆蓋這些信息來將自己嵌入到主引導程序中去,並將主引導程序開始的幾個字節改為一條跳轉指令,通過觀察主引導程序的變化,往往可以讓我們看出自己的電腦是否有引導型病毒,一旦發現異常,我們可以用FDISK/MBR命令來覆蓋原有的MBR。結束標識的兩個字節總是55H AAH,該標識只是用於判斷這個扇區是否是有效的主引導扇區,如果主引導程序發現沒有這個結束標識,將會認為操作系統丟失,並顯示“Missing Operating System”。

我們最後要了解的是硬盤分區表,多重引導軟件一般都是通過修改分區表中的特定字節達到多重引導的目的的,在硬盤的主引導區中,從偏移1BEH~1FDH的64個字節存放的是硬盤分區表,其中最多包含4個分區項,每個分區項由16個字節構成,我們來看看每個分區項的詳細含義,假設我們的一個分區占用的16個字節被標為00H~0FH,其結構如表3:

表3:

偏移含義

00H引導標識字節,其值只能為00H或80H,為00H時表示該分區不可引導,為80H時表示該分區可用於引導 。

01H分區起始磁頭號

02H其高2位為分區起始柱面號的高位,底6位為分區起始扇區號

03H分區起始柱面號的低位

04H分區系統標志,當該值為00H時,表示此分區為不可識別的系統;為04H時該分區為FAT16分區;為05H或0FH該分區為 擴展分區;為0B時該分區為FAT32分區 ;為83H時表示該分區為Linux分區, 為07時該分區為NTFS分區

05H分區結束磁頭號

06H其高2位為分區結束柱面號的高位,底6位為分區結束扇區號

07H分區結束柱面號的低位

08H~0BH在線性尋址方式下的分區的扇區地址。

0CH~0FH以扇區為單位的該分區大小(總扇區數)

我們來看看BootMagic之類的軟件是如何實現多系統引導的了,在表3中我們看到在偏移00H處的一個字節當其值為80H時代表該分區是一個引導區,當其值為00H時代表該分區不是引導區,其實多引導的實現原理就是通過改變該處的值來選擇用來引導的分區。

假設你已經了解了以上原理,我們就完全可以做出自己的多重引導程序來了,我在此寫出一個完整的實現程序,我將為大家分析這個程序應該怎麼來寫。假設你有一塊硬盤,你在上面安裝了一個windowsXP,可你現在想裝個windows98,於是你用PartitionMagic將你的第一個擴展分區也就是你的D區設置為主分區,然後激活,重啟動並用windows98安裝光盤引導系統,並安裝好windows98。就到這,你先不要急於安裝BootMagic,讓我們來試試動手做個自己的BootMagic怎麼樣。

很顯然,要實現此功能,最少需要兩個模塊,模塊一:被寫入主引導扇區中,用來取代原MBR區,它必須能夠在系統引導前獲取執行權,實現主分區的引導選擇後,將執行權交給被選擇的操作系統,從而實現多系統引導;模塊二:實現三個功能,首先將原主引導扇區備份一個到其他扇區(在我的例子中把它備份到0頭0道 6扇),然後將模塊一寫入主引導扇區。另外模塊二還實現多引導程序的卸載

模塊二功能相對簡單,其源程序如下:

;硬盤多引導安裝程序(SYSGUIDE.EXE)模塊二
DATA SEGMENT
D1 DB 'choose'
D2 DB 'Please choose the number (1)Install the SYSGUIDE',0dh,0ah,' DB ‘ (2) Delete the SYSGUIDE',0dh,'$'
D3 DB 'SYSGUIDE.DAT',00H
D4 DB 'Can not find file (SYSGUIDE.DAT)',0dh,0ah,'$'
  D5 DB 0dh,0ah
DB 0dh,0ah
DB 0dh,0ah
DB ' ----------# MUCH SYSTEM GUIDE #------------',0dh,0ah
DB ' E-mail:[email protected]',0dh,0ah
DB ' OICQ:86633320',0dh,0ah,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV DX,OFFSET D5
MOV AH,09H
INT 21H
MOV AH,00H
INT 16H
MOV DX,OFFSET D2
MOV AH,09H
INT 21H
readkey:
MOV AH,00H
INT 16H
cmp al,'1'
je key1
cmp al,'2'
je key2
jmp readkey
key1:
MOV AX,0201H ;讀0 0 1扇區
MOV CX,0001H
MOV DX,0080H
MOV BX,0F000H
INT 13H
MOVSI,offset D1
MOVDI,0F020H
MOVCX,0003H
REPZ CMPSW
JZEXIT ;字符串相同則跳轉
mov ax,0301h ;將原MBS區備份一個到0 0 6 扇
mov cx,0006h
mov dx,0080h
int 13h
MOV AH,3DH
MOV DX,OFFSET D3
MOV AL,00H
INT 21H ;打開文件SYSGUIDE.DAT
JB OPERERROR
PUSH AX
MOV AH,3FH
MOV DX,0F000H
MOV CX,018DH
POP BX
INT 21H
MOV AX,0301H ;將SYSGUIDE.DAT寫到0 0 1扇,替代原來的MBR
MOV CX,0001H
MOV DX,0080H
MOV BX,0F000H
INT 13H
JMP EXIT
key2:
MOV AX,0201H;讀0 0 1扇區
MOV CX,0001H
MOV DX,0080H
MOV BX,0F000H
INT 13H
MOVSI,offset D1
MOVDI,0F020H
MOVCX,0003H
REPZ CMPSW
JNZEXIT ;字符串相同則跳轉
MOV AX,0201H ;讀0 0 6扇區
MOV CX,0006H
MOV DX,0080H
MOV BX,0F000H
INT 13H
MOV AX,0301H ;寫0 0 1扇區
MOV CX,0001H
MOV DX,0080H
MOV BX,0F000H
INT 13H
JMP EXIT
OPERERROR:
MOV AH,09H
MOV DX,OFFSET D4
INT 21H
EXIT:
MOV AH,4Ch
INT 21h
CODE ENDS
END START

模塊一被寫入到硬盤的第一個扇區中,在系統引導之前獲得執行權,從而實現多引導。因為這是個扇區程序,有別於一般的程序文件,其格式類似於COM文件,在此我是采用DEBUG程序,從EXE文件中提取的方法來實現的,源程序如下:

;多引導程序(SYSGUIDE.DAT),需要從以下源程序(模塊一)產生的程序文件中提取

CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
  ;這一段是將整個硬盤鎖從0000:7c00移至0000:0600,以免被後來讀入的代碼覆蓋
START:
db 256 dup (00h)
PUSHDS
PUSHES
MOVCX,0100h
MOVDI,0600h
MOVAX,0000h
MOVDS,AX
MOVES,AX
MOVSI,7C00h
REPNZ MOVSW
mov ax,0686h
JMPax ;長跳轉至移動後的代碼,也就是從screen處開始執行
words db 'Please choose the partition for guide.'
db 10 dup (20h)
db '(1)partition 1;(2)partition 2;(3)partition 3;(4)partition 4;',00h
screen:
MOVAX,0600h
MOVBH,0F0h
MOVCX,0000h
MOVDX,184Fh
INT10h ;初始化屏幕(前景為黑色,背景為灰白,字符閃爍)
MOVDL,1Ah
MOVSI,0619h ;從0619H處顯示字符(因為程序將被讀入了0000:0600處,
;實際顯示的也就是現在的words處開始的字符串)
DISPLAY:
MOV AH,02H
MOV DH,10H
MOV BH,00H
INT 10H
MOV AL,[SI]
CMP AL,00H
JE readMBS
MOV AH,09H
MOV CX,01H
MOV BH,00H
MOV BL,70H
INT 10H
INC DL
INC SI
JMP DISPLAY
readMBS:
MOVAX,0201h
MOVCX,0001h
MOVDX,0080h
MOVBX,1000h
INT13h ;將主引導區(即本SYSGUIDE.DAT)讀出到0000:1000H處
MOV ax,0201h
MOV cx,0006h ;讀0 0 6扇,(即原來的MBS)
MOV dx,0080h
MOV bX,07C00h
int 013h
readkey:
MOV AH,00H
INT 16H
CMP AL,'1' ;是1麼?
JE number1
CMP AL,'2'
JE number2
CMP AL,'3'
JE number3
CMP AL,'4'
JE number4
jmp readkey
number1:
db 0a0h,0c2h,11h ;相當於mov al,[011c2h],因為用mov al,[011c2h]不能編譯
cmp al,00h
je error1
cmp al,05h
je error1
cmp al,0fh
je error1
mov ah,080h
db 88h,26h,0beh,11h ;相當於mov [011beh],ah
mov ah,00h
db 88h,26h,0ceh,11h ;mov [11ceh],ah
db 88h,26h,0deh,11h ;mov [11deh],ah
db 88h,26h,0eeh,11h ;mov [11eeh],ah
jmp ok
number2:
db 0a0h,0d2h,11h ;mov al,[11d2h]
cmp al,00h
je error1
cmp al,05h
je error1
cmp al,0fh
je error1
mov ah,80h
db 88h,26h,0ceh,11h ;mov [11ceh],ah
mov ah,00h
db 88h,26h,0beh,11h ;mov [11beh],ah
db 88h,26h,0deh,11h ;mov [11deh],ah
db 88h,26h,0eeh,11h ;mov [11eeh],ah
jmp ok
  error1:
jmp readkey
  number3:
db 0a0h,0e2h,11h ;mov al,[11e2h]
cmp al,00h
je error1
cmp al,05h
je error1
cmp al,0fh
je error1
mov ah,80h
db 88h,26h,0deh,11h ;mov [11deh],ah
mov ah,00h
db 88h,26h,0beh,11h ;mov [11beh],ah
db 88h,26h,0ceh,11h ;mov [11ceh],ah
db 88h,26h,0eeh,11h ;mov [11eeh],ah
jmp ok
number4:
db 0a0h,0f2h,11h ;mov al,[11f2h]
cmp al,00h
je error1
cmp al,05h
je error1
cmp al,0fh
je error1
mov ah,80h
db 88h,26h,0eeh,11h ;mov [11eeh],ah
mov ah,00h
db 88h,26h,0ceh,11h ;mov [11ceh],ah
db 88h,26h,0deh,11h ;mov [11deh],ah
db 88h,26h,0beh,11h ;mov [11beh],ah
jmp ok
ok:
mov ax,0301h
mov cx,0001h
mov dx,0080h
mov bx,1000h
int 13h ; 將改變了引導標示的分區表,寫回0 0 1扇
MOVCX,040h
MOVDI,7dbeh
MOVSI,11beh
REPNZ MOVSW
MOV ax,0301h
MOV cx,0006h ;將改變了引導標示的分區表,寫回0 0 6扇
MOV dx,0080h
MOV bX,07C00h
int 013h
MOV bx,7c00h ;交執行權給0000:7C00處
JMP bx ;長跳轉至原MBR代碼處執行
  CODE ENDS
END START

代碼到此就講完了,程序本身不復雜,只要你了解了實現原理,在實現時才會得心應手,好了,趕快把我們的源代碼編譯鏈接一下,把模塊二得到的程序取名為SYSGUIDE.EXE,從模塊一所得的程序中提取出我們要的程序取名叫SYSGUIDE.DAT,提取方法如下:

1、在DOS方式下,輸入“DEBUG GUIDE.EXE”,其中GUIDE.EXE是我們用模塊一得到的程序文件(在此強烈警告千萬不要運行這個GUIDE.EXE程序),

2、在DEBUG提示符下輸入:R CX(回車) 1BD(回車) N SYSGUIDE.DAT(回車) W(回車)Q(回車)。

在命令行中輸入DEBUG,然後

-R CX(回車)

-1BD(回車)

-N SYSGUIDE.DAT(回車)

-W(回車)

-Q(回車)。

這樣你就會發現在你當前的目錄中就有了一個名為SYSGUIDE.DAT的文件,著就是我們將用來寫入硬盤第一扇區的扇區程序文件了,趕快把它和SYSGUIDE.EXE文件拷貝到一個文件夾下吧。

好了,我們要的程序已經得到了,就讓我們來用用看,在我們最後安裝的WIN98中執行吧,當看到以下提示時,鍵入數字鍵“1”。

'Please choose the number (1)Install the SYSGUIDE

(2) Delete the SYSGUIDE

然後重新啟動,怎麼樣,是不是看到了引導選擇提示?不過界面是不太好看了^_^,但是沒什麼,畢竟這是我們自己寫的多引導程序哦!好了,我們選擇“1”試試,是不是進了我們先前安裝的WINXP?然後重新啟動,再選擇“2”試試,是不是進了我們後來安裝的WIN98了!

對了我們好象還有一個BOOTMAGIC的功能沒有實現哦,就是程序自動識別操作系統的功能,我想這個功能就留到我們讀者自己去擴充吧!我在這大致的說明一下原理,又回到我們的表3,看到其中偏移04的那個字節麼?其實BOOTMAGIC就是利用了這個原理來實現智能化的識別操作系統的,那具體要怎麼做呢?我不說,自己去想^_^。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved