的文件,若存在,則顯示“備份”與“還原”兩個(gè)選項(xiàng)供用戶選擇,否則只顯示一個(gè)單獨(dú)的“備份”選項(xiàng);
56、用戶選擇:根據(jù)用戶的選擇,進(jìn)入“備份”流程,以備份本機(jī)的磁盤分區(qū)表以及所有Windows系統(tǒng)分區(qū);或進(jìn)入“還原”流程,以從備份文件中還原本機(jī)的磁盤分區(qū)表以及所有Windows系統(tǒng)分區(qū)。
[0036]為了更好的幫助理解下文對(duì)S1中“FreeBSD內(nèi)核中文化”的具體過程的描述,首先簡(jiǎn)要介紹一下現(xiàn)有FreeBSD內(nèi)核的圖形模式控制臺(tái)的設(shè)計(jì)及其缺陷:
為了和VGA文本模式兼容,F(xiàn)reeBSD內(nèi)核將圖形模式控制臺(tái)的字符緩沖區(qū)(后文以"strbuf"表示)設(shè)計(jì)為每字符2字節(jié)大小(1字節(jié)代碼+1字節(jié)屬性),其格式與文本模式時(shí)的字符緩沖區(qū)格式完全相同。但這樣一來,圖形模式的字符緩沖區(qū)就變得和文本模式的字符緩沖區(qū)一樣,最多只能表示256個(gè)字符了。
[0037]針對(duì)上述設(shè)計(jì)缺陷,常規(guī)的改進(jìn)方案一般是修改〃strbuf"的定義,將原有的"unsigned short *〃修改為"unsigned int *〃,這樣字符緩沖區(qū)的大小將變?yōu)槊孔址?字節(jié)(2字節(jié)代碼+2字節(jié)屬性),從而可以容納65536個(gè)字符。但是FreeBSD內(nèi)核中大量的代碼都是基于〃strbuf〃是〃unsigned short *〃這樣的假定。因此,一旦修改了〃strbuf〃的定義,就需要對(duì)內(nèi)核中大量晦澀難懂的代碼進(jìn)行修改。不但如此,這樣修改之后,還需要專門針對(duì)漢字再編寫一套字形繪制函數(shù),因?yàn)槊總€(gè)漢字都是一個(gè)16x16像素的二維點(diǎn)陣,不同于西文字符8x16像素的二維點(diǎn)陣,無法直接使用原有的字形繪制函數(shù)。
[0038]為了盡可能少修改原有的代碼,需要轉(zhuǎn)變常規(guī)的思維方式。本發(fā)明利用"strbuf"本質(zhì)上是一個(gè)指針,其所指向的內(nèi)存是通過kmallocO函數(shù)動(dòng)態(tài)分配的特點(diǎn)。以此為突破口,設(shè)計(jì)了本發(fā)明的改進(jìn)方案。
[0039]在本實(shí)施例中,S1中“FreeBSD內(nèi)核中文化”的具體過程為:
S11、向內(nèi)核中添加中文字體,不再將漢字作為單個(gè)字符處理,而是將每個(gè)漢字劈為左右兩半。也就是將每個(gè)漢字視為左右兩個(gè)8x16像素的二維點(diǎn)陣,每半個(gè)漢字等價(jià)于一個(gè)西文字符。具體步驟如下:
S111、選取任意一款等寬中文字體(例如開源的文泉驛Unibit字體),要求其中每個(gè)半角字符的寬度嚴(yán)格等于全角字符的一半。
[0040]S112、對(duì)每個(gè)半角字符(代碼小于256)按照8x16點(diǎn)陣進(jìn)行采樣,將點(diǎn)陣中有筆畫的點(diǎn)標(biāo)記為〃1〃,沒有筆畫標(biāo)記的點(diǎn)標(biāo)記為〃0〃。這樣每個(gè)半角字符就轉(zhuǎn)化成了一個(gè)8x16的二維矩陣。
[0041]S113、對(duì)每個(gè)全角字符(代碼大于255)按照16x16點(diǎn)陣進(jìn)行采樣,并將采樣結(jié)果從中間劈為左右兩半,得到左右兩個(gè)8x16點(diǎn)陣,同樣將點(diǎn)陣中有筆畫的點(diǎn)標(biāo)記為〃1〃,沒有筆畫標(biāo)記的點(diǎn)標(biāo)記為〃0〃。這樣每個(gè)全角字符就轉(zhuǎn)化成了左右兩個(gè)8x16的二維矩陣。
[0042]S114、將每個(gè)8x16的二維矩陣的每一行的8個(gè)bit (正好一個(gè)字節(jié))轉(zhuǎn)化為一個(gè)16進(jìn)制數(shù),這樣每個(gè)矩陣就會(huì)得到16個(gè)0x00?OxFF之間的無符號(hào)單字節(jié)整數(shù)。這樣就完成了字符(也就是位圖)的數(shù)字化。
[0043]S115、將每個(gè)字符按照其代碼順序,依次簡(jiǎn)單的連接起來,封裝到字體數(shù)組中即可作為嵌入內(nèi)核的字體使用。
[0044]通過將每個(gè)全角字符(漢字)劈成左右兩個(gè)半角字符,在邏輯上取消了 〃全角字符"的概念,這樣就為接下來在代碼中將所有字符統(tǒng)一視為"半角字符"提供了字體支持。
[0045]S12、保持內(nèi)核中原有的所有數(shù)據(jù)結(jié)構(gòu)與變量定義不變,特別是用于保存字符代碼及字符屬性的變量"strbuf"的定義不變,但是使用動(dòng)態(tài)內(nèi)存分配函數(shù)為其額外多分配一倍的動(dòng)態(tài)內(nèi)存(后文將這部分多出來的部分稱為"unibuf"),用偽代碼表示就是將原有的
strbuf=kmalloc(strbuf_length);
修改為
strbuf=kmalloc(strbuf_length氺2);
并將多分配出來的空間完全用于容納中文的字符代碼(不含屬性)。這樣可以避免破壞內(nèi)核原來的數(shù)據(jù)結(jié)構(gòu),進(jìn)而避免了對(duì)內(nèi)核代碼的大規(guī)模修改。
[0046]舉例來說,假設(shè)要在屏幕上顯示黑底白字的〃ABC〃三個(gè)字符,按照FreeBSD原來的做法,只需要給〃strbuf〃分配6字節(jié)內(nèi)存,并在其中寫入〃0x410f,0x420f, 0x430f〃即可。但是按照修改之后的做法,則需要分配12字節(jié)內(nèi)存,其中前6字節(jié)("strbuf")與原來的方案完全相同(1字節(jié)代碼+1字節(jié)屬性),因此可以完全兼容原有的內(nèi)核代碼。而多出來的后6字節(jié)("unibuf"),則用于存儲(chǔ)以2字節(jié)表示的字符代碼,也就是"0x0041,0x0042, 0x0043〃(雖然這部分內(nèi)容在本例全英文字符的情況下并無實(shí)際用途)。
[0047]S13、考慮到0x00與Oxff以及0x20都顯示為一個(gè)空格(也就是一個(gè)8x16的空白點(diǎn)陣),因此犧牲代碼為0x00與Oxff的兩個(gè)字符(用0x20代替),不再將這兩個(gè)代碼視為字符代碼,而是將其視為漢字的左右部分的標(biāo)識(shí)符。具體說來就是,根據(jù)不同的字符代碼分別按如下規(guī)則進(jìn)行處理:
5131、如果代碼等于0x00或Oxff,則直接將其改寫為0x20;
5132、對(duì)于小于Oxff的代碼(西文),在向"strbuf"寫入字符代碼的同時(shí),再寫入一份到"unibuf〃中。而對(duì)于大于Oxff的代碼(中文),首先向"strbuf〃中固定寫入0x00和Oxff兩個(gè)代碼(因?yàn)橐粋€(gè)中文等于兩個(gè)英文),然后再寫入兩份到"unibuf"中。其中,"0x00〃表示該字符的代碼要到"unibuf"中提取,并需要繪制左半部分;而"Oxff"則表示該字符的代碼要到unibuf中提取,并需要繪制右半部分。
[0048]舉例來說,如果要在屏幕上顯示黑底白字的〃牛B〃,那么"strbuf"中的內(nèi)容就是"OxOOOf, OxffOf, 0x420f〃,而 〃unibuf〃 的內(nèi)容則是"0x725b, 0x725b, 0x0042"。
[0049]對(duì)于〃strbuf〃部分來說,〃0x00〃,〃0xff〃分別表示〃?!ǖ淖笥野脒?,〃0x42〃則是字母〃B〃的字符代碼;而〃0x0f〃則是屬性,表示黑底白字。因?yàn)橐粋€(gè)漢字為兩倍的英文字母寬度,所以在屏幕文字緩沖區(qū)上也必須占用兩個(gè)字符的位置。又因?yàn)楸仨氂幸环N機(jī)制能知道應(yīng)該繪制左半部分和右半部分,所以這里使用的就是0x00和Oxff兩個(gè)魔數(shù)。對(duì)于"unibuf"部分來說,〃0x725b〃是漢字〃牛〃的字符代碼(2字節(jié)),"0x0042〃是字母〃B〃的字符代碼(2字節(jié))。
[0050]S14、修改獲得字體數(shù)據(jù)的代碼。因?yàn)橐呀?jīng)在字體中將每個(gè)漢字拆為了左右兩半,所以不需要修改原有僅適用于8x16點(diǎn)陣的字形繪制函數(shù)。只需要修改獲得字體數(shù)據(jù)的代碼,添加一個(gè)判斷〃字符代碼〃是否為0x00或Oxff的邏輯,具體如下:
S141、如果為假(不等于0x00或Oxff),則直接使用此〃字符代碼〃作為索引,到字體數(shù)組中去提取對(duì)應(yīng)的二維點(diǎn)陣(8x16)。
[0051]S142、如果為真(等于0x00或Oxff),則從〃unibuf〃提取真正的〃字符代碼〃,并依據(jù)是0x00還是Oxff,到字體數(shù)組中去提取對(duì)應(yīng)的左或右半部分的二維點(diǎn)陣(8x16)。取得字體數(shù)據(jù)之后,繼續(xù)按照原有的流程,調(diào)用原有的字形繪制函數(shù),即可將漢字顯示在屏幕上。
[0052]在本實(shí)施例中,S4的計(jì)算序列號(hào)步驟中的序列號(hào)模塊是根據(jù)電腦的硬件信息計(jì)算出“主機(jī)序列號(hào)”與“硬盤序列號(hào)”。而這兩個(gè)序列號(hào)是實(shí)現(xiàn)備份文件與目標(biāo)電腦之間自動(dòng)匹配的關(guān)鍵。每臺(tái)電腦都對(duì)應(yīng)著兩種備份文件,一種是分區(qū)表與引導(dǎo)區(qū)的備份文件(.mbr),另一種是Windows系統(tǒng)分區(qū)的備份文件(.xz)。這兩種備份文件的文件名格式如下:
主機(jī)序列號(hào)-硬盤序列號(hào).mbr ;
主機(jī)序列號(hào)-硬盤序列號(hào)-分區(qū)號(hào).xz ;
在本實(shí)施例中,“主機(jī)序列號(hào)”與“硬盤序列號(hào)”的計(jì)算方法如下:
主機(jī)序列號(hào)=MD5 (主板制造商名稱+主板硬件序列號(hào));
硬盤序列號(hào)=MD5 (硬盤制造商名稱+硬盤硬件序列號(hào));
因?yàn)樗兄靼迮c硬盤制造商都會(huì)給他們的每件產(chǎn)品賦予一個(gè)唯一的硬件序列號(hào),同時(shí),操作系統(tǒng)也可以方便的通過固件