Blink 和 V8 在 Chromium 裡跑在哪?講清瀏覽器程序、轉譯程序、GPU 與網路程序的分工,以及為什麼要有網站隔離。
打開 Chrome 內建的工作管理員,你看不到一個叫「Chrome」的程式,而是一長串獨立程序:一個屬於瀏覽器本身,一個或多個屬於網頁,一個屬於 GPU,一個屬於網路。這份清單就是整個架構的縮影。Chrome、Edge、Brave、Opera 背後的開源專案 Chromium,並不是跑在同一塊記憶體裡的單一引擎,而是一組互相協作的程序;Blink(轉譯引擎)和 V8(JavaScript 引擎)只存在於其中一類程序裡。本文只回答一個問題:Blink 和 V8 在 Chromium 裡到底跑在哪,各程序如何分工?
重點速覽
- Chromium 以多程序方式運行:一個高權限的瀏覽器程序負責介面、分頁與協調,外加受沙箱限制的轉譯程序、GPU 程序,以及網路等工具服務。
- **Blink 和 V8 運行在轉譯程序裡。**解析 HTML、執行頁面 JavaScript、計算版面都在這裡——它也是被刻意設為最不受信任的部分。
- 拆分的目的是穩定與安全:一個頁面當機不該拖垮整個瀏覽器,被攻破的頁面也不該讀到你的檔案或其他網站的資料。
- **網站隔離(Site Isolation)**更進一步,盡量讓不同網站的頁面待在不同的轉譯程序裡,這項防禦在 Spectre 類 CPU 漏洞之後被加強。
- 所有基於 Chromium 的瀏覽器共用這套結構,這也是引擎層面的特徵很難偽造的原因之一。
一句話模型
Chromium 多程序架構設計文件把想法講得很直白:把處理不可信網頁內容的程式碼放進獨立且受限的程序,再由一個高權限程序統一掌管。Google 的《現代瀏覽器內部探秘》系列從使用者視角講了同一個故事,角色也是同一批程序。如果你想先了解什麼是瀏覽器引擎,可以先讀瀏覽器核心詳解再回來。
誰跑在哪
多年來 Chromium 的具體程序配置一直在變,設計文件在部分地方也已是歷史資料,所以請把下面的內容當作穩定的核心,而不是目前的程序清單。兩份資料在這些角色上是一致的。
| 程序 | 其中運行的內容 | 能接觸到什麼 |
|---|---|---|
| 瀏覽器程序 | 視窗、網址列、書籤、上一頁下一頁按鈕;協調所有其他程序 | 權限最高:檔案、系統資源、介面,以及對所有其他程序的控制 |
| 轉譯程序 | 網頁內容的 Blink(HTML、CSS、版面、繪製)與 V8(JavaScript) | 極少:在沙箱中運行,沙箱之外的任何事都要請求瀏覽器程序 |
| GPU 程序 | 交給圖形硬體的工作,如合成與繪製 | 圖形驅動程式,與請求繪製的頁面互相隔離 |
| 網路及其他工具服務 | 取得資源,以及放在瀏覽器程序之外更安全的輔助任務 | 網路存取,但不與頁面程式碼共用程序 |
關鍵在中間一列。分頁中的頁面內容由轉譯程序處理,轉譯引擎與 JavaScript 引擎這一對搭檔正是在這裡碰面。讀過轉譯引擎與 JavaScript 引擎的差別就會明白,文中所說「兩套引擎在一次頁面載入中協作」,發生在同一個轉譯程序內部:Blink 建構 DOM 與版面,V8 執行可以修改它們的腳本,整個過程不需要跨越程序邊界。
為什麼要把瀏覽器拆開
設計文件和 Google 的講解都提到了兩個驅動因素。
**當機。**網頁會執行任意程式碼,有時會卡死或當機。如果所有東西共用一個程序,一個壞分頁就會帶走其他所有分頁和你的工作階段。拆成獨立的轉譯程序後,當機被限制在局部:瀏覽器程序依然存活,只在那一個分頁裡顯示熟悉的「頁面當機」提示。
**沙箱。**Blink 和 V8 體量龐大、結構複雜,每天都在解析惡意輸入,出現漏洞在所難免。Chromium 假定其中一部分可被利用,因此限制損害範圍:轉譯程序以受限權限運行,需要讀檔案或建立網路連線時必須向瀏覽器程序(及其代管的服務)提出請求,而後者可以拒絕。因此轉譯程序被攻破並不自動等於你的電腦被攻破。代價是開銷:程序越多佔用記憶體越多,也需要程序間訊息傳遞,Chromium 團隊為換取安全而接受了這個取捨。
網站隔離:一個網站,一個程序
一個分頁並不等於一個程序,程序邊界在不同網站之間最重要。網站隔離的目標是讓一個轉譯程序只容納來自單一網站的頁面,使某個網站的頁面不會和另一個網站的頁面處在同一程序記憶體裡——包括內嵌的 iframe,它們可以與嵌入它的頁面分處不同程序轉譯。Chrome 在 2018 年的 Chrome 67 中為桌面版使用者預設開啟網站隔離;在 Android 上則因手機記憶體較吃緊而有選擇地啟用。
動機在 Spectre 之後更加迫切。Spectre 是 2018 年揭露的一類 CPU 推測執行漏洞,這類攻擊可能讓程式碼讀取自身程序中其他位置的記憶體,所以與銀行頁面共用一個程序的惡意頁面,理論上可以嘗試讀取本不該看到的資料。把兩者放進不同程序就讓這塊記憶體無法觸及,也讓瀏覽器程序能充當裁判,而不是信任頁面本身。同一故事的計時器一面——瀏覽器為何降低時鐘精度以加大這類攻擊的難度——見瀏覽器計時器精度。
這裡不會給出記憶體或效能開銷的具體數字,因為它們隨裝置、頁面和 Chromium 版本差異很大,官方頁面也沒有值得引用的單一數據。
在自己的電腦上親眼看看
不需要任何額外工具,就能看到這套架構在運作:
- **工作管理員。**在 Chrome 中開啟選單,選擇更多工具 → 工作管理員(Windows、Linux 和 ChromeOS 上也可按 Shift+Esc)。每一列就是一個程序:瀏覽器程序、GPU 程序、網路服務等工具服務,以及各個轉譯程序,並標明它服務哪些分頁或框架。分別開啟兩個同站分頁和兩個不同網站的分頁,比較它們的程序 ID。
- **chrome://process-internals。**這個內部頁面會顯示瀏覽器目前採用的網站隔離模式,以及各個框架分別位於哪個程序。需要自己在網址列輸入,網頁無法直接連結到它。
這對指紋偵測意味著什麼
對 BrowserInsight 的讀者來說有一個實際推論。Edge、Brave、Opera、Vivaldi 和 Chrome 都從 Chromium 繼承這套結構;它們的差別在品牌、預設設定和服務,而不在於 Blink 與 V8 是否運行在沙箱化的轉譯程序裡。這就是我們的核心檢測對它們都回報 Blink/Chromium 引擎的原因,詳見 Chromium 與 Chrome 的差異和為什麼這麼多瀏覽器使用 Chromium。
這也是引擎層面的行為難以模仿的原因。腳本可以偽造 User-Agent 字串,卻無法改變真正執行程式碼的 JavaScript 引擎(見 JavaScript 引擎指紋),而一個建置所支援的 Web 功能集合會隨版本而變(見引擎版本功能偵測)。無頭 Chrome 運行的是同一套 Blink 與 V8,所以自動化是靠行為和一致性檢查被識別的,而不是靠另一種引擎——參見機器人偵測技術。
坦白說一個限制:核心檢測是根據瀏覽器支援哪些功能來辨識引擎及其版本的,它不會檢查你的程序,也無法告訴你網站隔離是否開啟。要查看這些,請使用上文提到的工作管理員和 chrome://process-internals。
常見問題
Chromium 是一個程序還是多個?
多個。一個高權限的瀏覽器程序協調受沙箱限制的轉譯程序、GPU 程序,以及網路與工具服務。具體數量隨你打開的頁面和 Chromium 版本而變。
Blink 和 V8 運行在瀏覽器程序裡嗎?
不是。兩者都運行在轉譯程序的沙箱裡,因為它們處理的是不可信的網頁內容。瀏覽器程序負責介面、協調以及一切需要提升權限的事務。
每個分頁都有獨立程序嗎?
不嚴格是這樣。分頁與網站相關但並不等同:網站隔離的目標是每個轉譯程序一個網站,內嵌的跨站框架可以與外層頁面處在不同程序;在某些情況下 Chromium 也可能共用或重複使用程序。
這是否讓 Chrome 比其他瀏覽器更安全?
它在某些方面讓基於 Chromium 的瀏覽器更難被攻破,但程序隔離只是眾多防線之一,其他引擎也有各自的多程序設計。安全性還取決於更新、擴充功能和你自己的使用習慣。
總結
與其把 Chromium 看作單一程式,不如把它看作一個小型組織:一位高權限的管理者、若干專職角色,以及一個沙箱化的轉譯程序,由 Blink 和 V8 在其中把一個不可信的頁面變成像素。這種拆分換來了當機隔離和更小的受害範圍,網站隔離又把這個思路延伸到網站之間。弄清兩個引擎的位置,就能理解為什麼 Chromium 系瀏覽器行為相似,以及這套共用技術堆疊為何如此適合用來區分真實瀏覽器與仿冒品。


