如是觀齋


此心本真如,妄想始蔽覆,顛倒無明,長淪生死,猶盲人夜行,永不見日。業相既起,境界為緣,業起緣生,重重束縛,何有自在?
須知體即法身,相即般若,用即解脫,若止觀則成定慧,定慧以明心,德相圓矣!

2007年10月24日 星期三

利用NT的BootManager引導GRLDR.MBR

利用NT的BootManager引導GRLDR.MBR
適當的修改,GRLDR.MBR可以直接由NT的BootManager導引



在2000/XP/2003下,在boot.ini的最後加上一行:

C:\GRLDR.MBR="Boot GRLDR.MBR"



在Vista下,可以使用bcdedit



(1) 創建一個新bcd主要用於啟動軟碟、usb盤或光碟上的bootmgr。

md a:\boot 創建a:\boot文件夾
bcdedit /createstore a:\boot\bcd 新建一個bcd檔
bcdedit /store a:\boot\bcd -create {bootmgr} /d "Boot Manager" 新建一個用bootmgr載入的啟動項
bcdedit /store a:\boot\bcd /create /d "bootsect" /application bootsector 此項目用bootmgr載入一個bootsector項
執行上面命令後返回一個{ID},然後執行
bcdedit /store a:\boot\bcd /set {ID} device boot 設置啟動設備
bcdedit /store a:\boot\bcd /set {ID} path \grldr.mbr 設置啟動磁區路徑和檔案名
bcdedit /store a:\boot\bcd /displayorder {ID} /addlast 加入以上設置項目



(2) 修改既有原始的bcd(也就是c:\boot\bcd),就不需要/store這個參數了,直接修改就可以了。

不用創建一個restore,直接在當前的功能表存儲區(bcd檔)內進行添加即可。如下:



(2.A). bcdedit /create /d " Start GRUB4DOS by grldr.mbr " /application bootsector

bcdedit /set {id} device boot

bcdedit /set {id} path \grldr.mbr

bcdedit /displayorder {id} /addlast

同時你需要把附件中的grldr.mbr文件拷到C:\下。



如果引導正常,GRLDR.MBR運行,它會在硬碟上所有的FAT16/FAT32/NTFS/EXT2分割的根目錄找並啟動GRLDR,其效果就和把GRLDR.MBR安裝到MBR裏一樣。



(2.B). 另一方法也可以修改boot.ini

[boot loader]

timeout=10

default=C:\GRLDR.MBR

[operating systems]

C:\GRLDR.MBR="Boot Manager"





註一:

Bootmgr方式可用於多重啟動光碟,因此應該也可以用來載入光碟上的grldr,這是ntldr做不到的。



註二:

在Win2K/XP下既可以使用grldr.mbr,也可以直接使用grldr。grldr.mbr 一開始就只能被用來放在 MBR 上,不能被 boot.ini 使用。在 2007 年的某個時刻,也就是大約在支持 VISTA 的同時,grldr.mbr 也開始可以被 boot.ini 使用了。不過,在 Win2K/XP 下,使用 grldr 似乎更好,因為這樣做可以省略 grldr.mbr 這個檔。而如果使用 grldr.mbr,那麼根目錄下仍然需要一個 grldr 檔。

例如前面在2000/XP/2003下是通過在boot.ini中加入命令C:\GRLDR.MBR="Boot GRLDR.MBR",這時GRLDR.MBR的作用又是來找grldr,不如在boot.ini中直接載入grldr即可。 在grub4dos可以在boot.ini中通過c:\grldr="start grub4dos"來啟動。
但這種方式對Vista是無效的,所以,才出現了通過grldr.mbr來啟動grub4dos的想法。而且,通過grldr.mbr來啟動grldr更靈活,grldr沒有必要一定要放在c:\,任何一個分區的根目錄都是可以的。

目前在Vista下只能使用grldr.mbr,不能使用grldr。



註三:

grubinst中的grldr.mbr和grub4dos的grldr.mbr的代碼是不同的。為了使grldr.mbr可以直接能在boot.ini中啟動,我修改過第一磁區和中間某個地方的代碼,但具體在哪里我也忘了,要對比一下代碼才知道。你可以用grubinst源代碼包中的grldr.mbr比一下看看。





原理:

我發現NTLDR引導啟動檔的方式非常奇特:

如果檔大小<16磁區(8K),那麼整個檔被裝載到D00:0,不過只有第一個磁區的內容被拷貝
到0:7C00中,而且開始運行的位址是0:7C00。

如果檔大小=16磁區(8K), 那麼整個檔被裝載到D00:0,而且,開始運行的位址是D00:200

檔大小>16磁區(8K)的情況沒有測試,不過應該和=的情況是類似的。



96.3.22更新:根據不點的提示改動了一下grldr.mbr,現在該版本應該可以適用於XP系統下
96.3.22更新:修改了NTFS的代碼,現在應該能夠解決Large structure的問題







BootManager的MENU加入「啟動光碟」選項



title啟動光碟

cdrom --init

map --hook

chainloader (cd)





GRUB的兩個功能



GRUB有命令完成的功能,比如說,在命令行裏輸入

kernel (hd0,0)/

然後按TAB(不要按ENTER),那麼會自動列出(hd0,0)根目錄的檔,這也可用來測試GRUB內部對NTFS模組目錄列表的功能。

而且,grub.exe可以作為kernel來引導。你把grub.exe放在C:盤,然後用以下的命令:

kernel (hd0,0)/grub.exe
boot

即可進入grub,這也可用來測試GRUB內部的NTFS模組載入檔的功能。





修改GRLDR要注意,不是各版WINDOWS的NTLDR進入點都相同



各版本的ntldr進入點都不同,

XP 啟動一個長度大於或等於 8192 位元組的映射時,進入點是偏移 0x256 。為了保險起見,從偏移0x200 到 偏移 0x269 都要用 NOP 填充。然後在偏移 0x26A 處放置 JMP 指令。有些 NT 系列的進入點不是 0x200 也不是 0x256 而是別的。所以,需要用 NOP 填充上述區域。

另外,NTLDR 的 bootsector 和 NTLDR 檔本身又是兩個概念。不同版本的 NTLDR,可能差別不大,至少檔格式不會有太大差別。



而且Vista中NTFS結構比諸其他WINDOWS的也有改變。





NTFS中根目錄的檔太多解決方式

NTFS中目錄的檔案名是通過B樹來存儲的,在程式中要用遞迴的方法來讀取。我懷疑在某些情形下,演算法會出現問題。所以才隨機出現問題。

另外,如果根目錄的檔的確太多,那麼也可能會出現根目錄的內容在無法包含在一個MFT,而需要使用屬性列表attr_list。在代碼中沒有處理屬性列表。不過,這種情況極少出現。因為根目錄MFT裏只是存放目錄檔的索引,它表示方式類似於blocklist。因此,只有當目錄非常大,而且在磁片上非常分散的時候,才會出現MFT空間不夠用的情形。

另外,NTFS的代碼是經過了簡化才剛好能放在3個磁區裏的。現在的出錯資訊以代碼表示,也是為了省掉使用字串所佔用的空間。因此,如果要加入這個 attr_list 的處理代碼新功能,可能要把它擴展為4個磁區了。但我們還可以尋求別的辦法,比如壓縮代碼。或者壓縮引導磁區之外的那些代碼,它們應該能夠有較大的壓縮空間。我剛剛看了,4 個磁區的 NTFS 代碼是可以接受的,只要刪掉引導磁區以外的那些字串就行了,仍然可以保證 GRLDR 頭部的引導代碼處在 16 磁區之內。





INTEL CPU設計上的大缺陷

mulb 0x1a(%bp) /* nHeads, but maybe a word value 0x100 */
jnz 1f
movb %bl, %ah /* nHeads=0x100, so AX=sectPerTrack*0x100 */
1:



在相乘操作 MUL 之後,零標誌 ZF 是無定義的。所以,用 JNZ 是錯誤的,必將引發隨機失敗!這正好是 軟體 所遇到的情況。

這同時也顯示出 Intel CPU 設計上的一個缺陷(可以說是很大的一個缺陷)。

一個良好的 CPU 設計,應該在執行任何一條命令之後,都不出現“無定義”的標誌位元。因為這種“無定義”的狀態,沒有任何用處。注意,“無定義”並不等同於“保持指令執行前的狀態”。“無定義”等同於“隨機的”。

具體針對 mul 指令來說,當相乘的結果是 0 的時候,就應當設置 ZF 標誌(零標誌),反之,就應當清除 ZF 標誌,而完全沒必要把 ZF 搞成“無定義”的狀態,從而給程式師帶來巨大負擔。程式師有了負擔,那麼程式碼的品質就難以保證。這如果發生在 BIOS 和系統程式設計上,它的危害就更大。(其實 GRUB 就是一個小系統)。





VISTA只能處理8192 位元組的 grldr.mbr 引導映射,較小不行,大於 64K 的也不行

我沒有 vista,但從所有這些有關現象的報導來看,似乎有理由相信,vista 只能處理 8192 位元組的 grldr.mbr 引導映射,少於這個位元組數不行。而且,可能大於 64K 的也不行。

GRLDR 檔本身已經大於 64K 了,所以被 VISTA 拒絕。



grub4dos 0.4.2 發佈的 grldr.mbr 小於 8192 位元組,因此會顯示 missing MBR-helper. 如果把這個檔填充為 8192 位元組(末尾用 00 填補),就有可能讓 vista 來啟動了。(如果有問題,把 bean 的 grldr.mbr 中的第二磁區拷貝到(也就是覆蓋掉) grub4dos 0.4.2 發佈的 grldr.mbr 的第二磁區,這樣應該可以了)。

不過,grub4dos 0.4.2 發佈的引導代碼,引導 VISTA 的 NTFS 分區下的 grldr 是不行的。只能引導 VISTA 的 FAT 下的 grldr。





Bootmgr的MENU中文顯示不正常



Vista可用

bcdedit /set {bootmgr} locale zh-TW

可以把bootmgr的MENU改中文顯示的。但要確保在c:\boot\fonts中有字體檔;在c:\boot\zh-TW中有bootmgr.exe.mui





測試vista的bootmgr啟動的方法

其實測試vista的bootmgr啟動不需要安裝windows vista,只需要bootmgr bcd bcdedit.exe等幾個檔就可以了。
我這兩天測試都是在沒安裝windows vista的機子上進行的。



另外推薦一下自己安裝WinPE 2.0硬碟啟動版的方法,也可以用來研究VISTA的BOOT MANAGER:

1:首先到微軟2007-1-3發佈的下載 Windows 自動安裝工具包 (AIK)
微軟發佈頁 微軟下載頁
2:解壓或虛擬光碟機vista_6000.16386.061101-2205-3-LRMAIK_CN.img,安裝WAIKX86.MSI到C:\Program Files\Windows AIK



3:命令提示符下:

md c:\boot

xcopy /e /r /y "C:\Program Files\Windows AIK\Tools\PETools\x86\boot\*.*" c:\boot

md c:\sources

copy /y "C:\Program Files\Windows AIK\Tools\PETools\x86\winpe.wim" c:\sources\boot.wim

copy /y "C:\Program Files\Windows AIK\Tools\PETools\x86\bootmgr" C:\



4:用grldr chainloader /bootmgr就ok了,系统要求不高我256MB就能启动,放在U盘上随身携带到其它电脑上用。
5:另外还可以利用微软的ImageX封装工具修改"C:\Program Files\Windows AIK\Tools\PETools\x86\winpe.wim"镜像,我这里提供一个批处理放在"C:\Program Files\Windows AIK\Tools\PETools"就可以自行修改winpe.wim镜像了。
ImageX相关贴子http://www.cn-dos.net/forum/viewthread.php?tid=28030&fpage=1&highlight=



請打開附件 PETools.7z





抄出啟動磁區可以用grubinst:

grubinst --save=bs.out --read-only (hd0,0)

這樣會把(hd0,0)的啟動磁區保存到bs.out中,而且因為有--read-only,程式不會修改原來的啟動磁區

用diskrw應該也可以。

0 個意見:

張貼留言

訂閱 張貼留言 [Atom]

<< 首頁