<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>
    以文本方式查看主題

    -  曙海教育集團(tuán)論壇  (http://www.hufushizhe.com/bbs/index.asp)
    --  Linux應(yīng)用開(kāi)發(fā)  (http://www.hufushizhe.com/bbs/list.asp?boardid=32)
    ----  編寫(xiě)適用于模擬器的Linux代碼  (http://www.hufushizhe.com/bbs/dispbbs.asp?boardid=32&id=1672)

    --  作者:wangxinxin
    --  發(fā)布時(shí)間:2010-11-23 11:04:13
    --  編寫(xiě)適用于模擬器的Linux代碼

    編寫(xiě)適用于模擬器的Linux代碼
    在某臺(tái)計(jì)算機(jī)上模擬其他計(jì)算機(jī)的歷史已經(jīng)很長(zhǎng),通常是為了使用遺留應(yīng)用程序,或者是為了使用更穩(wěn)定、響應(yīng)更快的OS的系統(tǒng)上運(yùn)行流行的OS而編寫(xiě)的應(yīng)用程序。隨著Linux越來(lái)越流行,當(dāng)開(kāi)發(fā)人員規(guī)劃將運(yùn)行于非Linux系統(tǒng)上的二進(jìn)制程序時(shí),需要審視他們的選擇。本文將研究模擬器的功能,并將詳細(xì)地研究硬件模擬和軟件模擬的問(wèn)題。
    在某臺(tái)計(jì)算機(jī)上模擬其他計(jì)算機(jī)已有多年的歷史。模擬老的計(jì)算機(jī)的一個(gè)常見(jiàn)原因是懷舊,不過(guò)不可否認(rèn),很多模擬器能夠非常出色地運(yùn)行多種計(jì)算機(jī)游戲。模擬其他計(jì)算機(jī)的另一個(gè)原因是為了使用只存在于某個(gè)特定平臺(tái)上的應(yīng)用程序軟件。
    通常,應(yīng)用程序模擬以占據(jù)較大市場(chǎng)份額的平臺(tái)為目標(biāo)。例如,WINE 項(xiàng)目嘗試去提供一個(gè)運(yùn)行 Windows二進(jìn)制程序的途徑。
    不過(guò),近年來(lái)Linux已經(jīng)被證明是一個(gè)穩(wěn)定而且全能的操作系統(tǒng);因而,它的市場(chǎng)份額也有所增長(zhǎng)。市場(chǎng)份額的增長(zhǎng)激起了人們對(duì)模擬Linux的興趣。本文評(píng)論了在其他系統(tǒng)上進(jìn)行Linux二進(jìn)制程序模擬的現(xiàn)狀,并著重指出為了讓人們更方便地在模擬環(huán)境中運(yùn)行他們的二進(jìn)制程序,開(kāi)發(fā)人員應(yīng)該緊記的一些問(wèn)題。
    基本的模擬器
    模擬器的思想很簡(jiǎn)單。計(jì)算機(jī)是充分可預(yù)測(cè)的。如果您想確切地了解如果給出一段特定的代碼計(jì)算機(jī)會(huì)做什么,那么通過(guò)建立這臺(tái)計(jì)算機(jī)的模型就可以得到結(jié)果。當(dāng)然,這會(huì)涉及到相當(dāng)多的開(kāi)銷,但是,如果要模擬的計(jì)算機(jī)比正在進(jìn)行模擬的計(jì)算機(jī)老得多,那么模擬環(huán)境將比原來(lái)的機(jī)器更快。
    有一些模擬層,比如NetBSD的Linux模擬層,只是提供某個(gè)環(huán)境的軟件部分的模擬,從 Linux 程序庫(kù)取得系統(tǒng)調(diào)用,并處理返回結(jié)果,使得看起來(lái)像是在使用 Linux內(nèi)核。其他的模擬層,比如VirtualPC,可以模擬整臺(tái)計(jì)算機(jī),包括處理器。模擬處理器的速度會(huì)更慢,但是可以帶來(lái)更好的兼容性。
    發(fā)行版本格式的模擬器
    盡管本文重點(diǎn)關(guān)注的是在其他平臺(tái)上運(yùn)行Linux二進(jìn)制程序的方法,但是,經(jīng)過(guò)編譯的二進(jìn)制程序發(fā)行版本同樣占有一席之地。隨著Linux模擬環(huán)境越來(lái)越普及,Linux二進(jìn)制程序格式成為發(fā)行簡(jiǎn)單程序(不給出源代碼)的一個(gè)可行方法。Linux二進(jìn)制程序可以在多種系統(tǒng)上運(yùn)行,無(wú)可否認(rèn),有時(shí)需要付出一些代價(jià)——以Linux二進(jìn)制程序格式作為通用發(fā)行版本格式還會(huì)遇到一些挑戰(zhàn)。
    通常,模擬不足以讓您在為另一個(gè)系統(tǒng)構(gòu)建的程序中運(yùn)行為某個(gè)系統(tǒng)構(gòu)建的共享對(duì)象。如果您的產(chǎn)品大部分是以共享程序庫(kù)對(duì)象的形式發(fā)行的,那么這些產(chǎn)品可能不會(huì)被加載到其他平臺(tái)上。
    有人認(rèn)為,使用Linux二進(jìn)制程序格式來(lái)向其他平臺(tái)發(fā)行代碼是瘋狂的。也許這很瘋狂,但它是可行的。近幾年,我的主要的Web瀏覽器就一直在模擬環(huán)境中運(yùn)行(更不用提字處理器、文檔轉(zhuǎn)換器,甚至信用卡處理軟件)。
    我們樂(lè)于使用的大部分軟件應(yīng)用程序都是商用的,并且,能夠發(fā)行可以運(yùn)行在很多平臺(tái)之上的單一的二進(jìn)制程序會(huì)使商業(yè)軟件供應(yīng)商大大受益。如果有多種多樣的Linux模擬環(huán)境可用,那么Linux二進(jìn)制程序格式會(huì)表現(xiàn)為第一個(gè)真正的軟件發(fā)行版本選擇。
    噢,移植源代碼是與發(fā)行有很大區(qū)別的任務(wù);通常,移植任務(wù)更為簡(jiǎn)單。
    完全硬件模擬器
    完全硬件模擬器會(huì)模擬一臺(tái)完整的機(jī)器;不只是處理器,還包括機(jī)器所有其余部分。例如,被模擬的計(jì)算機(jī)可能擁有自己的鍵盤(pán)控制器和視頻卡。
    完全硬件模擬常用于使用較老機(jī)器的程序。MAME街機(jī)游戲(arcade game)模擬器就是一個(gè)流行的示例,它模擬了多種老式街機(jī)游戲機(jī)的硬件。
    就某些方面而言,完全硬件模擬器是進(jìn)行模擬的最簡(jiǎn)單方式。很多工作都需要構(gòu)建一個(gè)完全硬件模擬器,但是一旦您擁有這樣一個(gè)模擬器,所有的事情就都可以迎刃而解。例如,用于 Macintosh 的 VirtualPC 版本 3 開(kāi)始支持 Linux。
    硬件模擬可以解決使用其他方式難以解決的問(wèn)題。例如,我以前有一個(gè)BIOS閃存工具,僅以用于DOS的自解壓縮的映像文件的格式發(fā)布。更糟糕的是,運(yùn)行它的機(jī)器必須在傳統(tǒng)的 ISA 軟盤(pán)控制器上安裝實(shí)際的軟盤(pán)(我的 Windows 桌面機(jī)有一個(gè) LS-120 驅(qū)動(dòng)器)。通過(guò)模擬來(lái)解決這個(gè)問(wèn)題吧!我在模擬器下運(yùn)行該程序,將數(shù)據(jù)寫(xiě)入已經(jīng)插入 Mac 的一個(gè) USB 軟盤(pán)驅(qū)動(dòng)器。
    硬件模擬也有其不利方面。為了讓一切都能夠運(yùn)轉(zhuǎn),需要付出很大努力。如果需要網(wǎng)絡(luò),那么還需要很好地模擬網(wǎng)絡(luò)芯片,以使得操作系統(tǒng)可以在這個(gè)芯片上運(yùn)行。此外,模擬本身所沒(méi)有的指令的代價(jià)可能非常高昂。通常,像這樣一個(gè)系統(tǒng)可以近乎完美地運(yùn)轉(zhuǎn),但是,與時(shí)限(timing)相關(guān)的功能可能會(huì)不可靠。
    完全硬件模擬器已經(jīng)使用了很長(zhǎng)時(shí)間,最適合處理速度可能受模擬影響的遺留系統(tǒng)和代碼。
    雖然如此,想要在 Macintosh 或者任何其他非 x-86 機(jī)器上運(yùn)行x86Linux二進(jìn)制程序的用戶,為了嘗試運(yùn)行程序,可能要完全依賴于某種當(dāng)前可用的x86模擬器。在類似這樣的系統(tǒng)上,大部分工具程序?qū)⑦\(yùn)行得非常好(雖然可能較慢)。要擔(dān)心的惟一一個(gè)主要顧慮是,為了提高性能,這種系統(tǒng)的用戶可能安裝較小的或者較老的 Linux 發(fā)行版本。使用 32 MB 內(nèi)存來(lái)運(yùn)行模擬機(jī)器的那些人不可能運(yùn)行最新版本的 KDE。
    部分硬件模擬器
    部分硬件模擬器是一個(gè)中間解決方案:它們模擬一臺(tái)計(jì)算機(jī),但是這臺(tái)計(jì)算機(jī)只能是與它們實(shí)際上所在的計(jì)算機(jī)類型相同的計(jì)算機(jī)。由于執(zhí)行的速度與宿主機(jī)器相當(dāng),所以類似這樣的程序可以降低模擬的成本。此類模擬器的示例包括 Serenity Virtual Station 和 VMWare。
    當(dāng)您擁有用于多種操作系統(tǒng)的應(yīng)用程序,而且需要同時(shí)運(yùn)行它們時(shí),這些系統(tǒng)最為實(shí)用。類似于完全硬件模擬,這樣的系統(tǒng)將運(yùn)行一個(gè)完全的 Linux OS 環(huán)境,只要您的程序能夠適當(dāng)?shù)乜鏛inux系統(tǒng)移植,那么就沒(méi)什么問(wèn)題。不過(guò),再次聲明,Linux的移植到較老版本的可移植性將有非常有用。使用虛擬機(jī)的人們可能愿意在這樣的系統(tǒng)上運(yùn)行一個(gè)較老的、占空間較小的 Linux 版本。
    軟件模擬器
    在模擬世界中,軟件模擬器是最基本的。軟件模擬器不在某臺(tái)虛擬機(jī)上運(yùn)行您的應(yīng)用程序——它不通過(guò)虛擬機(jī),而是實(shí)時(shí)地去運(yùn)行它。建立一個(gè)環(huán)境,在這個(gè)環(huán)境中,程序的代碼可以正常運(yùn)行,但是,程序訪問(wèn)操作系統(tǒng)的嘗試會(huì)被通過(guò)某個(gè)模擬層來(lái)發(fā)送,這樣,這些程序就可以使用了。WINE是一個(gè)極好的示例(雖然是用于Windows),盡管它并不是一個(gè)正式的模擬器。
    有一些軟件模擬器是由用戶顯式地調(diào)用,比如可用于 SCO 和 Solaris系統(tǒng)的lxrun程序。有些軟件模擬器則構(gòu)建成為UNIX內(nèi)核對(duì)加載二進(jìn)制映像的支持 —— 如果程序看起來(lái)不正確,那么,可以將它與一個(gè)可能模擬器表相對(duì)照,以查看它們是否可以運(yùn)行它。
    軟件模擬器通常會(huì)帶來(lái)最好的用戶體驗(yàn)。不需要特殊的設(shè)置,不需要龐大的磁盤(pán)映像。程序只需要去運(yùn)行即可(大部分情況下)。不過(guò),訪問(wèn)系統(tǒng)調(diào)用、共享程序庫(kù)以及文件系統(tǒng)結(jié)構(gòu)會(huì)引發(fā)許多問(wèn)題,所以,接下來(lái)我們將討論它們。
    系統(tǒng)調(diào)用
    系統(tǒng)調(diào)用是模擬中最簡(jiǎn)單也是最困難的部分。系統(tǒng)調(diào)用具有明確定義的接口,而且,通?梢苑奖愕貦z測(cè)并處理調(diào)用機(jī)制——這是簡(jiǎn)單的部分。困難之處在于可能難以或者不可能較好地實(shí)現(xiàn)系統(tǒng)調(diào)用。傳統(tǒng)上,Linux模擬中最難以處理的是clone()系統(tǒng)調(diào)用。這個(gè)調(diào)用提供了獲得簡(jiǎn)單線程的一個(gè)強(qiáng)制方法,即創(chuàng)建兩個(gè)共享許多內(nèi)容進(jìn)程,共享的內(nèi)容可以包括內(nèi)存、文件描述符、信號(hào)處理——換句話說(shuō),可以包括任何內(nèi)容和所有內(nèi)容。不幸的是,如果您的操作系統(tǒng)不具備與此完全類似的功能,那么沒(méi)有任何辦法來(lái)實(shí)現(xiàn)這個(gè)系統(tǒng)調(diào)用。
    更糟糕的是,由于當(dāng)POSIX線程還沒(méi)有完善或獲得廣泛支持之前,clone()就已經(jīng)出現(xiàn),并經(jīng)常被用作POSIX線程的替代,所以,許多程序都以多種令人興奮的、復(fù)雜的且(我必須要說(shuō))意想不到的方式來(lái)使用它。
    如果您想讓人們運(yùn)行您的二進(jìn)制程序,那么嘗試讓他們不要使用針對(duì)特定操作系統(tǒng)的系統(tǒng)調(diào)用;最好使用標(biāo)準(zhǔn)的POSIX系統(tǒng)調(diào)用。這是軟件開(kāi)發(fā)的一個(gè)良好的習(xí)慣做法。
    基于內(nèi)核的模擬器可以捕捉到到達(dá)它的系統(tǒng)調(diào)用。用戶空間模擬器,比如 lxrun,會(huì)等待應(yīng)用程序嘗試進(jìn)行系統(tǒng)調(diào)用。由于 Linux 系統(tǒng)調(diào)用功能與 Solaris 或SCOUNIX上的系統(tǒng)調(diào)用功能不同,所以結(jié)果是發(fā)生一個(gè)代碼段錯(cuò)誤。然后,lxrun程序像一個(gè)調(diào)試器那樣糾正這個(gè)錯(cuò)誤并使系統(tǒng)調(diào)用繼續(xù)運(yùn)行——但是,實(shí)際上,它已經(jīng)截取了這個(gè)系統(tǒng)調(diào)用,并向底層操作系統(tǒng)進(jìn)行相應(yīng)的系統(tǒng)調(diào)用,而且解決了所有問(wèn)題。聰明!
    文件系統(tǒng)結(jié)構(gòu)
    文件系統(tǒng)的問(wèn)題通常更為微妙。訪問(wèn)文件系統(tǒng)極其簡(jiǎn)單。不簡(jiǎn)單的是如何找到您想要的文件。
    如果您的程序在模擬環(huán)境中運(yùn)行,那么要訪問(wèn)的文件系統(tǒng)可能與您開(kāi)發(fā)程序時(shí)使用的文件系統(tǒng)有本質(zhì)上的不同。例如,如果您的程序使用了/proc文件系統(tǒng)(常用來(lái)獲得內(nèi)核狀態(tài)和信息),那么在較新的內(nèi)核中常見(jiàn)的特性在較老的系統(tǒng)中可能并不存在。
    這里的開(kāi)發(fā)人員比專有系統(tǒng)上的開(kāi)發(fā)人員擁有巨大的優(yōu)勢(shì),因?yàn)椴煌腖inux發(fā)行版本以不同方式安排文件,所以大部分程序員都非常清楚如何避免過(guò)分依賴于文件系統(tǒng)設(shè)計(jì)。但是 —— 有時(shí) —— 不得不將文件名嵌入到程序之中。
    許多模擬器解決這個(gè)難題所采取的一個(gè)方案是:建立一個(gè)針對(duì)文件系統(tǒng)調(diào)用的額外的解釋層。例如,在 NetBSD 的 Linux 模擬環(huán)境代碼中,首先根據(jù) /emul/linux中的文件檢查對(duì)文件的訪問(wèn),之后才對(duì)系統(tǒng)真正的root目錄中的文件進(jìn)行檢查。這就使得當(dāng)Linux二進(jìn)制程序不能使用標(biāo)準(zhǔn)文件時(shí),系統(tǒng)可以提供“覆蓋(override)”系統(tǒng)文件的文件。
    實(shí)際上,這一方法的主要用途在于程序庫(kù)和其他支持文件,不過(guò)也同樣提供了許多系統(tǒng)二進(jìn)制程序。例如,如果 Linux 二進(jìn)制程序嘗試調(diào)用 uname 來(lái)得到內(nèi)核版本,卻得到了NetBSD的版本號(hào),這將非常令人迷惑。取而代之,它應(yīng)得到所預(yù)期的 Linux 版本號(hào)。
    共享程序庫(kù)
    如前所述,共享程序庫(kù)是能夠被模擬的二進(jìn)制程序找到卻不能夠被系統(tǒng)二進(jìn)制程序找到的一個(gè)非常好的例子。由于在不同的系統(tǒng)上共享程序庫(kù)的格式和 ABI 細(xì)節(jié)可能各異,所以不能隨意假定所有的系統(tǒng)都可以共享某個(gè)給定的程序庫(kù)。名稱可能沖突 —— 例如,當(dāng)前NetBSD和SUSE7.3都擁有一個(gè)名為libncurses.so.5的文件。重要的是要使用其中正確的那一個(gè)。
    共享程序庫(kù)為開(kāi)發(fā)人員指出了另外一個(gè)注意事項(xiàng)。了解不同的系統(tǒng)正在使用的程序庫(kù)版本很重要,F(xiàn)在,NetBSD 的 Linux 模擬環(huán)境正在使用的是 SUSE 7.3 共享程序庫(kù)。仍然有使用9.1共享程序庫(kù)的代碼,但是它們會(huì)獲得警告,告之它們不能穩(wěn)定地進(jìn)行內(nèi)核級(jí)模擬。
    模擬環(huán)境軟件包通常遠(yuǎn)遠(yuǎn)跟不上市場(chǎng)的步伐。即使您覺(jué)得大部分預(yù)期用戶都應(yīng)該擁有了相當(dāng)新的Linux發(fā)行版本,但是大批模擬器還是幾乎全都有些跟不上時(shí)代。
    共享程序庫(kù)還引發(fā)了另一個(gè)顧慮——不是每個(gè)系統(tǒng)都包含全部共享程序庫(kù)。模擬環(huán)境軟件包通常不會(huì)安裝所有最新的共享程序庫(kù)。而且,更麻煩的是,它們的用戶也不太可能有能力輕松地安裝所缺少的軟件包。
    在這些情況下,最大限度地減少對(duì)新特性和非核心共享程序庫(kù)的依賴是一個(gè)好辦法。模擬器用戶可能會(huì)遇到這些問(wèn)題。
    不要誤以為使用靜態(tài)程序庫(kù)就可以保證解決這些問(wèn)題。靜態(tài)程序庫(kù)可能引入其自己的新的依賴,而且不容易檢查到它們。如果靜態(tài)地鏈接了一個(gè)使用某個(gè)不可移植的系統(tǒng)調(diào)用,那么通過(guò)重寫(xiě)算法來(lái)避免這個(gè)系統(tǒng)調(diào)用將沒(méi)有什么用處。動(dòng)態(tài)鏈接讓您構(gòu)建的程序能夠在更大范圍內(nèi)的系統(tǒng)上運(yùn)行。
    調(diào)用其他程序的程序
    有一種特別的情形比任何其他情形更令人們頭疼,尤其與安裝器相關(guān)。在很多系統(tǒng)上,調(diào)用 /bin/sh 所得到的 shell 不是bash。這就意味著使用 bash 擴(kuò)展的腳本可能不能在其他系統(tǒng)上運(yùn)行。
    這就陷入了模擬器中的一個(gè)特別錯(cuò)綜復(fù)雜的邏輯中。當(dāng)執(zhí)行二進(jìn)制程序時(shí),操作系統(tǒng)可能知道的足夠多,可以核對(duì)相關(guān)的Linux二進(jìn)制程序的Linux路徑,而且它可能在那里安裝 bash 的一個(gè)副本。但是,當(dāng)您運(yùn)行一個(gè)腳本時(shí),內(nèi)核不會(huì)將其看作是一個(gè) Linux二進(jìn)制程序;它發(fā)現(xiàn)腳本附帶有一個(gè)解釋程序路徑,當(dāng)嘗試加載解釋程序時(shí),它將不再運(yùn)行于模擬模式之下。
    可移植shell腳本技術(shù)在這里得到了應(yīng)用。當(dāng)用戶運(yùn)行被模擬的應(yīng)用程序時(shí),這是要面對(duì)的最常見(jiàn)問(wèn)題之一。安裝器可能會(huì)因?yàn)椴皇强梢浦驳?shell 腳本而不能運(yùn)行。
    類似于標(biāo)準(zhǔn)的開(kāi)發(fā),只是更為標(biāo)準(zhǔn)
    為了方便那些可能要在模擬環(huán)境中運(yùn)行您的程序的用戶,開(kāi)發(fā)軟件時(shí)需要緊記以下事項(xiàng),并且開(kāi)發(fā)任何軟件時(shí)都應(yīng)該緊記這些事項(xiàng):
    盡可能遵循適當(dāng)?shù)臉?biāo)準(zhǔn)。
    避免“專門(mén)特性”。
    不要挑戰(zhàn)極限(push the envelope)。
    而且,只要可以避免,就不要依賴于一個(gè)月前剛剛發(fā)布的某些東西來(lái)構(gòu)建您的代碼。因?yàn)槟菢幼鰧⒖s小您的有效的目標(biāo)市場(chǎng)。


    主站蜘蛛池模板: 欧美性猛交xxxx乱大交3| 337p日本欧洲亚洲大胆精品555588 | 国内一级特黄女人精品毛片| 久99久热只有精品国产男同 | 国产午夜福利精品一区二区三区 | 久久老子午夜精品无码怎么打| 欧美日韩视频精品一区二区| 啦啦啦在线免费观看| 金瓶全集漫画1到22回无遮| 国产网站免费观看| 一本色道久久鬼综合88| 无码国产福利av私拍| 亚洲午夜久久久精品影院| 波多野结衣gvg708| 双手扶在浴缸边迎合着h| 被强制侵犯的高贵冷艳人妇| 国产精品先锋资源站先锋影院| 一本到在线观看视频| 成人性生交大片免费看| 久久精品国产亚洲AV麻豆网站| 欧美japanese孕交| 亚洲精品无码国产| 白白的肥岳嗷嗷叫| 国产一级一片免费播放| 青青草国产免费| 国产精品igao视频网网址| bbw巨大丰满xxxx| 好男人观看免费视频播放全集| 久久亚洲中文字幕精品一区| 日韩国产免费一区二区三区| 亚洲国产精品欧美日韩一区二区 | 亚洲校园春色另类激情| 男生把女生桶爽| 国产va在线视频观看| 蜜汁肉桃h全篇| 国产欧美日韩中文久久| 97超级碰碰碰碰久久久久| 在线精品国产一区二区三区| 中国美女一级看片| 护士的小嫩嫩好紧好爽在线播放| 九九免费久久这里有精品23|