日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

啟動扇區(qū)代碼分析 FreeBSD 5.2.1 boot0( 四 )


Linux Native分區(qū)83表示Linux Swap 分區(qū),有關(guān)分區(qū)表的細節(jié)請詳見本文的尾部 。然后dx清零 ,
此后,dx將作為遍歷磁盤分區(qū)的列舉代號使用 。啟動分區(qū)代碼dl的原來的值在上面已經(jīng)壓入
了堆棧保存 。

#
# Loop around on the partition table, printing values until we
# pass a 256 byte boundary. The end of loop test is at main.5.
#
main.3:
movb %ch,-0x4(%bx) # Zero active flag (ch == 0)
btw %dx,_FLAGS(%bp) # Entry enabled?
jnc main.5 # No
上面首先使得第一個分區(qū)的活動標志為0,標志它不為活動標志,因為ch的值為0 。至
于第二句“btw %dx,_FLAGS(%bp)”中的_FLAGS(%bp)是上面我們說到的“手動指定我們
實際安裝FreeBSD的分區(qū)代碼” 。其中的bit 0x20我們在上面已經(jīng)提到過 。_FLAGS(%bp)
中的其他 位表示是否我們需要檢查相應的磁盤分區(qū) 。缺省情況下,我們需要檢查所有
的磁盤分區(qū) 。檢查磁盤分區(qū)看是否有可以啟動的磁盤分區(qū),例如,可能磁盤上的某個
分區(qū)為WindowsXP或者是Linux等 。如果我們沒有改變在磁盤上該處的值,則相應的bit
位的值 為0,表示所有的分區(qū)都要檢查(因為此時_FLAGS(%bp)中的值為0),否則,
只針對FLAGS(%bp)中相應的bit位未被設置為1的分區(qū)進行檢查 。

大家知道,F(xiàn)reeBSD Manager啟動時可能出現(xiàn)以下的提示:

F1 FreeBSD
F2 ??
F3 BSD
F4 ??
Default F1

其中,上面的提示中出現(xiàn)了令人討厭的“??”,為了避免出現(xiàn)“??”的提示,我們可以設置相應的
第一分區(qū)和第四分區(qū)不檢查,就需要正確設置_FLAGS(%bp)中的bit位 。設置好后,屏幕可能
出現(xiàn)以下的提示:

F1 FreeBSD
F2 BSD
Default F1

#
# If any of the entries in the table are
# the same as the "type" in the slice table entry,
# then this is an empty or non bootable partition. Skip it.
#
movb (%bx),%al # Load type
movw $tables,%di # Lookup tables
movb $TBL0SZ,%cl # Number of entries
repne # Exclude
scasb # partition?
je main.5 # Yes
我們從上面已經(jīng)知道起始(%bx)指向的是MBR中分區(qū)信息1(16字節(jié))的位置(見圖(三)),
以上代碼在“忽略的分區(qū)類型$tables”中查找看是否本分區(qū)是不可啟動的或者不合法的分區(qū) 。
不可啟動的或者不合法的分區(qū)類型有3($TBL0SZ=3)個,它們是“0x0, 0x5, 0xf”,見下面的
$tables處 。如果是不可啟動的或者不合法的分區(qū)類型則跳轉(zhuǎn)到main.5,進行下一輪循環(huán) 。

#
# Now scan the table of known types
#
movb $TBL1SZ,%cl # Number of entries
repne # Known
scasb # type?
jne main.4 # No
#
# If it matches get the matching element in the
# next array. if it doesn"t, we are already
# pointing at its first element which points to a "?".
#
addw $TBL1SZ,%di # Adjust
main.4:
movb (%di),%cl # Partition
addw %cx,%di # description
callw putx # Display it
上面檢查看所檢查的分區(qū)類型是否為我們知道的分區(qū)類型,知道的分區(qū)類型有11($TBL1SZ=0xb)
個,它們是:“0x1, 0x4, 0x6, 0xb, 0xc, 0xe, 0x83,0x9f, 0xa5, 0xa6, 0xa9”,見
下面的$tables處 。如果不是以上的類型,則跳轉(zhuǎn)到main.4 。那么,(%di)所指的字串是“??”,
如果分區(qū)類型是“0x1, 0x4, 0x6, 0xb, 0xc, 0xe, 0x83,0x9f, 0xa5, 0xa6, 0xa9”
之一,則(%di)所指的字串是“Dos”、“Linux”、“FreeBSD”或“BSD”等 。
見下面的“os_misc”、“os_dos”、“os_linux”、“os_freebsd”、“os_bsd”等
標記 。

callw putx調(diào)用putx函數(shù),在屏幕上打印:“Fx XXX” 。其中XXX為DOS”、“Linux”、
“FreeBSD”或“BSD”等 。

main.5:
incw %dx # Next item
addb $0x10,%bl # Next entry
jnc main.3 # Till done
遍歷磁盤分區(qū)的舉代號dx加1,重復下一輪循環(huán)查找 。bl加上0x10(0x10=16)表示尋址到下

推薦閱讀