操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    文編譯自VGHF游戲歷史基金會(huì)網(wǎng)站文章SEGA VR REVIVED: EMULATING AN UNRELEASED GENESIS ACCESSORY(https://gamehistory.org/segavr/),作者為Rich Whitehouse,文中的“我”均指原作者Rich Whitehouse。

    自誕生以來,虛擬現(xiàn)實(shí)經(jīng)歷了幾波被稱為視頻游戲“Next Big Thing”的浪潮。

    90年代初期,虛擬現(xiàn)實(shí)的潛力給大眾帶來了充分想象空間。報(bào)紙、雜志、電視新聞?lì)l道甚至包括《The Lawnmower Man》等主流電影都在描繪VR引人注目的功能。包括任天堂在內(nèi)的不少公司都在嘗試將VR技術(shù)用于新的產(chǎn)品,但最終真正推向市場的僅僅只有少數(shù)。

    這一時(shí)期,世嘉也在積極探索如何設(shè)計(jì)一套價(jià)格合適的VR外設(shè),來拓展家用主機(jī)世嘉MD(即SEGA Genesis)的游戲性。與一些VR街機(jī)設(shè)備動(dòng)輒5位數(shù)的價(jià)格不同,世嘉VR頭顯的目標(biāo)售價(jià)僅200美元,配備高頻慣性測量單元和兩個(gè)LCD屏幕,與如今的VR頭顯設(shè)計(jì)十分相似。1993年世嘉向記者和經(jīng)銷商公布了這一全新的外設(shè),期望在VR的前沿領(lǐng)域取得新的突破。得益于當(dāng)時(shí)一家初創(chuàng)公司One-Sendai的專利授權(quán),世嘉VR頭顯的追蹤解決方案僅需1美元的生產(chǎn)成本,這也是其價(jià)格能夠低至200美元的關(guān)鍵。

    盡管世嘉官方對于最終取消VR頭顯上市給出的理由是:因?yàn)閂R體驗(yàn)過于逼真和沉浸,玩家可能在使用這款VR頭顯時(shí)因?yàn)樗奶幾邉?dòng)而面臨極高的傷害風(fēng)險(xiǎn),但這一理由十分牽強(qiáng)。因?yàn)槭兰螐乃固垢Q芯克@得的反饋稱,使用世嘉VR頭顯可能導(dǎo)致頭昏眼花甚至頭痛,特別是對于兒童和青少年有更高的風(fēng)險(xiǎn)。而世嘉前首席執(zhí)行官Tom Kalinske也在Retro Gamer Podcast的一集中證實(shí),后者才是世嘉放棄VR項(xiàng)目的主要原因。

    迄今為止,我們對于世嘉VR的了解大部分來源于早年CES展示的外觀原型、世嘉的廣告、專利文件以及來自內(nèi)部工作人員的部分資料,但這也意味著我們對于世嘉VR許多技術(shù)細(xì)節(jié)的了解大多基于推測,甚至根本是未知的。想要回顧和研究這樣一款在當(dāng)時(shí)來說突破了許多技術(shù)界限的產(chǎn)品,這些細(xì)節(jié)十分重要。無論世嘉VR是否實(shí)現(xiàn)了世嘉的野心,它在VR的歷史上依然是一款耀眼的產(chǎn)品。

    如果你想了解世嘉VR到底是一款怎樣的產(chǎn)品,最佳的選擇當(dāng)然是找到世嘉VR頭顯硬件,其次則是從世嘉VR的配套游戲入手,研究出游戲運(yùn)行時(shí)對硬件的需求,這樣我們也能夠獲取足夠多的信息來模擬真正的世嘉VR頭顯。通過軟件來推測出世嘉VR的真實(shí)體驗(yàn),正是我的研究目標(biāo)。

    世嘉VR這款產(chǎn)品公開時(shí),有多款為這一VR外設(shè)開發(fā)的游戲正在研發(fā)中,但由于世嘉VR取消了發(fā)售,這些游戲也隨之被埋入了歷史的塵埃。不過令人驚喜的是,來自 Gaming Alexandria的Dylan Mansfield努力聯(lián)系上了Futurescape Productions的聯(lián)合創(chuàng)始人Kenneth Hurley,他們曾為世嘉VR開發(fā)了一款名為《Nuclear Rush》的第一人稱動(dòng)作游戲。

    《Nuclear Rush》的背景設(shè)定在2032年,化石即將枯竭,而世界對于電力的需求仍在不斷增長。玩家在游戲中需要進(jìn)入擁有老式核反應(yīng)堆的秘密區(qū)域,收集放射性燃料。由于畫面和背景較為相似,這款游戲常常被和另一款世嘉VR游戲《Iron Hammer》混淆。1993年的夏季CES上,《Nuclear Rush》放出了部分未加入最終版本HUD的游戲畫面,更加清晰的展示了游戲本身的內(nèi)容。

    在Dylan聯(lián)系上Hurley并表明了自己對于世嘉VR的興趣后,Hurley拿出了一張1994年8月6日制作的CD-ROM光盤,這張光盤包含了《Nuclear Rush》的完整源碼,并且歷經(jīng)26年依然沒有任何的數(shù)據(jù)丟失。

    這張光盤正是對世嘉VR探索的起點(diǎn)。我們首先要做的是編譯《Nuclear Rush》并讓其能夠正常運(yùn)行,然后通過這款游戲,在世嘉VR廢棄超過25年后的今天,重建世嘉歷史中值得被銘記的一頁。

    構(gòu)建光盤源碼

    盡管Hurley的光盤中包含了《Nuclear Rush》的完整源碼,卻沒有包含任何已經(jīng)編譯好的二進(jìn)制文件。為了能夠?qū)⒃创a很好的組織起來,Dylan找到了我。乍一看,我們已經(jīng)收集齊了編譯游戲所需的全部資料,包括所有的美術(shù)資源和大部分需要的工具,盡管其中有部分?jǐn)?shù)據(jù)來自光盤上另一款世嘉游戲《Monster Hunter(怪物獵人)》

    大部分《Nuclear Rush》的游戲代碼是用C語言寫的,需要使用Sierra 68000 C語言編譯器進(jìn)行編譯,其中包含了一些樣板代碼(例如世嘉VR頭顯驅(qū)動(dòng))以及其他零碎的匯編代碼。游戲代碼編譯最耗時(shí)的部分是縮放工具(scaler),同樣用C語言編寫,但是進(jìn)行了一些改造。編譯器會(huì)按照需要根據(jù)C語言代碼生成本地M68K代碼,供游戲運(yùn)行時(shí)調(diào)用。

    除標(biāo)準(zhǔn)的構(gòu)建(Build)工具之外,構(gòu)建過程還需要一些專有工具來提取美術(shù)資源數(shù)據(jù)并將其轉(zhuǎn)換成游戲直接使用的格式。例如CVTSCE.EXE用來提取靜態(tài)背景以及UI;ANM2FPA用來提取可選RLE的縮放化精靈和動(dòng)畫;最后LZSSC.EXE用標(biāo)準(zhǔn)的LZSS壓縮算法(12-bit偏移,4-bit長度)來壓縮CVTSCE.EXE生成的資源。

    在我首次嘗試構(gòu)建時(shí),發(fā)現(xiàn)有一個(gè)工具DUMP.EXE缺失了。查找該工具可能的作用時(shí),我發(fā)現(xiàn)它只是打開了一個(gè)文件,然后使用stdout逐個(gè)字節(jié)將信息寫入該文件中,以便匯編程序能夠讀取該二進(jìn)制文件。在花費(fèi)了寶貴的時(shí)間用Borland C ++ 3.0編寫一些代碼后,我生成了一個(gè)替換的可執(zhí)行文件,最終成功完成了源碼的構(gòu)建。

    源碼構(gòu)建成功后生成了一個(gè)COFF格式文件,但游戲ROM最重要的部分被分成了數(shù)個(gè)額外的文件。我希望在相同的MS-DOS環(huán)境下將這些文件打包成可運(yùn)行的游戲ROM,因此向好友Borland尋求幫助讓他幫忙寫了另一個(gè)程序來分析COFF文件,從而生成正確包含其他文件的二進(jìn)制ROM,并在該ROM的頭部寫入校驗(yàn)數(shù)據(jù)。

    首次運(yùn)行ROM文件

    當(dāng)我在MD模擬器中首次運(yùn)行構(gòu)建出的ROM文件時(shí),模擬器的歡迎畫面讓我非常開心:至少游戲已經(jīng)進(jìn)入了正常的執(zhí)行步驟。

    但顯而易見的是,我并沒有頭部追蹤器。游戲成功識(shí)別了頭部追蹤器的缺失,進(jìn)入了非VR的運(yùn)行模式。隨著背景音樂的播放,游戲似乎運(yùn)行的非常正常,直到我按下開始按鈕并進(jìn)入主菜單。菜單字體使用的調(diào)色板似乎損壞了,所有的菜單文字都很難辨認(rèn)。我嘗試著加載游戲的第一關(guān),但程序計(jì)數(shù)器開始報(bào)錯(cuò),整個(gè)程序崩潰了。

    像往常一樣,Debug的時(shí)間到了。我從COFF文件中轉(zhuǎn)儲(chǔ)(dump)出了全部的Debug符號(hào),然后使用這些符號(hào)的地址加入了一些新的斷點(diǎn),來查看關(guān)卡加載出錯(cuò)前程序都做了寫什么。

    經(jīng)過一段時(shí)間的反復(fù)嘗試,我發(fā)現(xiàn)游戲成功的加載了第一關(guān),甚至在崩潰前還顯示了1-2幀的畫面,然后縮放器為一個(gè)精靈設(shè)置了一個(gè)錯(cuò)誤的偏移,并造成了后續(xù)一系列的程序錯(cuò)誤。前文提到過,我從另一個(gè)游戲的數(shù)據(jù)中提取了一些工具,這就是問題的所在。這些工具可能在完成《Nuclear Rush》后更改了部分代碼,最終我在縮放器主入口代碼前幾行發(fā)現(xiàn)了導(dǎo)致問題的代碼:

    后兩行指針的累加是為了跳過一些完全無用的數(shù)據(jù),而這些數(shù)據(jù)不知什么時(shí)候似乎已經(jīng)從ANM2FPA.EXE的輸出中被移除了。既然這些數(shù)據(jù)已經(jīng)完全被移除,我只需要?jiǎng)h除這兩行指針累加的命令即可。

    完成改動(dòng)后,關(guān)卡終于能正常加載了,但背景中一些圖塊和一些HUD精靈依然顯示為亂碼。這看起來應(yīng)該和之前是同樣的問題,由于《怪物獵人》游戲的數(shù)據(jù)格式發(fā)生了改動(dòng)導(dǎo)致工具代碼發(fā)生變化,只不過沒有像之前的代碼那樣造成災(zāi)難性的后果。最終在一個(gè)忙碌的周六,我排查解決了之前遇到的問題并重新構(gòu)建了一版正確的ROM,最終成功進(jìn)入了游戲的關(guān)卡中,享受我的首次《Nuclear Rush》之旅。

    尋找游戲源碼BUG

    當(dāng)游戲能夠正常運(yùn)行后,我還需要回頭去解決一些之前碰到的其他BUG。我并不知道到底有多少BUG是由于工具的混用引起的,有多少是游戲“最終”版本的遺留BUG。這里的“最終”指的不是最終零售版本,盡管游戲已經(jīng)有效的完成了開發(fā),但顯然沒有經(jīng)歷過經(jīng)典的debug過程來保證游戲的質(zhì)量。

    根據(jù)整個(gè)代碼中出現(xiàn)的少量WCES94預(yù)處理程序檢查,我推測《Nuclear Rush》原本計(jì)劃在1994年冬季CES上再次進(jìn)行展示。而Kenneth1994年8月6日刻錄的CD-ROM盡管包含了游戲接近開發(fā)完成時(shí)的源代碼,但顯然還不是能夠作為商業(yè)發(fā)行的版本。

    在整個(gè)游戲中泛濫的調(diào)色板錯(cuò)誤很可能還是和構(gòu)建時(shí)用到的工具集有關(guān),這是一個(gè)很有意思的問題。CVTSCE.EXE文件很可能在《Nuclear Rush》開發(fā)完成后也被修改,同時(shí)在文章前半部分的圖片中你也能夠看到,CVTSCE.EXE打包資源其實(shí)還有很多參數(shù)可以進(jìn)行設(shè)置,這些參數(shù)影響了資源打包成為二進(jìn)制文件的方式。調(diào)色板的錯(cuò)誤可能和CVTSCE.EXE的默認(rèn)參數(shù)有關(guān),但還存在著更深層次的問題。

    CVTSCE.EXE提取的許多基于圖塊的源圖像都用到了多個(gè)調(diào)色板,數(shù)量和偏移也不盡相同。例如,一幅圖像可能使用調(diào)色板1和調(diào)色板2,而另一幅圖像可能僅使用調(diào)色板0,依此類推。CVTSCE.EXE輸出的文件格式旨在為文件中的第一個(gè)調(diào)色板指定索引,并設(shè)定調(diào)色板的數(shù)量。加載圖像后,它將使用該索引和計(jì)數(shù)來確定當(dāng)前使用的調(diào)色板并將其加載到CRAM中。這里的問題是調(diào)色板索引/計(jì)數(shù)的默認(rèn)值對《Nuclear Rush》中的所有圖像來說可能都是錯(cuò)誤的,而且我沒有看到任何文件數(shù)據(jù)幫助說明工具針對目錄之外的內(nèi)容使用時(shí)如何進(jìn)行設(shè)置。

    最終我不得不修改CVTSCE.EXE工具。我添加了一個(gè)選項(xiàng)來掃描圖塊地圖,找出圖塊引用的調(diào)色板,并使用該數(shù)據(jù)確定調(diào)色板范圍和要輸出的計(jì)數(shù)。我不知道這一工具最初如何處理《Nuclear Rush》的圖塊資源,但按照我目前的方法進(jìn)行處理已經(jīng)不再出現(xiàn)問題。

    在硬件上進(jìn)行實(shí)機(jī)測試時(shí),我還遇到了一個(gè)大問題。《Nuclear Rush》將畫面的水平滾動(dòng)與基于滾動(dòng)表的垂直滾動(dòng)相結(jié)合,較新的MD主機(jī)型號(hào)可以通過這種方式正常處理畫面的滾動(dòng),但是較舊的機(jī)型可能會(huì)導(dǎo)致背景的左側(cè)出現(xiàn)空白列。發(fā)生這種情況時(shí),游戲畫面看起來像這樣:

    《Nuclear Rush》會(huì)嘗試通過檢查硬件的版本(寄存器$ A10001)來避免此問題,如果版本檢查返回0,程序會(huì)強(qiáng)制截?cái)嗨綕L動(dòng),這意味著實(shí)際上畫面背景一次只能滾動(dòng)一個(gè)圖塊,避免了空白列的問題。但這樣就造成了畫面的水平滾動(dòng)十分不平滑,給玩家的感覺很遲鈍。由于該問題在特定MD機(jī)型上的出現(xiàn)毫無征兆,因此僅僅截?cái)嗨綕L動(dòng)顯然不是最理想的解決方案。我碰巧有一臺(tái)第二版的MD主機(jī),在進(jìn)行版本檢測時(shí)返回值大于0,但后續(xù)的MD主機(jī)才進(jìn)行了VDP(Video Display Processor)的改進(jìn)從而解決了這一問題,因此我在自己的MD上運(yùn)行游戲時(shí)也碰到了背景出現(xiàn)空白列的狀況。

    《Nuclear Rush》利用垂直滾動(dòng)表來實(shí)現(xiàn)圍繞Z軸的旋轉(zhuǎn)(Roll)效果。通過為滾動(dòng)表中的每個(gè)列條目累積一個(gè)小的偏移量,并通過應(yīng)用對象所屬列的偏移量來補(bǔ)償Sprite的位置,可以達(dá)到下圖中的顯示效果:

    相比對程序進(jìn)行大的改動(dòng),我通過加入在菜單中加入一個(gè)選項(xiàng)進(jìn)行了簡單的修復(fù)。該選項(xiàng)設(shè)置游戲畫面的四種渲染模式,第一種模式會(huì)禁用垂直滾動(dòng)表(允許在較舊的硬件版本上進(jìn)行平滑滾動(dòng)),第二種模式會(huì)強(qiáng)制進(jìn)行平滑滾動(dòng)(即使因?yàn)橛布恢С謺?huì)導(dǎo)致空白列的出現(xiàn)),第三種模式則會(huì)強(qiáng)制截?cái)嗨綕L動(dòng),第四種模式模式將恢復(fù)原始的硬件版本檢查。該選項(xiàng)不是萬能的,但可以改進(jìn)游戲在第二版MD主機(jī)上的運(yùn)行情況,也能夠適配后續(xù)更新型號(hào)的MD主機(jī)。

    之后,我還對游戲進(jìn)行了少量其他的debug工作直到對游戲狀態(tài)感到滿意為止,其中包括了修復(fù)DMA計(jì)時(shí)錯(cuò)誤和一些崩潰,使輸入密碼的功能再次生效,并且修復(fù)了一堆僅在游戲以立體模式運(yùn)行時(shí)出現(xiàn)的問題。

    通過模擬器模擬世嘉VR

    工作終于進(jìn)行到模擬世嘉VR頭顯這一步了。這也是最讓我興奮的一步。如果我只有一個(gè)預(yù)先構(gòu)建的ROM鏡像而不是源代碼,我可能還需要進(jìn)行大量的拆裝篩選,以找出游戲想要從VR頭顯中獲得什么樣的數(shù)據(jù)。但是,有了源代碼,這一過程就容易得多了。

    《Nuclear Rush》的源代碼有兩個(gè)文件可供參考世嘉VR頭顯的通信數(shù)據(jù)。HEADSET.ASM是由Sega of America提供的原始驅(qū)動(dòng)程序源代碼,而VRDRV.ASM是《Nuclear Rush》基于原始驅(qū)動(dòng)修改后的版本,兩套源代碼處理VR頭顯數(shù)據(jù)的核心方法是相同的。驅(qū)動(dòng)程序源碼還引用了“VR.DOC/VR.TXT”,其中可能包含關(guān)于接入VR頭顯的一些有趣的技術(shù)信息,但不幸的是,該文件是缺失的。不過我已經(jīng)有足夠多的信息可以僅從源代碼來讓VR功能正常運(yùn)行起來。

    讀取VR頭顯數(shù)據(jù)是通過多路復(fù)用方案進(jìn)行的,就像普通的世嘉MD手柄一樣。實(shí)際上,與VR頭顯的所有交互都是通過游戲手柄2號(hào)端口進(jìn)行的,驅(qū)動(dòng)程序會(huì)假定VR頭顯已經(jīng)正常接入游戲主機(jī)。

    軟件方面,VR頭顯的初始化從握手開始。該軟件將TR和TH引腳都設(shè)置為通過寄存器$ A1000B寫入。與僅將TH引腳設(shè)置為寫入的標(biāo)準(zhǔn)手柄不同,這種設(shè)置讓我們通過兩位(2 Bits)來區(qū)分通過寄存器$ A10005向VR頭顯發(fā)送的不同命令類型。例如發(fā)送(TR+TH)給VR頭顯表示讓頭顯進(jìn)入閑置模式,$ 40(TH)則讓VR頭顯進(jìn)行復(fù)位。我正是利用了復(fù)位命令來讓世嘉MD模擬器進(jìn)入VR模式。當(dāng)發(fā)出閑置模式的命令后,軟件會(huì)觸發(fā)$ 20(TR),以推進(jìn)可從$ A10005讀取的數(shù)據(jù)。軟件空閑命令后會(huì)立即讀取$ 70作為響應(yīng)的確認(rèn),并驗(yàn)證TH,TR和TL是否按預(yù)期設(shè)置。軟件確認(rèn)之后會(huì)發(fā)送VR頭顯標(biāo)識(shí)$ 08,$ 00,并將其后半部分作為保留數(shù)據(jù)。如果初始化過程中的任何部分沒有按預(yù)期進(jìn)行,驅(qū)動(dòng)程序就會(huì)認(rèn)為初始化出錯(cuò),然后游戲就會(huì)以非VR模式運(yùn)行。

    ▲模擬器VR模式初始化成功

    初始握手完成后,程序?qū)㈨樞蜃x取所有VR頭顯數(shù)據(jù),請求當(dāng)前的偏航角(Yaw),俯仰角(Pitch)和左/右眼的位數(shù)據(jù)。Z軸旋轉(zhuǎn)數(shù)據(jù)的缺失意味著世嘉VR頭顯只能用于跟蹤兩個(gè)旋轉(zhuǎn)軸。同時(shí),我不知道程序會(huì)從IMU讀取怎樣的位置漂移數(shù)據(jù),也不知道在累計(jì)角度運(yùn)動(dòng)之前應(yīng)用了哪種濾波器,因?yàn)閂R頭顯需要向程序提供絕對坐標(biāo)和角度。這意味著游戲僅僅讀取了VR頭顯的輸出數(shù)據(jù)并按原樣應(yīng)用它,而不會(huì)對數(shù)據(jù)進(jìn)行其他處理。雖然這樣一來僅憑軟件我很難知道硬件內(nèi)部發(fā)生了什么,但是考慮到世嘉MD的處理能力時(shí),這種實(shí)現(xiàn)細(xì)節(jié)很有意義。

    現(xiàn)在,我需要了解VR頭顯初始化后的數(shù)據(jù)流格式,幸運(yùn)的是,驅(qū)動(dòng)程序源碼的注釋很好地列出了所有內(nèi)容:

    上圖是VR頭顯讀取功能返回的數(shù)據(jù)格式,x位是32位寄存器頭部的未使用位,其中包含了讀取函數(shù)返回時(shí)VR頭顯數(shù)據(jù)的累加值。

    這樣的數(shù)據(jù)格式表示我們需要分別使用9Bit來表示VR頭顯的360度左右轉(zhuǎn)動(dòng)角度和60度的俯仰角度。L/R位指定VR頭顯下一步要掃描的眼睛。在我的實(shí)現(xiàn)中,我使用32位浮點(diǎn)值來儲(chǔ)存角度數(shù)據(jù),以保持敏感的高精度輸入。當(dāng)將角度返回給世嘉MD時(shí),我會(huì)首先對浮點(diǎn)數(shù)據(jù)取整然后進(jìn)行量化和編碼。

    uint32_t encode_headset_angles(const float *pAngles)

    {

    //assumes angles have already been clamped

    const uint32_t pitch=(pAngles[0] >=0.0f) ? (uint8_t)pAngles[0] : ((uint8_t)-pAngles[0] ^ 0xFF) | (1 << 16);

    const uint32_t yaw=(uint32_t)pAngles[1];

    return pitch | ((yaw & 0xFF) << 8) | ((yaw & 0x100) << 9);

    }

    該函數(shù)的輸出將與雙眼位數(shù)據(jù)的模擬進(jìn)行結(jié)合,接下來的工作就是更有意思的顯示同步了。

    《Nuclear Rush》如何進(jìn)行雙眼畫面渲染?

    《Nuclear Rush》被設(shè)計(jì)為按照鎖定的15Hz幀率運(yùn)行,這意味著完整的游戲循環(huán)每秒將運(yùn)行15次。但是VBlank仍然會(huì)以60Hz的頻率進(jìn)行。

    注:CRT顯示器通過將電子束發(fā)射到熒光屏上來顯示圖像。顯示畫面時(shí),電子束將按照從左到右、從上到下的順序來掃描整個(gè)屏幕從而顯示一幅完整的畫面。VBlank是指電子束從瞄準(zhǔn)屏幕右下角調(diào)整到重新瞄準(zhǔn)屏幕左上角的時(shí)間段。

    在VBlank中斷結(jié)束時(shí),程序會(huì)讀取了VR頭顯的數(shù)據(jù),但在下一個(gè)VBlank開始時(shí),我們還要從前一個(gè)VBlank中讀取VR頭顯數(shù)據(jù),以確定要對哪只眼睛對應(yīng)的屏幕(可能會(huì)啟動(dòng)DMA)進(jìn)行掃描輸出畫面。因此盡管世嘉VR頭顯的驅(qū)動(dòng)程序源碼顯示其支持以60Hz運(yùn)行,但《Nuclear Rush》僅在每隔一個(gè)VBlank的末尾時(shí)讀取VR頭顯的數(shù)據(jù)。

    如果你將世嘉MD連接到舊的NTSC顯示器時(shí),假設(shè)VDP不在隔行模式下運(yùn)行,它將以大約60Hz的頻率掃描生成新的畫面幀。通常,由于VR頭顯需要顯示雙眼的畫面,以60Hz的頻率生成新的畫面幀意味著每只眼的畫面都會(huì)以30Hz的頻率更新。但《Nuclear Rush》讀取VR頭顯數(shù)據(jù)并掃描幀的方式實(shí)在有點(diǎn)怪異。

    《Nuclear Rush》輸出幀的方式:

    1.進(jìn)入VBlank

    ?讀取上一幀VBlank時(shí)的頭顯數(shù)據(jù)。設(shè)置左眼位。

    ?設(shè)置左眼屏幕為下一次掃描目標(biāo)。

    ?VBlank結(jié)束時(shí)再次讀取頭顯數(shù)據(jù)。設(shè)置右眼位。

    2.掃描左眼屏幕。

    3.進(jìn)入VBlank

    ?讀取上一幀VBlank時(shí)的頭顯數(shù)據(jù)。右眼位已設(shè)置。

    ?設(shè)置右眼屏幕為下次掃描目標(biāo)。

    ?跳過頭顯數(shù)據(jù)讀取。這是一次異常的VBlank。

    4.掃描右眼屏幕。

    5.進(jìn)入VBlank

    ?讀取上一幀VBlank結(jié)束時(shí)的頭顯數(shù)據(jù)。右眼位已設(shè)置。上一個(gè)VBlank結(jié)束時(shí)跳過了頭顯數(shù)據(jù)的讀取。

    ?設(shè)置右眼屏幕為下次掃描目標(biāo)。

    ? VBlank結(jié)束時(shí)再次讀取頭顯數(shù)據(jù)。設(shè)置左眼位。

    6.掃描右眼屏幕。

    7.進(jìn)入VBlank

    ?讀取上一幀VBlank時(shí)的頭顯數(shù)據(jù)。左眼位已設(shè)置。

    ?設(shè)置左眼屏幕為下一次掃描目標(biāo)。

    ?VBlank結(jié)束時(shí)跳過讀取頭顯數(shù)據(jù)。又一次異常VBlank。

    8.掃描左眼屏幕。

    9.回到第1步重復(fù)整個(gè)循環(huán)。

    所以按照上文的序列,《Nuclear Rush》實(shí)際上是按照“左、左、右、右”的順序來掃描顯示游戲畫面。以立體模式直接查看游戲輸出的畫面也證實(shí)了這一點(diǎn)。下圖從左到右展示的是游戲連續(xù)4幀的畫面,順序正是左左右右。

    這樣的渲染方式令我感到奇怪,因?yàn)橥ǔ碚f世嘉VR頭顯在掃描顯示畫面時(shí)應(yīng)當(dāng)采用左右交替的順序,而且世嘉VR頭顯的硬件設(shè)計(jì)也不太可能圍繞讓每個(gè)顯示屏僅以15Hz幀率顯示特定畫面來而開展。唯一的解釋是,VR頭顯僅在讀取數(shù)據(jù)時(shí)會(huì)更改其顯示目標(biāo),這樣的方案也更加通用,無論我們每個(gè)VBlank結(jié)束時(shí)都讀取頭顯數(shù)據(jù)還是每隔一個(gè)VBlank才讀取頭顯數(shù)據(jù)都能夠正常工作。

    世嘉VR頭顯期望游戲在每個(gè)VBlank結(jié)束時(shí)讀取自身數(shù)據(jù),并告訴游戲在下一個(gè)VBlank結(jié)束時(shí)期望為左眼還是右眼生成畫面。這是我對于世嘉VR頭顯畫面顯示方式的理論。而我在嘗試運(yùn)行《Nuclear Rush》時(shí)也成功實(shí)現(xiàn)了這種方式,僅在讀取VR頭顯數(shù)據(jù)后切換顯示目標(biāo),取得了很好的顯示效果。

    同時(shí)我還嘗試著實(shí)現(xiàn)讓游戲輸出畫面立體化。為此我專門編寫了3D立體畫面的后處理代碼,該后處理在將顏色映射為亮度后會(huì)將左右眼的輸出組合在一起。我在模擬器配置中自定義了雙眼的顏色,并對當(dāng)時(shí)我使用的眼鏡做了改造。最終的成果看起來很漂亮:

    但運(yùn)行游戲時(shí),我還是注意到了一些異常,在轉(zhuǎn)動(dòng)頭部時(shí),雙眼的畫面偶爾會(huì)不同步,這在3D立體模式下尤其明顯:

    最初,我以為我的代碼出現(xiàn)了問題,重新進(jìn)行了調(diào)試。我連續(xù)截取了4幀畫面,并設(shè)法找到了畫面不同步的地方:

    上圖4幀的渲染順序?yàn)樽笞笥矣遥悄隳軌蛎黠@的看到右眼第二幀實(shí)際上前進(jìn)了很多距離。當(dāng)截取這些畫面時(shí),我在VR頭顯中向左轉(zhuǎn)動(dòng)了頭部,但這里游戲?qū)嶋H上在右眼的兩幀畫面之間向前移動(dòng)了很長的距離。

    目前還沒有發(fā)現(xiàn)如何阻止這種情況發(fā)生,同時(shí)它也可能出現(xiàn)在任何時(shí)刻,甚至是左右眼畫面切換的時(shí)候。游戲在每一幀畫面后都會(huì)等待4次VBlank來保持15Hz幀率鎖定,但偶爾的卡頓可能導(dǎo)致意外出現(xiàn),游戲可能在未與VR頭顯同步的情況下就設(shè)置了下一次為哪只眼睛生成畫面。這一問題可能同樣會(huì)出現(xiàn)在真正的世嘉VR頭顯上。由于實(shí)際顯示畫面時(shí),世嘉VR頭顯主要依靠視覺的持久性來補(bǔ)償?shù)头直媛省⒌退⑿侣室约皶r(shí)序的限制,在其他狀況都比較糟糕的情況下,這一問題很可能不那么明顯,甚至不能被稱為問題。

    最終我在游戲源代碼中添加了一些內(nèi)容,讓游戲每次循環(huán)結(jié)束時(shí)都會(huì)和頭顯進(jìn)行同步,解決了這一問題。我很好奇這樣做會(huì)不會(huì)真的能改善世嘉VR頭顯的體驗(yàn),還是說每個(gè)VBlank結(jié)束時(shí)對VR頭顯進(jìn)行采樣會(huì)帶來額外的開銷,但這一問題可能永遠(yuǎn)都沒法得出答案。

    全新的世嘉VR體驗(yàn)

    既然游戲已經(jīng)能夠顯示3D影像,我也可以通過搖桿來模擬VR頭顯的轉(zhuǎn)動(dòng),自然而然我開始想真正的把《Nuclear Rush》搬到VR中。

    我制作了一個(gè)特別版本的《Nuclear Rush》,并進(jìn)行了一些修復(fù)使游戲在非立體模式下能夠以30Hz運(yùn)行,更改了每個(gè)VBlank上VR頭顯的采樣,并啟用了上一章節(jié)中提到的修復(fù)以使VR頭顯能夠和游戲畫面同步。在立體聲模式下,VR頭顯也可以始終保持15Hz的幀率。為了增強(qiáng)這一特殊的游戲版本,我還為世嘉VR模擬器添加了一個(gè)選項(xiàng),實(shí)現(xiàn)了模擬器對M68K的超頻。

    盡管以30Hz刷新率運(yùn)行會(huì)導(dǎo)致游戲邏輯的實(shí)際運(yùn)行頻率比最初高出兩倍,游戲的感覺仍然不錯(cuò)。另一方面,由于擺脫了ROM不能超過2MB大小的限制,我還能夠通過靜態(tài)的擴(kuò)展更多精靈數(shù)據(jù),并加入針對性優(yōu)化。

    既然游戲準(zhǔn)備好在要求更高的VR環(huán)境中運(yùn)行,現(xiàn)在我應(yīng)當(dāng)將重點(diǎn)轉(zhuǎn)移到復(fù)原世嘉VR體驗(yàn)上了。我的下一步工作將是在模擬器中添加對現(xiàn)代VR頭顯的支持。我基于OpenVR編寫了MD模擬器對于HTC Vive Cosmos的支持。

    要實(shí)現(xiàn)模擬器對于VR的支持,主要工作在于從模擬器獲取立體的畫面輸出并直接傳輸?shù)絍R頭顯中。這看起來似乎很簡單,但并不是一個(gè)普通的用例,還有一些特殊事項(xiàng)需要注意。我必須對模擬器提供的“原始”正交投影畫面進(jìn)行處理,來適應(yīng)眼睛/鏡頭的畸變。我還必須去掉OpenVR庫中全部的運(yùn)動(dòng)平滑或插幀算法,這意味著要在維持VR頭顯內(nèi)部刷新率的同時(shí),保證MD模擬器鎖定60Hz的輸出。

    當(dāng)我解決了OpenVR的時(shí)序問題后,還要處理更多世嘉VR時(shí)序問題,世嘉VR頭顯似乎并未嘗試對眼前的屏幕進(jìn)行同步。為了能夠在不對ROM進(jìn)行任何更改的情況下正確運(yùn)行《Nuclear Rush》,我在模擬器中添加了一個(gè)名為dgen_openvr_eyes_sync的選項(xiàng)。如果啟用此選項(xiàng),并嘗試運(yùn)行未修復(fù)同步問題的《Nuclear Rush》版本,會(huì)經(jīng)常發(fā)現(xiàn)自己變成了斗雞眼。這實(shí)際上就是前文提到的問題:游戲本身并沒有什么機(jī)制來阻止雙眼顯示畫面不同步。

    為了盡量逼真的再現(xiàn)世嘉VR頭顯體驗(yàn),我會(huì)在雙眼畫面掃描生成后立刻更新緩沖區(qū)數(shù)據(jù),也正是因?yàn)殡p眼的畫面全部都會(huì)立即傳輸給VR頭顯,如果這些畫面并不是來自游戲的同一幀,就會(huì)導(dǎo)致畫面閃爍的情況發(fā)生。

    不過只要你打開模擬器的同步選項(xiàng)并運(yùn)行游戲的同步版本,顯示就會(huì)變得一切正常!

    畫面的長寬比和視角是另外兩個(gè)要處理的重要問題。默認(rèn)情況下,我會(huì)處理每只眼睛的圖像,將其調(diào)整為適合MD的寬高比,但是玩家也可以禁用默認(rèn)設(shè)置并將其更改為所需的任何相對寬高比例。

    由于我并不了解世嘉VR頭顯所用屏幕或鏡片的確切物理參數(shù),因此我只能猜測世嘉VR頭顯的有效視野,失真數(shù)據(jù)。我向模擬器添加了一個(gè)名為dgen_openvr_imgpscale的選項(xiàng),該選項(xiàng)可用于更改人眼投影空間中圖像的大小。

    之后,我為模擬器添加了自定義鏡片形狀的功能。通過Noesis腳本,玩家可以將最常見的模型格式文件導(dǎo)入作為鏡片的模型數(shù)據(jù),然后模擬器會(huì)將該數(shù)據(jù)用在人眼投影空間中渲染全部的畫面。上圖是對魚眼鏡頭測試,也圖中顯示了鏡片的模型。

    這種方法使我們能夠在數(shù)學(xué)上生成我們想要的任何透鏡形狀而不必考慮模型的計(jì)算成本。除了自定義鏡片外,還可以使用選項(xiàng)dgen_openvr_bilinear啟用雙線性過濾。盡管我通常不喜歡在模擬器中使用雙線性濾波進(jìn)行畫面縮放,但它在這種情況下可以幫助減輕迷失感。

    到這里為止,我們終于可以使用一臺(tái)現(xiàn)代VR頭顯來模擬世嘉VR頭顯的體驗(yàn)了,還開發(fā)了一整套用于微調(diào)的工具。盡管這樣的模擬無法做到100%還原,但這確實(shí)非常接近世嘉VR的體驗(yàn)。

    刷新率僅15Hz的VR游戲可玩性卻比我預(yù)期的要好得多,雖然視角轉(zhuǎn)動(dòng)有所限制,但也不會(huì)太令人討厭。這種體驗(yàn)不是所有人都能夠接受,不過我在其中度過了一段愉快的時(shí)光!即使游戲本身的采樣率有限,我們也可以從低延遲的頭部跟蹤中受益匪淺。

    從這里開始,我們還可以繼續(xù)進(jìn)行更多有趣的后續(xù)開發(fā)。我可能會(huì)嘗試基于現(xiàn)有的世嘉VR代碼來增加對房間規(guī)模跟蹤的支持,或創(chuàng)建一個(gè)接口用來在真實(shí)的硬件上模擬世嘉VR頭顯。目前的模擬相較真實(shí)的世嘉VR頭顯也仍然還有很大的提升空間,通過調(diào)整不同的視角和運(yùn)動(dòng)濾鏡,我們可能得到更逼近真實(shí)的體驗(yàn)。

    源代碼和下載

    我為這個(gè)項(xiàng)目在GitHub上創(chuàng)建了兩個(gè)倉庫,你可以在其中找到源代碼和二進(jìn)制文件。

    支持世嘉VR的模擬器

    Github倉庫:https://github.com/DickBlackshack/SegaVR-DGenSDL。

    Windows可執(zhí)行程序下載:https://github.com/DickBlackshack/SegaVR-DGenSDL/releases/tag/1.0。

    《Nuclear Rush》可直接構(gòu)建的源代碼和所有必需的工具

    Github倉庫:https://github.com/DickBlackshack/SegaVR-NuclearRush。

    ROM映像下載:https://github.com/DickBlackshack/SegaVR-NuclearRush/releases/tag/1.0。

    上面的游戲ROM可以在大多數(shù)模擬器或MD實(shí)機(jī)上運(yùn)行,但必須使用提供的模擬器才能獲得真正的世嘉VR體驗(yàn)。該模擬器還增加了很多選項(xiàng),你可以仔細(xì)閱讀配置文件來探索更多模擬器配置。你可能還需要對配置進(jìn)行一些更改才能選擇匹配VR頭顯的旋轉(zhuǎn)參數(shù)。

    如果您想要使用自己的VR頭顯進(jìn)行體驗(yàn),可以在這方面進(jìn)行多種調(diào)整嘗試。如果你發(fā)現(xiàn)自己感到迷失方向或在默認(rèn)設(shè)置下很難跟蹤運(yùn)動(dòng),可以嘗試減小int_openvr_imgpscale的值,直到感覺VR體驗(yàn)更舒服為止。
    【93913原創(chuàng)內(nèi)容,轉(zhuǎn)載請注明及回鏈

    源展示了人類共同協(xié)作,成果分享的魅力,每一次技術(shù)發(fā)展都是站在巨人的肩膀上,技術(shù)諸多創(chuàng)新和發(fā)展往往就是基于開源發(fā)展起來的,沒有任何一家網(wǎng)絡(luò)公司可以不使用開源技術(shù),僅靠自身技術(shù)而發(fā)展起來。

    騰訊開源了個(gè)很多非常有價(jià)值的項(xiàng)目,下面我們一起按照Stars(受歡迎程度)來盤點(diǎn)下這些開源項(xiàng)目。


    1、微信原生視覺的基礎(chǔ)樣式庫 WeUI star:21429


    WeUI 是一套同微信原生視覺體驗(yàn)一致的基礎(chǔ)樣式庫,由微信官方設(shè)計(jì)團(tuán)隊(duì)為微信 Web 開發(fā)量身設(shè)計(jì),可以令用戶的使用感知更加統(tǒng)一。

    包含button、cell、dialog、 progress、 toast、article、actionsheet、icon等各式元素。




    WeUI 是一套同微信原生視覺體驗(yàn)一致的基礎(chǔ)樣式庫,由微信官方設(shè)計(jì)團(tuán)隊(duì)為微信內(nèi)網(wǎng)頁和微信小程序量身設(shè)計(jì),令用戶的使用感知更加統(tǒng)一。

    WeUI-Design 是微信官方設(shè)計(jì)團(tuán)隊(duì)設(shè)計(jì)的一套同微信原生視覺體驗(yàn)一致的基礎(chǔ)視覺樣式庫,目前提供 Sketch 與 PSD 基礎(chǔ)樣式庫源文件。

    開發(fā)者或設(shè)計(jì)師可以使用 WeUI-Design 進(jìn)行微信 Web 開發(fā)的原型設(shè)計(jì)、視覺設(shè)計(jì)等。

    手機(jī)掃碼預(yù)覽:




    項(xiàng)目地址:

    https://github.com/Tencent/weui

    官網(wǎng):

    https://weui.io

    2、一款讓小程序支持組件化開發(fā)的框架 WePY star:16621

    WePY (發(fā)音: /'wepi/)是一款讓小程序支持組件化開發(fā)的框架,通過預(yù)編譯的手段讓開發(fā)者可以選擇自己喜歡的開發(fā)風(fēng)格去開發(fā)小程序。

    框架的細(xì)節(jié)優(yōu)化,Promise,Async Functions的引入都是為了能讓開發(fā)小程序項(xiàng)目變得更加簡單,高效。

    特性:

    類Vue開發(fā)風(fēng)格

    支持自定義組件開發(fā)

    支持引入NPM包

    支持Promise

    支持ES2015+特性,如Async Functions

    支持多種編譯器,Less/Sass/Stylus/PostCSS、Babel/Typescript、Pug

    支持多種插件處理,文件壓縮,圖片壓縮,內(nèi)容替換等

    支持 Sourcemap,ESLint等

    小程序細(xì)節(jié)優(yōu)化,如請求列隊(duì),事件優(yōu)化等


    項(xiàng)目地址:

    https://github.com/Tencent/wepy

    官網(wǎng):

    https://tencent.github.io/wepy/

    3、微信官方的Android熱補(bǔ)丁解決方案 Tinker star:13237



    微信開源的 Android 熱修復(fù)框架 Tinker,支持在無需升級(jí)APK的前提下更新 dex, library and resources 文件。

    Tinker是微信官方的Android熱補(bǔ)丁解決方案,它支持動(dòng)態(tài)下發(fā)代碼、So庫以及資源,讓應(yīng)用能夠在不需要重新安裝的情況下實(shí)現(xiàn)更新。當(dāng)然,你也可以使用Tinker來更新你的插件。

    它主要包括以下幾個(gè)部分:

    gradle編譯插件: tinker-patch-gradle-plugin

    核心sdk庫: tinker-android-lib

    非gradle編譯用戶的命令行版本: tinker-patch-cli.jar

    項(xiàng)目地址:

    https://github.com/Tencent/tinker

    4、微信官方的跨平臺(tái)跨業(yè)務(wù)的終端基礎(chǔ)組件 Mars star:12071




    Mars 是微信官方的跨平臺(tái)跨業(yè)務(wù)的終端基礎(chǔ)組件,是一個(gè)使用 C++ 編寫的業(yè)務(wù)性無關(guān)、平臺(tái)性無關(guān)的基礎(chǔ)組件。目前已接入微信 Android、iOS、Mac、Windows、WP 等客戶端。


    主要包括以下幾個(gè)部分:

    COMM:基礎(chǔ)庫,包括socket、線程、消息隊(duì)列、協(xié)程等基礎(chǔ)工具;

    XLOG:通用日志模塊,充分考慮移動(dòng)終端的特點(diǎn),提供高性能、高可用、安全性、容錯(cuò)性的日志功能;

    SDT:網(wǎng)絡(luò)診斷模塊;

    STN:信令傳輸網(wǎng)絡(luò)模塊(核心模塊),負(fù)責(zé)終端與服務(wù)器的小數(shù)據(jù)信令通道。包含了微信終端在移動(dòng)網(wǎng)絡(luò)上的大量優(yōu)化經(jīng)驗(yàn)與成果,經(jīng)歷了微信海量用戶的考驗(yàn)。

    項(xiàng)目地址:

    https://github.com/Tencent/mars

    5、輕量級(jí)的高性能的Hybrid框架 VasSonic star:9254




    VasSonic取名于世嘉動(dòng)畫形象音速小子,是騰訊QQ會(huì)員 VAS團(tuán)隊(duì)研發(fā)的一個(gè)輕量級(jí)的高性能的Hybrid框架,專注于提升頁面首屏加載速度,完美支持靜態(tài)直出頁面和動(dòng)態(tài)直出頁面,兼容離線包等方案。

    接入VasSonic后首次打開可以在初始化APP的時(shí)候并行請求頁面資源,并且具備邊加載邊渲染的能力。非首次打開時(shí),APP可以快速加載上次打開動(dòng)態(tài)緩存在本地的頁面資源,然后動(dòng)態(tài)刷新頁面。騰訊手機(jī)QQ通過VasSonic框架使得頁面首屏耗時(shí)平均低于1S以下。

    項(xiàng)目地址:

    https://github.com/Tencent/VasSonic


    6、一個(gè)輕量、可拓展、針對手機(jī)網(wǎng)頁的前端開發(fā)者調(diào)試面板 vConsole star:8136




    vConsole是一個(gè)輕量、可拓展、針對手機(jī)網(wǎng)頁的前端開發(fā)者調(diào)試面板。

    特性:

    查看 console 日志

    查看網(wǎng)絡(luò)請求

    查看頁面 element 結(jié)構(gòu)

    查看 Cookies、localStorage 和 SessionStorage

    手動(dòng)執(zhí)行 JS 命令行

    自定義插件

    掃碼預(yù)覽:





    項(xiàng)目地址:

    https://github.com/Tencent/vConsole

    7、通用Web組件化框架 Omi star:7383





    Omi 是一款用于創(chuàng)建用戶界面的組件化框架,開放并且現(xiàn)代,故得名:Omi(Open and modern framework for building user interfaces)。

    特性:

    超小的尺寸,7 kb (gzip)

    局部 CSS,HTML+ Scoped CSS + JS 組成可復(fù)用的組件。不用擔(dān)心組件的 CSS 會(huì)污染組件外的,Omi會(huì)幫你處理好一切

    更自由的更新,每個(gè)組件都有 update 方法,自由選擇時(shí)機(jī)進(jìn)行更新。你也可以和 obajs 或者 mobx 一起使用來實(shí)現(xiàn)自動(dòng)更新

    模板引擎可替換,開發(fā)者可以重寫 Omi.template 方法來使用任意模板引擎

    完全面向?qū)ο螅瘮?shù)式和面向?qū)ο蟾饔袃?yōu)劣,Omi 使用完全的面向?qū)ο蟮姆绞絹順?gòu)建 Web 程序

    ES6+ 和 ES5 都可以,Omi 提供了 ES6+ 和 ES5 的兩種開發(fā)方案。你可以自有選擇你喜愛的方式

    項(xiàng)目地址:

    https://github.com/Tencent/omi


    8、高效的 C++ JSON 解析/生成器 RapidJSON star:7296



    RapidJSON 是一個(gè) C++ 的 JSON 解析器及生成器,提供 SAX 及 DOM 風(fēng)格 API。它的靈感來自 RapidXml。

    RapidJSON 小而全。它同時(shí)支持 SAX 和 DOM 風(fēng)格的 API。SAX 解析器只有約 500 行代碼。

    RapidJSON 快。它的性能可與 strlen() 相比。可支持 SSE2/SSE4.2 加速。

    RapidJSON 獨(dú)立。它不依賴于 BOOST 等外部庫。它甚至不依賴于 STL。

    RapidJSON 對內(nèi)存友好。在大部分 32/64 位機(jī)器上,每個(gè) JSON 值只占 16 字節(jié)(除字符串外)。它預(yù)設(shè)使用一個(gè)快速的內(nèi)存分配器,令分析器可以緊湊地分配內(nèi)存。

    RapidJSON 對 Unicode 友好。它支持 UTF-8、UTF-16、UTF-32 (大端序/小端序),并內(nèi)部支持這些編碼的檢測、校驗(yàn)及轉(zhuǎn)碼。例如,RapidJSON 可以在分析一個(gè) UTF-8 文件至 DOM 時(shí),把當(dāng)中的 JSON 字符串轉(zhuǎn)碼至 UTF-16。它也支持代理對(surrogate pair)及 "\u0000"(空字符)。

    項(xiàng)目地址:

    https://github.com/Tencent/RapidJSON

    9、微信開源的高效、完整、易用的移動(dòng)數(shù)據(jù)庫框架 WCDB star:6988

    WCDB是一個(gè)高效、完整、易用的移動(dòng)數(shù)據(jù)庫框架,基于SQLCipher,支持iOS, macOS和Android。

    WCDB for iOS/macOS

    特性:

    WINQ(WCDB語言集成查詢): 通過WINQ,開發(fā)者無須為了拼接SQL的字符串而寫一大坨膠水代碼。

    ORM(Object Relational Mapping): WCDB支持靈活、易用的ORM。開發(fā)者可以很便捷地定義表、索引、約束,并進(jìn)行增刪改查操作。

    多線程高并發(fā): WCDB支持多線程讀與讀、讀與寫并發(fā)執(zhí)行,寫與寫串行執(zhí)行。

    加密:WCDB提供基于SQLCipher的數(shù)據(jù)庫加密。

    損壞修復(fù): WCDB內(nèi)建了Repair Kit用于修復(fù)損壞的數(shù)據(jù)庫。

    反注入: WCDB內(nèi)建了對SQL注入的保護(hù)。

    項(xiàng)目地址:

    https://github.com/Tencent/wcdb

    10、基于 mmap 內(nèi)存映射的移動(dòng)端通用 key-value 組件 MMKV

    star:6521

    MMKV 是基于 mmap 內(nèi)存映射的 key-value 組件,底層序列化/反序列化使用 protobuf 實(shí)現(xiàn),性能高,穩(wěn)定性強(qiáng)。從 2015 年中至今在微信上使用,其性能和穩(wěn)定性經(jīng)過了時(shí)間的驗(yàn)證。

    近期也已移植到 Android / macOS / Windows 平臺(tái),一并開源。

    MMKV 源起:

    在微信客戶端的日常運(yùn)營中,時(shí)不時(shí)就會(huì)爆發(fā)特殊文字引起系統(tǒng)的 crash,參考文章,文章里面設(shè)計(jì)的技術(shù)方案是在關(guān)鍵代碼前后進(jìn)行計(jì)數(shù)器的加減,通過檢查計(jì)數(shù)器的異常,來發(fā)現(xiàn)引起閃退的異常文字。在會(huì)話列表、會(huì)話界面等有大量 cell 的地方,希望新加的計(jì)時(shí)器不會(huì)影響滑動(dòng)性能;另外這些計(jì)數(shù)器還要永久存儲(chǔ)下來——因?yàn)殚W退隨時(shí)可能發(fā)生。

    這就需要一個(gè)性能非常高的通用 key-value 存儲(chǔ)組件,我們考察了 SharedPreferences、NSUserDefaults、SQLite 等常見組件,發(fā)現(xiàn)都沒能滿足如此苛刻的性能要求。

    考慮到這個(gè)防 crash 方案最主要的訴求還是實(shí)時(shí)寫入,而 mmap 內(nèi)存映射文件剛好滿足這種需求,我們嘗試通過它來實(shí)現(xiàn)一套 key-value 組件。

    項(xiàng)目地址:

    https://github.com/Tencent/mmkv

    請各位保持關(guān)注「騰訊技術(shù)工程」公眾號(hào),我們會(huì)持續(xù)更新騰訊開源項(xiàng)目。

    . Linux內(nèi)核目錄文件說明

    1.1 內(nèi)核空間和用戶空間

    在下載內(nèi)核前,我們應(yīng)該討論一些重要的術(shù)語和事實(shí)。首先了解一下內(nèi)核空間和用戶空間

    內(nèi)核空間中存放的是內(nèi)核代碼和數(shù)據(jù),而進(jìn)程的用戶空間中存放的是用戶程序的代碼和數(shù)據(jù)。不管是內(nèi)核空間還是用戶空間,它們都處于虛擬空間中。

    1.1.1 內(nèi)核空間

    Linux內(nèi)核是一個(gè)宏內(nèi)核,這意味著整個(gè)操作系統(tǒng)都運(yùn)行在內(nèi)核預(yù)留的內(nèi)存里。

    • 內(nèi)核所使用的空間是內(nèi)核預(yù)留的
    • 只有內(nèi)核可以使用預(yù)留的內(nèi)核空間
    • 內(nèi)核擁有這些內(nèi)存空間,直到系統(tǒng)關(guān)閉
    • 在內(nèi)核空間,一旦內(nèi)存被占用,則沒有任何其他程序可以使用這塊空間。

    1.1.2 用戶空間

    用戶空間是內(nèi)存上用戶程序擁有的空間。比如瀏覽器、電子游戲、文字處理器、媒體播放器、壁紙、主題等都是放在內(nèi)存里的用戶空間。當(dāng)一個(gè)程序關(guān)閉的時(shí)候,任何程序都可以使用新釋放的空間。

    1.2 Linux內(nèi)核

    1.2.1 Linux內(nèi)核也是一個(gè)搶占式多任務(wù)內(nèi)核。

    這意味該內(nèi)核可以暫停一些任務(wù)來保證任何應(yīng)用都有機(jī)會(huì)來使用CPU。舉個(gè)例子,如果一個(gè)應(yīng)用正在運(yùn)行且正在等待一些數(shù)據(jù),內(nèi)核會(huì)把這個(gè)應(yīng)用暫停,并允許其他的程序使用新釋放的CPU資源,直到數(shù)據(jù)到來。

    1.2.2 Linux內(nèi)核使得設(shè)備作為文件顯示在/dev文件夾下。

    如USB端口位于/dev/bus/usb,硬盤分區(qū)位于/dev/disk/分區(qū)。因?yàn)檫@個(gè)特性,許多人說:“在Linux上,一切皆文件”。如果一個(gè)用戶想要訪問在存儲(chǔ)卡上的數(shù)據(jù),他們能通過設(shè)備文件訪問這些數(shù)據(jù)。

    1.2.3 Linux內(nèi)核是可移植的。

    可移植性是Linux流行的一個(gè)最重要的原因。可移植性使得內(nèi)核可以工作在各種處理器和系統(tǒng)上。一些內(nèi)核支持的處理器的型號(hào)包括:Alpha、AMD、ARM、C6X、Intel、x86、Blackfin、Microblaze、MIPS、PowerPC、SPARC、UltraSPARC等。

      在引導(dǎo)文件夾(/boot)下,用戶會(huì)看到諸如“vmlinux”或者“vmlinuz”的文件。這兩者都是已編譯的Linux內(nèi)核。以“z”結(jié)尾的是已壓縮的。“vm”代表虛擬內(nèi)存。在SPARC處理器的系統(tǒng)上,用戶可以看見一個(gè)zImage文件。一小部分用戶可以發(fā)現(xiàn)一個(gè)bzImage文件,這也是一個(gè)已壓縮的Linux內(nèi)核。無論用戶有哪個(gè)文件,這些引導(dǎo)文件都是不能更改的,除非用戶知道他們正在做什么。否則系統(tǒng)會(huì)變成無法引導(dǎo),也就是說系統(tǒng)啟動(dòng)不了了。

    內(nèi)核源代碼就是程序編碼。有了源代碼,程序員可以修改內(nèi)核并能觀察到內(nèi)核是如何工作的。

    1.3下載內(nèi)核

    現(xiàn)在我們想更多地了解了內(nèi)核,就要下載內(nèi)核源代碼。本文使用的源代碼是Linux kernel 3.9.4.這個(gè)文章系列的所有指導(dǎo)對于所有的內(nèi)核版本是相同的(或者非常相似的)

      在下載并解壓內(nèi)核源代碼后,用戶可以看到許多文件夾和文件。源代碼以一個(gè)特定的方式組織的。這使開發(fā)者能夠輕松找到任何文件或者內(nèi)核的一部分。

    1.3.1 kernel第一級(jí)目錄

    內(nèi)核源代碼的根目錄下包含了以下文件夾

    arch
    block
    crypto
    Documentation
    drivers
    firmware
    fs
    include
    init
    ipc
    kernel
    lib
    mm
    net
    samples
    scripts
    security
    sound
    tools
    usr
    virt

      arch -- 這個(gè)文件夾包含了一個(gè)Kconfig文件,它用于設(shè)置這個(gè)目錄里的源代碼編譯所需的一系列設(shè)定。每個(gè)支持的處理器架構(gòu)都在它相應(yīng)的文件夾中。如,Alpha處理器的源代碼在alpha文件夾中。請記住,隨著時(shí)間的推移,一些新的處理器將被支持,有些會(huì)被放棄。


      block -- 此文件夾包含塊設(shè)備驅(qū)動(dòng)程序的代碼,該目錄用于實(shí)現(xiàn)塊設(shè)備的基本框架和塊設(shè)備的I/O調(diào)度算法。塊設(shè)備是以數(shù)據(jù)塊方式接收和發(fā)送的數(shù)據(jù)的設(shè)備。數(shù)據(jù)塊都是一塊一塊的數(shù)據(jù)而不是持續(xù)的數(shù)據(jù)流。


      crypto -- 這個(gè)文件夾包含許多加密算法的源代碼。例如,“sha1_generic.c”這個(gè)文件包含了SHA1加密算法的代碼。


      Documentation -- 此文件夾包含了內(nèi)核信息和其他許多文件信息的文本文檔。如果開發(fā)者需要一些信息,他們也許能在這里找到所需要的信息。


      drivers -- 該目錄包含了驅(qū)動(dòng)代碼。驅(qū)動(dòng)是一個(gè)控制硬件的軟件。例如,要讓計(jì)算機(jī)知道鍵盤并使其可用,鍵盤驅(qū)動(dòng)是必要的。這個(gè)文件夾中存在許多文件夾。每個(gè)文件夾都以硬件的種類或者型號(hào)命名。例如,'bluetooth'包含了藍(lán)牙驅(qū)動(dòng)程序的代碼。還有其他很明顯的驅(qū)動(dòng)像SCSI、USB和火線等。有些驅(qū)動(dòng)程序可能會(huì)比較難找到。例如,操縱桿驅(qū)動(dòng)不在'joystick'文件夾中,它們卻在./drivers/input/joystick。同樣鍵盤和鼠標(biāo)驅(qū)動(dòng)也在這個(gè)input文件夾中。 'Macintosh'包含了蘋果的硬件代碼。 'Xen'包含了Xen hypervisor代碼(hypervisor是一種允許用戶在一臺(tái)計(jì)算機(jī)上運(yùn)行多個(gè)操作系統(tǒng)的軟件或硬件。這意味著在Xen允許用戶在一臺(tái)計(jì)算機(jī)上同時(shí)運(yùn)行的兩個(gè)或兩個(gè)以上的Linux系統(tǒng)。用戶還可以運(yùn)行Windows,Solaris,F(xiàn)reeBSD或其他操作系統(tǒng)在Linux系統(tǒng)上)。driver文件夾下還有許多其他的文件夾,但他們在這篇文章中無法一一列舉,他們將在以后的文章中提到。


      firmware -- 包含讓計(jì)算機(jī)讀取和理解從設(shè)備發(fā)來的信號(hào)的代碼。舉例來說,一個(gè)攝像頭管理它自己的硬件,但計(jì)算機(jī)必須了解攝像頭給計(jì)算機(jī)發(fā)送的信號(hào)。Linux系統(tǒng)會(huì)使用vicam固件(firmware)來理解攝像頭的通訊。否則,沒有了固件,Linux系統(tǒng)將不知道如何處理攝像頭發(fā)來的信息。另外,固件同樣有助于將Linux系統(tǒng)發(fā)送消息給該設(shè)備。這樣Linux系統(tǒng)可以告訴攝像頭重新調(diào)整或關(guān)閉攝像頭。


      fs -- 這是文件系統(tǒng)的文件夾。理解和使用的文件系統(tǒng)所需要的所有的代碼就在這里。在這個(gè)文件夾里,每種文件系統(tǒng)都有自己的文件夾。例如,ext4文件系統(tǒng)的代碼在ext4文件夾內(nèi)。 在fs文件夾內(nèi),開發(fā)者會(huì)看到一些不在文件夾中的文件。這些文件用來控制整個(gè)文件系統(tǒng)。例如,mount.h中會(huì)包含掛載文件系統(tǒng)的代碼。文件系統(tǒng)是以結(jié)構(gòu)化的方式來存儲(chǔ)和管理的存儲(chǔ)設(shè)備上的文件和目錄。每個(gè)文件系統(tǒng)都有自己的優(yōu)點(diǎn)和缺點(diǎn)。這是由文件系統(tǒng)的設(shè)計(jì)決定的。舉例來說,NTFS文件系統(tǒng)支持的透明壓縮(當(dāng)啟用時(shí),會(huì)在用戶不知道的情況下自動(dòng)壓縮存儲(chǔ)文件)。大多數(shù)文件系統(tǒng)缺乏此功能,但如果在fs文件夾里編入相應(yīng)的文件,它們也有這種能力。


      include -- include包含了內(nèi)核所需的各種頭文件。這個(gè)名字來自于C語言用"include"來在編譯時(shí)導(dǎo)入頭文件。


      init -- init文件夾包含了內(nèi)核啟動(dòng)的處理代碼(INITiation)。main.c是內(nèi)核的核心文件,這是用來銜接所有的其他文件的源代碼主文件。


      ipc -- IPC代表進(jìn)程間通訊。----用于實(shí)現(xiàn)System V的進(jìn)程間通信(Inter Process Communication,IPC)模塊 . 此文件夾中的代碼是作為內(nèi)核與進(jìn)程之間的通信層。內(nèi)核控制著硬件,因此程序只能請求內(nèi)核來執(zhí)行任務(wù)。假設(shè)用戶有一個(gè)打開DVD托盤的程序。程序不直接打開托盤,相反,該程序通知內(nèi)核托盤應(yīng)該被打開。然后,內(nèi)核給硬件發(fā)送一個(gè)信號(hào)去打開托盤。這些代碼同樣管理kill信號(hào)。舉例來說,當(dāng)系統(tǒng)管理員打開進(jìn)程管理器去關(guān)閉一個(gè)已經(jīng)鎖死的程序,這個(gè)關(guān)閉程序的信號(hào)被稱為kill信號(hào)。內(nèi)核接收到信號(hào),然后內(nèi)核會(huì)要求程序停止或直接把進(jìn)程從內(nèi)存和CPU中移除(取決于kill的類型)。命令行中的管道同樣用于進(jìn)程間通信。管道會(huì)告訴內(nèi)核在某個(gè)內(nèi)存頁上寫入輸出數(shù)據(jù)。程序或者命令得到的數(shù)據(jù)是來自內(nèi)存頁上的某個(gè)給定的指針。


      kernel -- 這個(gè)文件夾中的代碼控制內(nèi)核本身。例如,如果一個(gè)調(diào)試器需要跟蹤問題,內(nèi)核將使用這個(gè)文件夾中代碼來將內(nèi)核指令通知調(diào)試器跟蹤內(nèi)核進(jìn)行的所有動(dòng)作。這里也有跟蹤時(shí)間的代碼。在內(nèi)核文件夾下有個(gè)"power"文件夾,這里的代碼可以使計(jì)算機(jī)重新啟動(dòng)、關(guān)機(jī)和掛起。


      lib -- 這個(gè)文件夾包含了內(nèi)核需要引用的一系列內(nèi)核庫文件代碼。


      mm -- mm文件夾中包含了內(nèi)存管理代碼。內(nèi)存并不是任意存儲(chǔ)在RAM芯片上的。相反,內(nèi)核小心地將數(shù)據(jù)放在RAM芯片上。內(nèi)核不會(huì)覆蓋任何正在使用或保存重要數(shù)據(jù)的內(nèi)存區(qū)域。


      net -- net文件夾中包含了網(wǎng)絡(luò)協(xié)議代碼。這包括IPv6、AppleTalk、以太網(wǎng)、WiFi、藍(lán)牙等的代碼,此外處理網(wǎng)橋和DNS解析的代碼也在net目錄。


      samples -- 此文件夾包含了程序示例和正在編寫中的模塊代碼。假設(shè)一個(gè)新的模塊引入了一個(gè)想要的有用功能,但沒有程序員說它已經(jīng)可以正常運(yùn)行在內(nèi)核上。那么,這些模塊就會(huì)移到這里。這給了新內(nèi)核程序員一個(gè)機(jī)會(huì)通過這個(gè)文件夾來獲得幫助,或者選擇一個(gè)他們想要協(xié)助開發(fā)的模塊。


      scripts -- 這個(gè)文件夾有內(nèi)核編譯所需的腳本。最好不要改變這個(gè)文件夾內(nèi)的任何東西。否則,您可能無法配置或編譯內(nèi)核。


      security -- 這個(gè)文件夾是有關(guān)內(nèi)核安全的代碼。它對計(jì)算機(jī)免于受到病毒和黑客的侵害很重要。否則,Linux系統(tǒng)可能會(huì)遭到損壞。關(guān)于內(nèi)核的安全性,將在以后的文章中討論。


      sound -- 這個(gè)文件夾中包含了聲卡驅(qū)動(dòng)。------存放聲音系統(tǒng)架構(gòu)相關(guān)代碼和具體聲卡的設(shè)備驅(qū)動(dòng)程序


      tools -- 這個(gè)文件夾中包含了和內(nèi)核交互的工具。


      usr -- 還記得在以前的文章中提到vmlinuz和其他類似的文件么?這個(gè)文件夾中的代碼在內(nèi)核編譯完成后創(chuàng)建這些文件。----該目錄中的代碼為內(nèi)核尚未完全啟動(dòng)時(shí)執(zhí)行用戶空間代碼提供了支持


      virt -- 此文件夾包含了虛擬化代碼,它允許用戶一次運(yùn)行多個(gè)操作系統(tǒng)。這與先前提到的Xen是不同的。通過虛擬化,客戶機(jī)操作系統(tǒng)就像任何其他運(yùn)行在Linux主機(jī)的應(yīng)用程序一樣運(yùn)行。通過Xen這樣的hypervisor(注:虛擬機(jī)管理程序),兩個(gè)操作系統(tǒng)可以同時(shí)管理硬件。在虛擬化中,在客戶機(jī)操作系統(tǒng)上運(yùn)行在Linux內(nèi)核上,而在hypervisor中,它沒有客戶系統(tǒng)并且所有的系統(tǒng)不互相依賴。


      還有一些文件在源代碼的根目錄下。它們會(huì)在下面列出。


      COPYING --許可和授權(quán)信息。Linux內(nèi)核在GPLv2許可證下授權(quán)。該許可證授予任何人有權(quán)免費(fèi)去使用、修改、分發(fā)和共享源代碼和編譯代碼。然而,沒有人可以出售源代碼。


      CREDITS -- 貢獻(xiàn)者列表


      Kbuild -- 這是一個(gè)設(shè)置一些內(nèi)核設(shè)定的腳本。打個(gè)比方,這個(gè)腳本設(shè)定一個(gè)ARCH變量,這是開發(fā)者想要生成的內(nèi)核支持的處理器類型。


      Kconfig -- 這個(gè)腳本會(huì)在開發(fā)人員配置內(nèi)核的時(shí)候用到,這會(huì)在以后的文章中討論。


      MAINTAINERS -- 這是一個(gè)目前維護(hù)者列表,他們的電子郵件地址,主頁,和他們負(fù)責(zé)開發(fā)和維護(hù)的內(nèi)核的特定部分或文件。當(dāng)一個(gè)開發(fā)者在內(nèi)核中發(fā)現(xiàn)一個(gè)問題,并希望能夠報(bào)告給能夠處理這個(gè)問題的維護(hù)者時(shí),這是是很有用的。


      Makefile -- This script is the main file that is used to compile the kernel. This file passes parameters to the compiler as well as the list of files to compile and any other necessary information. 這個(gè)腳本是編譯內(nèi)核的主要文件。這個(gè)文件將編譯參數(shù)和編譯所需的文件和必要的信息傳給編譯器。


      README -- 這個(gè)文檔提供給開發(fā)者想要知道的如何編譯內(nèi)核的信息。


      REPORTING-BUGS -- 這個(gè)文檔提供如何報(bào)告問題的信息。


    整理了很多Linux后臺(tái)架構(gòu)師學(xué)習(xí)資料,視頻,面試題,請私信


    1.3.2 kernel第二級(jí)目錄

    1.3.2.1 ARCH目錄

    對于Linux v3.9.4,arch下有以下文件夾:

    alpha
    arc
    arm
    arm64
    avr32
    blackfin
    c6x
    cris
    frv
    h8300
    hexagon
    ia64
    m32r
    m68k
    metag
    microblaze
    mips
    mn10300
    openrisc
    parisc
    powerpc
    s390
    score
    sh
    sparc
    tile
    um
    unicore32
    x86
    xtensa

    該目錄中每個(gè)子目錄都與某種體系結(jié)構(gòu)對應(yīng),用于存放系統(tǒng)結(jié)構(gòu)相關(guān)代碼,向平臺(tái)無關(guān)的系統(tǒng)核心模塊提供所需的功能接口。每個(gè)體系結(jié)構(gòu)對應(yīng)的子目錄下通常至少包含以下幾個(gè)子目錄:


    Kernel子目錄

    用于存放特定體系結(jié)構(gòu)特有信號(hào)量的實(shí)現(xiàn)代碼和對稱多處理器(Symmetric MultiProccessing,簡稱SMP)相關(guān)模塊。

    • Lib子目錄:用于存放以來依賴當(dāng)前體系結(jié)構(gòu)的輔助功能,如利用當(dāng)前體系結(jié)構(gòu)特性實(shí)現(xiàn)的strlen和memcpy內(nèi)存操作函數(shù);與通用的實(shí)現(xiàn)方法相比,他們的開銷小、更加高效。
    • Mm子目錄:用于存放體系架構(gòu)特定的內(nèi)存管理模塊,包括內(nèi)存的初始化、頁表管理等內(nèi)容。
    • Boot子目錄:該目錄中包含了當(dāng)前平臺(tái)上系統(tǒng)引導(dǎo)過程使用的部分或全部代碼。這部分代碼以來當(dāng)前平臺(tái),用于完成向系統(tǒng)內(nèi)存裝載內(nèi)核鏡像的工作。


    各處理器簡單介紹


    alpha處理器

    Alpha 處理器最早由美國DEC 公司設(shè)計(jì)制造,在Compaq (康柏)公司收購DEC 之后,Alpha 處理器繼續(xù)得到發(fā)展,并且應(yīng)用于許多高檔的Compaq 服務(wù)器上,HP (惠普)收購的Compaq ,Alpha 便為HP(惠普)所有,不過HP (惠普)已經(jīng)放棄發(fā)展alpha 處理器。


    arm處理器

    Arm 系列處理器 是英國Arm 公司設(shè)計(jì)的主流嵌入式32 位RISC 處理器,Arm 公司不直接生產(chǎn)Arm 處理器,而是采用IP 授權(quán)的方式由第3 方開發(fā)生產(chǎn),著名的公司如Ti 、Samsung 等都有出品Arm 處理器。目前在手機(jī)領(lǐng)域廣泛應(yīng)用。


    avr32處理器

    Avr32 處理器美國 Atmel 公司設(shè)計(jì)開發(fā)的32 位RISC 處理器, 設(shè)計(jì)目的是在每一個(gè)時(shí)鐘周期內(nèi)完成更多處理工作,從而在較低的時(shí)鐘頻率下實(shí)現(xiàn)相同的吞吐量。適合在工業(yè)控制、汽車電子等嵌入式設(shè)備領(lǐng)域中使用。Avr32 屬于MCU 型的處理器。


    blackfin處理器

    Blackfin 處理器是美國ADI 公司開發(fā)的具有DSP 能力的 32 位RISC 處理器, Blackfin 處理器基于由 ADI 和 Intel 公司聯(lián)合開發(fā)的微信號(hào)架構(gòu) (MSA ), 適用于 嵌入式音頻、視頻和通信應(yīng)用等領(lǐng)域。


    cris處理器

    Cris 處理器是 瑞典 Axis 通信公司開發(fā)的32 位RISC 處理器,主要用于網(wǎng)絡(luò)設(shè)備,屬于比較專業(yè)的應(yīng)用領(lǐng)域。因?yàn)?Axis 通信公司主要開發(fā)網(wǎng)絡(luò)監(jiān)控設(shè)備,所以 Cris 處理器在其網(wǎng)絡(luò)監(jiān)控設(shè)備中應(yīng)用廣泛。


    frv處理器

    Frv 處理器是 日本富士通開發(fā)的32 位高性能RISC處理器, 采用VLIW (Very Long Instruction Word )構(gòu)架,具備良好的多媒體處理能力,在機(jī)頂盒(STB )、數(shù)碼刻錄機(jī)(DVR )、數(shù)碼相機(jī)(DSC)等嵌入式領(lǐng)域應(yīng)用廣泛。


    h8300處理器

    H8300 處理器是 日本瑞薩科技開發(fā)的32 位高性能RISC 處理器, 具有強(qiáng)大的位操作指令,最適于實(shí)時(shí)控制應(yīng)用如汽車電子、家用電器、醫(yī)療器械等領(lǐng)域。H8300 屬于MCU 型的處理器。


    ia64處理器

    Ia64 處理器是 美國英特爾開發(fā)的面向服務(wù)器應(yīng)用的64 位處理器, 由于具有64 位尋址能力,它能夠使用100 萬TB 的地址空間,足以運(yùn)算企業(yè)級(jí)或超大規(guī)模的數(shù)據(jù)庫任務(wù);64 位寬的寄存器可以使CPU 浮點(diǎn)運(yùn)算達(dá)到非常高的精度。


    m32r處理器

    M32r 處理器是 日本瑞薩科技開發(fā)的32 位高性能RISC 處理器, 內(nèi)置大容量存儲(chǔ)器,適用于車載系統(tǒng)、數(shù)字AV 設(shè)備、數(shù)字成像設(shè)備等產(chǎn)品領(lǐng)域。屬于MCU 型的處理器。


    m68k處理器

    M68k 處理器是美國 Motorola 公司開發(fā)的高性能處理器, 具有高性價(jià)比、高集成度等特點(diǎn),在工業(yè)自動(dòng)化設(shè)備、控制設(shè)備、醫(yī)療儀器系統(tǒng)、安全系統(tǒng)等領(lǐng)域多有應(yīng)用。現(xiàn)在為Freescale 公司所有, 風(fēng)頭已不敵PowerPC 處理器。


    microblaze處理器

    Microblaze 處理器是美國 Xilinx 公司提供的嵌入在其FPGA 芯片上的32 位RISC 軟核。 它具有運(yùn)算能力強(qiáng)、外圍接口配置靈活等特點(diǎn),集成在 FPGA之中,可以和FPGA 實(shí)現(xiàn)協(xié)同設(shè)計(jì),具備軟硬件可配置的靈活性。


    mips處理器

    Mips 處理器 是由美國斯坦福大學(xué)Hennessy 教授領(lǐng)導(dǎo)的研究小組研制出來, 現(xiàn)為Mips 公司擁有,和Arm 處理器一樣采用IP 授權(quán)的方式由第3 方開發(fā)生產(chǎn)。著名的公司如Broadcom 、Nxp 等都有出品Mips處理器。我國的龍芯CPU 也是采用Mips 體系結(jié)構(gòu)。


    mn10300處理器

    Mn10300 處理器 日本松下開發(fā)的32 位多媒體處理器。


    parisc處理器

    Parisc 處理器是由 HP (惠普)開發(fā)設(shè)計(jì)的處理器,主要用于HP (惠普)公司的服務(wù)器中,目前HP(惠普)已經(jīng)放棄 Parisc 處理器的開發(fā),不過一些Parisc 處理器技術(shù)已經(jīng)融合到ia64 處理器之中。


    powerpc處理器

    Powerpc 處理器是由美國IBM 、Apple 、Motorola 聯(lián)合開發(fā)的處理器,Powepc 處理器在IBM 的服務(wù)器、Apple 的MAC 電腦中都有應(yīng)用。不過現(xiàn)在多應(yīng)用在網(wǎng)絡(luò)設(shè)備、視頻系統(tǒng)、工業(yè)系統(tǒng)等領(lǐng)域。Sony PS3 游戲機(jī)Cell 處理器也是Powerpc 體系結(jié)構(gòu)。


    s390處理器

    S390 處理器是由美國IBM 開發(fā)的面向大型機(jī)應(yīng)用的處理器 。


    score處理器

    Score 處理器是由臺(tái)灣 凌陽開發(fā)的32 位RISC 處理器。Score 屬于MCU 型的處理器。


    sh處理器

    Sh 處理器又稱SuperH 處理器 ,最先由日本Hitachi 公司開發(fā),后由 Hitachi 及 ST Microelectronics 兩家公司共同開發(fā),2003 年 瑞薩科技從 Hitachi 公司繼承到擁有權(quán)。Sh 屬于MCU 型的處理器。


    sparc處理器

    Sparc 處理器是由美國SUN 和TI 公司共同開發(fā)的RISC 微處理器,最突出的特點(diǎn)就是它的可擴(kuò)展性。SUN 公司將它作為高端處理器應(yīng)用到服務(wù)器產(chǎn)品。


    x86處理器

    X86 處理器是由美國Intel 推出的 復(fù)雜指令集(cisc ) 處理器,廣泛應(yīng)用在PC 電腦領(lǐng)域和服務(wù)器領(lǐng)域,在工業(yè)控制領(lǐng)域也有應(yīng)用。目前主要是Intel、AMD 、VIA 在開發(fā)x86 體系結(jié)構(gòu)的處理器。


    xtensa處理器

    Xtensa 處理器是由美國 Tensilica (泰思立達(dá))公司開發(fā)的可配置及可擴(kuò)展的微處理器


    OpenRisc處理器

    OpenRisc是OpenCores組織提供的基于GPL協(xié)議的開放源代碼的RISC(精簡指令集計(jì)算機(jī))處理器。有人認(rèn)為其性能介于ARM7和ARM9之間,適合一般的嵌入式系統(tǒng)使用。最重要的一點(diǎn)是OpenCores組織提供了大量的開放源代碼IP核供研究人員使用,因此對于一般的開發(fā)單位具有很大的吸引力

    1.3.2.2 drivers目錄

    許多驅(qū)動(dòng)程序是通用驅(qū)動(dòng)程序,這意味著一個(gè)通用鍵盤驅(qū)動(dòng)可以使內(nèi)核可以處理幾乎所有的鍵盤。然而,有些驅(qū)動(dòng)是專用驅(qū)動(dòng),像蘋果和Commodore就分別為蘋果電腦和Amiga系統(tǒng)制造了專門的硬件。Linux內(nèi)核中已經(jīng)包含了許多諸如智能手機(jī)、蘋果、Amiga系統(tǒng)、PS3、Android平板,和許多其他設(shè)備的驅(qū)動(dòng)程序。


      注意有些設(shè)備的驅(qū)動(dòng)不在本目錄中。比如,射頻驅(qū)動(dòng)在net和media文件夾下。


      accessibility - 這些驅(qū)動(dòng)提供支持一些輔助設(shè)備。在Linux 3.9.4中,這個(gè)文件夾中只有一個(gè)驅(qū)動(dòng)就是盲文設(shè)備驅(qū)動(dòng)。


      acpi - 高級(jí)配置和電源接口(ACPI : Advanced Configuration and Power Interface)驅(qū)動(dòng)用來管理電源使用。


      amba - 高級(jí)微控制器總線架構(gòu)(AMBA : Advanced Microcontroller Bus Architecture)是與片上系統(tǒng)(SoC)的管理和互連的協(xié)議。SoC是一塊包含許多或所有必要的計(jì)算機(jī)組件的芯片。這里的AMBA驅(qū)動(dòng)讓內(nèi)核能夠運(yùn)行在這上面。


      ata - 該目錄包含PATA和SATA設(shè)備的驅(qū)動(dòng)程序。串行ATA(SATA)是一種連接主機(jī)總線適配器到像硬盤那樣的存儲(chǔ)器的計(jì)算機(jī)總線接口。并行ATA(PATA)用于連接存儲(chǔ)設(shè)備,如硬盤驅(qū)動(dòng)器,軟盤驅(qū)動(dòng)器,光盤驅(qū)動(dòng)器的標(biāo)準(zhǔn)。PATA就是我們所說的IDE。


      atm - 異步通信模式(ATM : Asynchronous Transfer Mode)是一種通信標(biāo)準(zhǔn)。這里有各種接到PCI橋的驅(qū)動(dòng)(他們連接到PCI總線)和以太網(wǎng)控制器(控制以太網(wǎng)通信的集成電路芯片)。


      auxdisplay - 這個(gè)文件夾提供了三個(gè)驅(qū)動(dòng)。LCD 幀緩存(framebuffer)驅(qū)動(dòng)、LCD控制器驅(qū)動(dòng)和一個(gè)LCD驅(qū)動(dòng)。這些驅(qū)動(dòng)用于管理液晶顯示器 —— 液晶顯示器會(huì)在按壓時(shí)顯示波紋。注意:按壓會(huì)損害屏幕,所以請不要用力戳LCD顯示屏。


      base - 這是個(gè)重要的目錄包含了固件、系統(tǒng)總線、虛擬化能力等基本的驅(qū)動(dòng)。


      bcma - 這些驅(qū)動(dòng)用于使用基于AMBA協(xié)議的總線。AMBA是由博通公司開發(fā)。


      block - 這些驅(qū)動(dòng)提供對塊設(shè)備的支持,像軟驅(qū)、SCSI磁帶、TCP網(wǎng)絡(luò)塊設(shè)備等等。


      bluetooth - 藍(lán)牙是一種安全的無線個(gè)人區(qū)域網(wǎng)絡(luò)標(biāo)準(zhǔn)(PANs)。藍(lán)牙驅(qū)動(dòng)就在這個(gè)文件夾,它允許系統(tǒng)使用各種藍(lán)牙設(shè)備。例如,一個(gè)藍(lán)牙鼠標(biāo)不用電纜,并且計(jì)算機(jī)有一個(gè)電子狗(小型USB接收器)。Linux系統(tǒng)必須能夠知道進(jìn)入電子狗的信號(hào),否則藍(lán)牙設(shè)備無法工作。


      bus - 這個(gè)目錄包含了三個(gè)驅(qū)動(dòng)。一個(gè)轉(zhuǎn)換ocp接口協(xié)議到scp協(xié)議。一個(gè)是設(shè)備間的互聯(lián)驅(qū)動(dòng),第三個(gè)是用于處理互聯(lián)中的錯(cuò)誤處理。


      cdrom - 這個(gè)目錄包含兩個(gè)驅(qū)動(dòng)。一個(gè)是cd-rom,包括DVD和CD的讀寫。第二個(gè)是gd-rom(只讀GB光盤),GD光盤是1.2GB容量的光盤,這像一個(gè)更大的CD或者更小的DVD。GD通常用于世嘉游戲機(jī)中。


      char - 字符設(shè)備驅(qū)動(dòng)就在這里。字符設(shè)備每次傳輸數(shù)據(jù)傳輸一個(gè)字符。這個(gè)文件夾里的驅(qū)動(dòng)包括打印機(jī)、PS3閃存驅(qū)動(dòng)、東芝SMM驅(qū)動(dòng)和隨機(jī)數(shù)發(fā)生器驅(qū)動(dòng)等。


      clk - 這些驅(qū)動(dòng)用于系統(tǒng)時(shí)鐘。


      clocksource - 這些驅(qū)動(dòng)用于作為定時(shí)器的時(shí)鐘。


      connector - 這些驅(qū)動(dòng)使內(nèi)核知道當(dāng)進(jìn)程fork并使用proc連接器更改UID(用戶ID)、GID(組ID)和SID(會(huì)話ID)。內(nèi)核需要知道什么時(shí)候進(jìn)程fork(CPU中運(yùn)行多個(gè)任務(wù))并執(zhí)行。否則,內(nèi)核可能會(huì)低效管理資源。


      cpufreq - 這些驅(qū)動(dòng)改變CPU的電源能耗。


      cpuidle - 這些驅(qū)動(dòng)用來管理空閑的CPU。一些系統(tǒng)使用多個(gè)CPU,其中一個(gè)驅(qū)動(dòng)可以讓這些CPU負(fù)載相當(dāng)。


      crypto - 這些驅(qū)動(dòng)提供加密功能。


      dca - 直接緩存訪問(DCA : Direct Cache Access)驅(qū)動(dòng)允許內(nèi)核訪問CPU緩存。CPU緩存就像CPU內(nèi)置的RAM。CPU緩存的速度比RAM更快。然而,CPU緩存的容量比RAM小得多。CPU在這個(gè)緩存系統(tǒng)上存儲(chǔ)了最重要的和執(zhí)行的代碼。


      devfreq - 這個(gè)驅(qū)動(dòng)程序提供了一個(gè)通用的動(dòng)態(tài)電壓和頻率調(diào)整(DVFS : Generic Dynamic Voltage and Frequency Scaling)框架,可以根據(jù)需要改變CPU頻率來節(jié)約能源。這就是所謂的CPU節(jié)能。


      dio - 數(shù)字輸入/輸出(DIO :Digital Input/Output)總線驅(qū)動(dòng)允許內(nèi)核可以使用DIO總線。


      dma - 直接內(nèi)存訪問(DMA)驅(qū)動(dòng)允許設(shè)備無需CPU直接訪問內(nèi)存。這減少了CPU的負(fù)載。


      edac - 錯(cuò)誤檢測和校正( Error Detection And Correction)驅(qū)動(dòng)幫助減少和糾正錯(cuò)誤。


      eisa - 擴(kuò)展工業(yè)標(biāo)準(zhǔn)結(jié)構(gòu)總線(Extended Industry Standard Architecture)驅(qū)動(dòng)提供內(nèi)核對EISA總線的支持。


      extcon - 外部連接器(EXTernal CONnectors)驅(qū)動(dòng)用于檢測設(shè)備插入時(shí)的變化。例如,extcon會(huì)檢測用戶是否插入了USB驅(qū)動(dòng)器。


      firewire - 這些驅(qū)動(dòng)用于控制蘋果制造的類似于USB的火線設(shè)備。


      firmware - 這些驅(qū)動(dòng)用于和像BIOS(計(jì)算機(jī)的基本輸入輸出系統(tǒng)固件)這樣的設(shè)備的固件通信。BIOS用于啟動(dòng)操作系統(tǒng)和控制硬件與設(shè)備的固件。一些BIOS允許用戶超頻CPU。超頻是使CPU運(yùn)行在一個(gè)更快的速度。CPU速度以MHz(百萬赫茲)或GHz衡量。一個(gè)3.7 GHz的CPU的的速度明顯快于一個(gè)700Mhz的處理器。


      gpio - 通用輸入/輸出(GPIO :General Purpose Input/Output)是可由用戶控制行為的芯片的管腳。這里的驅(qū)動(dòng)就是控制GPIO。


      gpu - 這些驅(qū)動(dòng)控制VGA、GPU和直接渲染管理(DRM :Direct Rendering Manager )。VGA是640*480的模擬計(jì)算機(jī)顯示器或是簡化的分辨率標(biāo)準(zhǔn)。GPU是圖形處理器。DRM是一個(gè)Unix渲染系統(tǒng)。


      hid - 這驅(qū)動(dòng)用于對USB人機(jī)界面設(shè)備的支持。


      hsi - 這個(gè)驅(qū)動(dòng)用于內(nèi)核訪問像Nokia N900這樣的蜂窩式調(diào)制解調(diào)器。


      hv - 這個(gè)驅(qū)動(dòng)用于提供Linux中的鍵值對(KVP :Key Value Pair)功能。


      hwmon - 硬件監(jiān)控驅(qū)動(dòng)用于內(nèi)核讀取硬件傳感器上的信息。比如,CPU上有個(gè)溫度傳感器。那么內(nèi)核就可以追蹤溫度的變化并相應(yīng)地調(diào)節(jié)風(fēng)扇的速度。


      hwspinlock - 硬件轉(zhuǎn)鎖驅(qū)動(dòng)允許系統(tǒng)同時(shí)使用兩個(gè)或者更多的處理器,或使用一個(gè)處理器上的兩個(gè)或更多的核心。


      i2c - I2C驅(qū)動(dòng)可以使計(jì)算機(jī)用I2C協(xié)議處理主板上的低速外設(shè)。系統(tǒng)管理總線(SMBus :System Management Bus)驅(qū)動(dòng)管理SMBus,這是一種用于輕量級(jí)通信的two-wire總線。


      ide - 這些驅(qū)動(dòng)用來處理像CDROM和硬盤這些PATA/IDE設(shè)備。


      idle - 這個(gè)驅(qū)動(dòng)用來管理Intel處理器的空閑功能。


      iio - 工業(yè)I/O核心驅(qū)動(dòng)程序用來處理數(shù)模轉(zhuǎn)換器或模數(shù)轉(zhuǎn)換器。


      infiniband - Infiniband是在企業(yè)數(shù)據(jù)中心和一些超級(jí)計(jì)算機(jī)中使用的一種高性能的端口。這個(gè)目錄中的驅(qū)動(dòng)用來支持Infiniband硬件。


      input - 這里包含了很多驅(qū)動(dòng),這些驅(qū)動(dòng)都用于輸入處理,包括游戲桿、鼠標(biāo)、鍵盤、游戲端口(舊式的游戲桿接口)、遙控器、觸控、耳麥按鈕和許多其他的驅(qū)動(dòng)。如今的操縱桿使用USB端口,但是在上世紀(jì)80、90年代,操縱桿是插在游戲端口的。


      iommu - 輸入/輸出內(nèi)存管理單元(IOMMU :Input/Output Memory Management Unit)驅(qū)動(dòng)用來管理內(nèi)存管理單元中的IOMMU。IOMMU連接DMA IO總線到內(nèi)存上。IOMMU是設(shè)備在沒有CPU幫助下直接訪問內(nèi)存的橋梁。這有助于減少處理器的負(fù)載。


      ipack - Ipack代表的是IndustryPack。 這個(gè)驅(qū)動(dòng)是一個(gè)虛擬總線,允許在載體和夾板之間操作。


      irqchip - 這些驅(qū)動(dòng)程序允許硬件的中斷請求(IRQ)發(fā)送到處理器,暫時(shí)掛起一個(gè)正在運(yùn)行的程序而去運(yùn)行一個(gè)特殊的程序(稱為一個(gè)中斷處理程序)。


      isdn - 這些驅(qū)動(dòng)用于支持綜合業(yè)務(wù)數(shù)字網(wǎng)(ISDN),這是用于同步數(shù)字傳輸語音、視頻、數(shù)據(jù)和其他網(wǎng)絡(luò)服務(wù)使用傳統(tǒng)電話網(wǎng)絡(luò)的電路的通信標(biāo)準(zhǔn)。


      leds - 用于LED的驅(qū)動(dòng)。


      lguest - lguest用于管理客戶機(jī)系統(tǒng)的中斷。中斷是CPU被重要任務(wù)打斷的硬件或軟件信號(hào)。CPU接著給硬件或軟件一些處理資源。


      macintosh - 蘋果設(shè)備的驅(qū)動(dòng)在這個(gè)文件夾里。


      mailbox - 這個(gè)文件夾(pl320-pci)中的驅(qū)動(dòng)用于管理郵箱系統(tǒng)的連接。


      md - 多設(shè)備驅(qū)動(dòng)用于支持磁盤陣列,一種多塊硬盤間共享或復(fù)制數(shù)據(jù)的系統(tǒng)。


      media - 媒體驅(qū)動(dòng)提供了對收音機(jī)、調(diào)諧器、視頻捕捉卡、DVB標(biāo)準(zhǔn)的數(shù)字電視等等的支持。驅(qū)動(dòng)還提供了對不同通過USB或火線端口插入的多媒體設(shè)備的支持。


      memory - 支持內(nèi)存的重要驅(qū)動(dòng)。


      memstick - 這個(gè)驅(qū)動(dòng)用于支持Sony記憶棒。


      message - 這些驅(qū)動(dòng)用于運(yùn)行LSI Fusion MPT(一種消息傳遞技術(shù))固件的LSI PCI芯片/適配器。LSI大規(guī)模集成,這代表每片芯片上集成了幾萬晶體管、


      mfd - 多用途設(shè)備(MFD)驅(qū)動(dòng)提供了對可以提供諸如電子郵件、傳真、復(fù)印機(jī)、掃描儀、打印機(jī)功能的多用途設(shè)備的支持。這里的驅(qū)動(dòng)還給MFD設(shè)備提供了一個(gè)通用多媒體通信端口(MCP)層。


      misc - 這個(gè)目錄包含了不適合在其他目錄的各種驅(qū)動(dòng)。就像光線傳感器驅(qū)動(dòng)。


      mmc - MMC卡驅(qū)動(dòng)用于處理用于MMC標(biāo)準(zhǔn)的閃存卡。


      mtd - 內(nèi)存技術(shù)設(shè)備(MTD :Memory technology devices)驅(qū)動(dòng)程序用于Linux和閃存的交互,這就就像一層閃存轉(zhuǎn)換層。其他塊設(shè)備和字符設(shè)備的驅(qū)動(dòng)程序不會(huì)以閃存設(shè)備的操作方式來做映射。盡管USB記憶卡和SD卡是閃存設(shè)備,但它們不使用這個(gè)驅(qū)動(dòng),因?yàn)樗麄冸[藏在系統(tǒng)的塊設(shè)備接口后。這個(gè)驅(qū)動(dòng)用于新型閃存設(shè)備的通用閃存驅(qū)動(dòng)器驅(qū)動(dòng)。


      net - 網(wǎng)絡(luò)驅(qū)動(dòng)提供像AppleTalk、TCP和其他的網(wǎng)絡(luò)協(xié)議。這些驅(qū)動(dòng)也提供對調(diào)制解調(diào)器、USB 2.0的網(wǎng)絡(luò)設(shè)備、和射頻設(shè)備的支持。


      nfc - 這個(gè)驅(qū)動(dòng)是德州儀器的共享傳輸層之間的接口和NCI核心。


      ntb - 不透明的橋接驅(qū)動(dòng)提供了在PCIe系統(tǒng)的不透明橋接。PCIe是一種高速擴(kuò)展總線標(biāo)準(zhǔn)。


      nubus - NuBus是一種32位并行計(jì)算總線。用于支持蘋果設(shè)備。


      of - 此驅(qū)動(dòng)程序提供設(shè)備樹中創(chuàng)建、訪問和解釋程序的OF助手。設(shè)備樹是一種數(shù)據(jù)結(jié)構(gòu),用于描述硬件。


      oprofile - 這個(gè)驅(qū)動(dòng)用于從驅(qū)動(dòng)到用戶空間進(jìn)程(運(yùn)行在用戶態(tài)下的應(yīng)用)評(píng)測整個(gè)系統(tǒng)。這幫助開發(fā)人員找到性能問題----性能分析機(jī)制-是用于 Linux 的若干種評(píng)測和性能監(jiān)控工具中的一種


      parisc - 這些驅(qū)動(dòng)用于HP生產(chǎn)的PA-RISC架構(gòu)設(shè)備。PA-RISC是一種特殊指令集的處理器。


      parport - 并口驅(qū)動(dòng)提供了Linux下的并口支持。


      pci - 這些驅(qū)動(dòng)提供了PCI總線服務(wù)。


      pcmcia - 這些是筆記本的pc卡驅(qū)動(dòng)


      pinctrl - 這些驅(qū)動(dòng)用來處理引腳控制設(shè)備。引腳控制器可以禁用或啟用I/O設(shè)備。


      platform -這個(gè)文件夾包含了不同的計(jì)算機(jī)平臺(tái)的驅(qū)動(dòng)像Acer、Dell、Toshiba、IBM、Intel、Chrombooks等等。


      pnp - 即插即用驅(qū)動(dòng)允許用戶在插入一個(gè)像USB的設(shè)備后可以立即使用而不必手動(dòng)配置設(shè)備。


      power - 電源驅(qū)動(dòng)使內(nèi)核可以測量電池電量,檢測充電器和進(jìn)行電源管理。


      pps - Pulse-Per-Second驅(qū)動(dòng)用來控制電流脈沖速率。這用于計(jì)時(shí)。


      ps3 - 這是Sony的游戲控制臺(tái)驅(qū)動(dòng)- PlayStation3。


      ptp - 圖片傳輸協(xié)議(PTP)驅(qū)動(dòng)支持一種從數(shù)碼相機(jī)中傳輸圖片的協(xié)議。


      pwm - 脈寬調(diào)制(PWM)驅(qū)動(dòng)用于控制設(shè)備的電流脈沖。主要用于控制像CPU風(fēng)扇。


      rapidio - RapidIO驅(qū)動(dòng)用于管理RapidIO架構(gòu),它是一種高性能分組交換,用于電路板上交互芯片的交互技術(shù),也用于互相使用底板的電路板。


      regulator - 校準(zhǔn)驅(qū)動(dòng)用于校準(zhǔn)電流、溫度、或其他可能系統(tǒng)存在的校準(zhǔn)硬件。----用于控制系統(tǒng)中某些設(shè)備的電壓電流供應(yīng)


      remoteproc - 這些驅(qū)動(dòng)用來管理遠(yuǎn)程處理器。


      rpmsg - 這個(gè)驅(qū)動(dòng)用來控制支持大量驅(qū)動(dòng)的遠(yuǎn)程處理器通訊總線(rpmsg)。這些總線提供消息傳遞設(shè)施,促進(jìn)客戶端驅(qū)動(dòng)程序編寫自己的連接協(xié)議消息。----該基礎(chǔ)架構(gòu)允許主處理器上的 Linux 操作系統(tǒng)管理遠(yuǎn)程處理器上遠(yuǎn)程軟件環(huán)境的生命周期和通信-用于在 AMP 環(huán)境中的操作系統(tǒng)之間實(shí)現(xiàn) IPC 的 rpmsg 組件和 API


      rtc - 實(shí)時(shí)時(shí)鐘(RTC)驅(qū)動(dòng)使內(nèi)核可以讀取時(shí)鐘。


      s390 - 用于31/32位的大型機(jī)架構(gòu)的驅(qū)動(dòng)。


      sbus - 用于管理基于SPARC的總線驅(qū)動(dòng)。


      scsi - 允許內(nèi)核使用SCSI標(biāo)準(zhǔn)外圍設(shè)備。例如,Linux將在與SCSI硬件傳輸數(shù)據(jù)時(shí)使用SCSI驅(qū)動(dòng)。


      sfi -簡單固件接口(SFI)驅(qū)動(dòng)允許固件發(fā)送信息表給操作系統(tǒng)。這些表的數(shù)據(jù)稱為SFI表。


      sh - 該驅(qū)動(dòng)用于支持SuperHway總線。


      sn - 該驅(qū)動(dòng)用于支持IOC3串口。


      spi - 這些驅(qū)動(dòng)處理串行設(shè)備接口總線(SPI),它是一個(gè)在在全雙工下運(yùn)行的同步串行數(shù)據(jù)鏈路標(biāo)準(zhǔn),。全雙工是指兩個(gè)設(shè)備可以同一時(shí)間同時(shí)發(fā)送和接收信息。雙工指的是雙向通信。設(shè)備在主/從模式下通信(取決于設(shè)備配置)。


      ssb - ssb(Sonics Silicon Backplane)驅(qū)動(dòng)提供對在不同博通芯片和嵌入式設(shè)備上使用的迷你總線的支持。


      staging - 該目錄含有許多子目錄。這里所有的驅(qū)動(dòng)還需要在加入主內(nèi)核前經(jīng)過更多的開發(fā)工作。


      target - SCSI設(shè)備驅(qū)動(dòng)


      tc - 這些驅(qū)動(dòng)用于TURBOchannel,TURBOchannel是數(shù)字設(shè)備公司開發(fā)的32位開放總線。這主要用于DEC工作站。


      thermal - thermal驅(qū)動(dòng)使CPU保持較低溫度。---Linux溫控框架


      tty - tty驅(qū)動(dòng)用于管理物理終端連接。


      uio - 該驅(qū)動(dòng)允許用戶編譯運(yùn)行在用戶空間而不是內(nèi)核空間的驅(qū)動(dòng)。這使用戶驅(qū)動(dòng)不會(huì)導(dǎo)致內(nèi)核崩潰。-----運(yùn)行在用戶空間的IO技術(shù)


      usb - USB設(shè)備允許內(nèi)核使用USB端口。閃存驅(qū)動(dòng)和記憶卡已經(jīng)包含了固件和控制器,所以這些驅(qū)動(dòng)程序允許內(nèi)核使用USB接口和與USB設(shè)備。


      uwb - Ultra-WideBand驅(qū)動(dòng)用來管理短距離,高帶寬通信的超低功耗的射頻設(shè)備


      vfio - 允許設(shè)備訪問用戶空間的VFIO驅(qū)動(dòng)。----用戶態(tài)驅(qū)動(dòng)框架


      vhost - 這是用于宿主內(nèi)核中的virtio服務(wù)器驅(qū)動(dòng)。用于虛擬化中。


      video - 這是用來管理顯卡和監(jiān)視器的視頻驅(qū)動(dòng)。


      virt - 這些驅(qū)動(dòng)用來虛擬化。


      virtio - 這個(gè)驅(qū)動(dòng)用來在虛擬PCI設(shè)備上使用virtio設(shè)備。用于虛擬化中。


      vlynq - 這個(gè)驅(qū)動(dòng)控制著由德州儀器開發(fā)的專有接口。這些都是寬帶產(chǎn)品,像WLAN和調(diào)制解調(diào)器,VOIP處理器,音頻和數(shù)字媒體信號(hào)處理芯片。


      vme - WMEbus最初是為摩托羅拉68000系列處理器開發(fā)的總線標(biāo)準(zhǔn)


      w1 - 這些驅(qū)動(dòng)用來控制one-wire總線。


      watchdog - 該驅(qū)動(dòng)管理看門狗定時(shí)器,這是一個(gè)可以用來檢測和恢復(fù)異常的定時(shí)器。


      xen - 該驅(qū)動(dòng)是Xen管理程序系統(tǒng)。這是個(gè)允許用戶運(yùn)行多個(gè)操作系統(tǒng)在一臺(tái)計(jì)算機(jī)的軟件或硬件。這意味著xen的代碼將允許用戶在同一時(shí)間的一臺(tái)計(jì)算機(jī)上運(yùn)行兩個(gè)或更多的Linux系統(tǒng)。用戶也可以在Linux上運(yùn)行Windows、Solaris、FreeBSD、或其他操作系統(tǒng)。


    zorro - 該驅(qū)動(dòng)提供Zorro Amiga總線支持。


    Linux內(nèi)核是所有Linux系統(tǒng)的核心。如果有任何惡意代碼控制或破害了內(nèi)核的任何一部分,那么系統(tǒng)會(huì)嚴(yán)重受損,文件可能被刪除或損壞,私人信息可能被盜等等。很明顯,保持內(nèi)核安全涉及到用戶的最大利益。值得慶幸的是,由于Linux內(nèi)核極其安全,Linux是一個(gè)非常安全的系統(tǒng)。在用戶比例上,Linux病毒比Windows病毒更少,并且Linux用戶比Windows用戶個(gè)人更少感染病毒。(這就是為什么許多公司使用Linux來管理他們的服務(wù)器的一個(gè)原因。) 然而,我們?nèi)匀粵]有借口去忽視內(nèi)核的安全。Linux有幾個(gè)安全特性和程序,但本文只討論Linux安全模塊(LSM)及其它的內(nèi)核安全特性。


      提示: 絕不在內(nèi)核源代碼內(nèi)移動(dòng)文件,除非你知道你在做什么。否則,編譯會(huì)由于 失文件失敗。


    Linux內(nèi)核的文件夾結(jié)構(gòu)保持相對穩(wěn)定。內(nèi)核開發(fā)者會(huì)做一些修改,但總體來說,這些設(shè)置對整個(gè)內(nèi)核版本都是一樣。驅(qū)動(dòng)程序文件夾的布局也基本保持一樣。


    驅(qū)動(dòng)程序是使內(nèi)核能夠溝通和操作硬件或協(xié)議(規(guī)則和標(biāo)準(zhǔn))的小程序。沒有驅(qū)動(dòng)程序,內(nèi)核不知道如何與硬件溝通或者處理協(xié)議(內(nèi)核實(shí)際上先發(fā)送指令給BIOS,然后BIOS傳給硬件)。 Linux的內(nèi)核代碼在驅(qū)動(dòng)程序文件夾中以源代碼的形式包含了許多驅(qū)動(dòng)程序。驅(qū)動(dòng)文件夾中的每個(gè)文件夾會(huì)在下面說明該配置和 編譯內(nèi)核時(shí),這樣有助于你了解驅(qū)動(dòng)程序。否則,用戶可能會(huì)在編譯時(shí)加入不必要的或者漏掉重要的驅(qū)動(dòng)。驅(qū)動(dòng)代碼通常會(huì)包含一個(gè)單行注釋來指出驅(qū)動(dòng)的目的。 比如,tc的驅(qū)動(dòng)代碼,有一行的注釋說是用于TURBOchannel總線。由于這些文檔,用戶應(yīng)該看驅(qū)動(dòng)前幾行的注釋來了解它們的用途。


      有幾個(gè)術(shù)語你應(yīng)該已經(jīng)知道,所以下面的信息應(yīng)該是明白的。一個(gè)I/O設(shè)備指的是輸入/輸出設(shè)備。例如調(diào)制解調(diào)器和網(wǎng)卡,他們發(fā)送和接收數(shù)據(jù)。監(jiān)視器是一個(gè)輸出設(shè)備 - 只有信息出來。鍵盤、鼠標(biāo)和游戲桿是數(shù)據(jù)輸入系統(tǒng)。存儲(chǔ)設(shè)備用于存儲(chǔ)數(shù)據(jù),例如SD卡、硬盤、光盤、存儲(chǔ)卡等。CPU(處理器)是計(jì)算機(jī)的“大腦”或“心臟” ,如果沒有它,電腦就無法運(yùn)作。主板則是一塊連接板上不同組件的印刷線路板。主板及各個(gè)組件是計(jì)算機(jī)的運(yùn)行的基礎(chǔ)。許多計(jì)算機(jī)用戶說主板是電腦的心臟(主板上有CPU)。主板包含了用于連接外設(shè)的端口,外設(shè)包括輸入、輸出和存儲(chǔ)設(shè)備。總線是主板的電路,它連接著外設(shè)。網(wǎng)絡(luò)設(shè)備用于兩臺(tái)或多臺(tái)計(jì)算機(jī)之間的連接。端口則是用戶可以插入另外一臺(tái)設(shè)備或一根電纜的設(shè)備,例如,用戶可以將插入一根火線記憶棒插入一個(gè)火線端口;將以太網(wǎng)電纜插入一個(gè)以太網(wǎng)端口。光碟的讀取是利用激光,從可以散射或反射的激光的反射面上讀出數(shù)據(jù),一個(gè)常見的 光盤是DVD。許多系統(tǒng)說自己是32位或者64位,這指的是寄存器、地址總線或數(shù)據(jù)總線的位數(shù)。例如,在一塊64位的主板上,數(shù)據(jù)總線(組件之間的銀線)有64根并排到目的的線。存儲(chǔ)器地址以位(0和1)的形式在存儲(chǔ)器中編址,因此,一個(gè)32位存儲(chǔ)地址包含32個(gè)0和1來表示存儲(chǔ)器上的某處地址。

    1.3 Linux安全模塊

      AppArmor(應(yīng)用盔甲)最初是由Immunix寫的安全模塊。自從2009年以來,Canonical維護(hù)著這些代碼(Novell在Immunix之后,Canonical以前管理這些代碼)。這個(gè)安全模塊已經(jīng)從2.6.36版本進(jìn)入Linux主分支之中。AppArmor限制了程序的能力。AppArmor使用文件路徑來跟蹤程序限制。許多Linux管理員稱AppArmor是最容易配置的安全模塊。然而,而許多Linux用戶覺得這個(gè)模塊與其它的替代品相比很糟糕。


      安全增強(qiáng)Linux(SELinux)是AppArmor的替代品,它最初由美國國家安全局開發(fā)(NSA)。SELinux自從2.6版本就進(jìn)入內(nèi)核主分支中。SELinux是限制修改內(nèi)核和用戶空間的工具。SELinux給可執(zhí)行文件(主要是守護(hù)進(jìn)程和服務(wù)端程序)最小特權(quán)去完成它們的任務(wù)。SELinux也可以用來控制用戶權(quán)限。SELinux不像AppArmor那樣使用文件路徑,而SELinux在追蹤權(quán)限時(shí)使用文件系統(tǒng)去標(biāo)記可執(zhí)行文件。因?yàn)镾Elinux本身使用文件系統(tǒng)管理可執(zhí)行文件,所以SELinux不能像AppArmor那樣對整個(gè)文件系統(tǒng)提供保護(hù)。


      注意:守護(hù)進(jìn)程是在后臺(tái)運(yùn)行的程序


      注意:雖然在內(nèi)核中有AppArmor、SELinux及其它安全模塊,但只能有一個(gè)安全模塊被激活。


      Smack是安全模塊的另一種選擇。Smack從2.6.25起進(jìn)入內(nèi)核主分支。Smack應(yīng)能比AppArmor更安全,但比SELinux更容易配置。


      TOMOYO,是另外一個(gè)安全模塊,在2.6.30進(jìn)入內(nèi)核主分支。TOMOYO可以提供安全防護(hù),但是它的主要用途是分析系統(tǒng)安全缺陷。


      AppArmor、SELinux、Smack和TOMYO組成了四個(gè)標(biāo)準(zhǔn)Linux安全模塊。這些都通過使用強(qiáng)制訪問控制(MAC : mandatory access control)工作,這種訪問控制是通過限制程序或者用戶執(zhí)行一些任務(wù)來實(shí)現(xiàn)的。安全模塊還有某些形式的列表規(guī)定了它們可以做什么不可以做什么。


      Yama在Linux內(nèi)核中一個(gè)新安全模塊。Yama還沒有作為標(biāo)準(zhǔn)的安全模塊,但是在將來他會(huì)成為第5個(gè)標(biāo)準(zhǔn)安全模塊。Yama和其他安全模塊一樣使用相同的機(jī)制。


      “grsecurity”是一系列Linux內(nèi)核安全補(bǔ)丁的集合。多數(shù)補(bǔ)丁用于處理遠(yuǎn)程網(wǎng)絡(luò)連接和緩沖區(qū)溢出的安全問題(以后討論)。grsecurity中有一個(gè)叫PaX的有趣組件。PaX補(bǔ)丁允許內(nèi)存里的代碼使用最少的所需權(quán)限。例如,存儲(chǔ)程序的內(nèi)存段被標(biāo)為不可寫。想想看,為什么一個(gè)可執(zhí)行的程序需要在內(nèi)存中是可寫的?通過這個(gè)補(bǔ)丁,惡意代碼就不能修改目前正在執(zhí)行的程序。緩沖區(qū)溢出是一種當(dāng)程序由于bug或者惡意代碼在內(nèi)存上寫入數(shù)據(jù),并讓它的內(nèi)存邊界超出到其他程序的內(nèi)存頁上的安全事件。當(dāng)Pax被激活時(shí),它會(huì)幫助阻止這些緩沖區(qū)溢出,因?yàn)槌绦驔]有寫到其他內(nèi)存頁上的權(quán)限了。


      Linux入侵檢測系統(tǒng)(LIDS)是一個(gè)內(nèi)核安全補(bǔ)丁,提供了強(qiáng)制訪問控制(MAC)的特性。這個(gè)補(bǔ)丁就像扮演LSM模塊的角色。


      Systrace是一個(gè)減少和控制應(yīng)用程序訪問系統(tǒng)文件和系統(tǒng)調(diào)用的工具。系統(tǒng)調(diào)用是對內(nèi)核的服務(wù)請求。比如,當(dāng)一個(gè)文本編輯器寫入一個(gè)文件到硬盤上時(shí),程序?qū)?huì)發(fā)送一個(gè)系統(tǒng)請求讓內(nèi)核寫入文件到硬盤中。


      這些是在Linux安全系統(tǒng)中非常重要的組件。這些安全模塊和補(bǔ)丁使內(nèi)核免于受到惡意代碼的攻擊。沒有這些特性,Linux系統(tǒng)將會(huì)變成一個(gè)不安全的操作系統(tǒng)。

    整理了很多Linux后臺(tái)架構(gòu)師學(xué)習(xí)資料,視頻,面試題,扣扣群:1143996416


    2. Linux系統(tǒng)最新內(nèi)核版本升級(jí)

    說明:在k8s中由于內(nèi)核版本太低會(huì)出現(xiàn)很多問題,需要在部署k8s集群之前升級(jí)系統(tǒng)內(nèi)核版本。

    2.1 載入公鑰

    rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

    2.2 安裝ELRepo

    rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

    2.3 載入elrepo-kernel的元數(shù)據(jù)

    yum --disablerepo=\* --enablerepo=elrepo-kernel repolist

    2.4 查看可用的rpm包

    yum --disablerepo=\* --enablerepo=elrepo-kernel list kernel*

    2.5 下載安裝最新版本的kernel

    yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-ml.x86_64

    2.6 重啟,選擇新版本內(nèi)核進(jìn)入系統(tǒng)。

    yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel.x86_64

    2.7 重啟,選擇新版本內(nèi)核進(jìn)入系統(tǒng)。

    此時(shí),操作系統(tǒng)使用的內(nèi)核已升級(jí)為【 5.7.7-1.el7.elrepo.x86_64】

    [root@localhost ~]# uname -a
    Linux localhost.localdomain 5.7.7-1.el7.elrepo.x86_64 #1 SMP Wed Jul 1 11:53:16 EDT 2020 x86_64 x86_64 x86_64 GNU/Linux

    2.8 將內(nèi)核工具包一并升級(jí)

    刪除舊版本工具包

    yum remove kernel-tools-libs.x86_64 kernel-tools.x86_64

    安裝新版本工具包

    yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-ml-tools.x86_64
網(wǎng)站首頁   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號(hào):冀ICP備2024067069號(hào)-3 北京科技有限公司版權(quán)所有