Linux兼容内核

**Linux 相容核心（Linux Unified Kernel，亦稱 Longene）** ，是一個二進位相容 Windows 和 Linux 應用軟體和裝置驅動程式的電腦作業系統核心。它試圖在 Linux 核心的基礎上利用 Linux 核心材料構建 MS Windows 核心功能模組從而擴充 Linux 核心的支援能力使之同時支援 Linux 和 Windows 的應用程式和裝置驅動。

相容核心主要以 C 語言編寫，以 GNU 通用公共許可證授權使用。雖然相容核心還處在初期開發階段，但許多 Windows 程式已經可以在其上執行。與其相反但類似概念的是 coLinux。coLinux 是在 Windows 上運行 Linux 應用軟體。

## 特性

相容核心專案在 Linux 核心的基礎上利用 Linux 核心材料構建一個 Windows 核心環境（包括行程管理、執行緒管理、物件管理、虛擬記憶體管理、同步、系統呼叫、系統序號產生器制和裝置驅動程式框架等 Windows 系統核心機制），形成一個新的核心，使 Linux 和 Windows 應用程式和裝置驅動程式能夠直接在其上執行。

相容核心不是 Linux 核心和 Windows 核心的簡單堆砌。為了防止相容核心變得臃腫，如果一個功能可以用利用 ReactOS（Windows 的開源仿製品）代碼實現，也可以利用 Linux 核心函式通過編程實現（ReactOS、Wine、NDISwrapper 代碼作為參考），相容核心傾向採用後一種實現方法。

相容核心有兩套系統呼叫（syscalls）及其相應的系統呼叫表（syscall table）：一套為 Windows 系統呼叫，另一套為 Linux 系統呼叫。Windows 應用程式通過軟中斷「int 0x2e」存取系統呼叫表進行 Windows 系統呼叫。Linux 應用軟體則通過軟中斷「int 0x80」存取系統呼叫表進行 Linux 系統呼叫。

相容核心專案不計劃開發 Windows 和 Linux 的在使用者空間執行的庫檔案（.dll 和.so 檔案）。這些庫檔案由 Wine 專案（或 MS Windows/ReactOS 專案）和 Linux 專案提供。

## 在 Linux 核內空間實現 Windows 核心機制方案的優點

* 開發快速。Linux 核心已有成熟的 CPU 管理、記憶體管理、磁碟管理和外圍硬體管理等功能模組及其實現函式。採用擴充 Linux 核心，通過嫁接（重新導向）或重用 Linux 核心相關功能函式等方法實現 Windows 核心功能的方案要比從零開始編碼實現 Windows 核心的方案要快很多。
* 相容性好，效率高。在核內空間實現 Windows 核心機制比在核外實現能夠達到更大的相容性。相比在核外利用宿主作業系統的 API 來構建 Windows 的 API，在核內空間可以利用細小的核心材料來實現 Windows 的 API。因核心函式顆粒度比 API 小，其靈活性更大仿製能力更強因而能夠達到更好的相容性。另外，Windows 行程、執行緒、系統呼叫等在核內執行能夠避免在核外執行帶來的使用者空間到核心切換額外的消耗，因而相比更有效率。在核內實現 Windows 核心機制與原生的 Windows 核心開發方法是一致的，能夠克服核外無法實現 Windows 某些功能的缺點。
* 能夠實現 Windows 驅動。
* 能夠使用全套 MS Windows 庫檔案。Linux 和 MS Windows 庫檔案是通過軟中斷（Linux 為「int 0x80」，MS Windows 為「int 0x2e」）進入核內進行系統呼叫的。相容核心在核心開發能夠為之設定與 Linux 和 MS Windows 中斷號相同的兩套獨立的系統呼叫以最大程度相容 MS Windows 環境，使得 MS Windows 系統全套原生的使用者空間庫檔案（.dll）能夠在相容核心上執行。這給開發除錯帶來方便，也給計劃和已經轉向 Linux 系統的持有 MS Windows 使用許可證的機構和個人帶來好處。
* 相容核心主要是在 Linux 的核心模組（LKMs）中實現的，這使它像應用程式的外掛程式一樣很容易載入和解除安裝。
* 裁剪方便。實現 Windows 的 API 和驅動機制後，可以在不影響系統正常執行的情況下裁剪去除與 Windows 無關的 Linux 部分而只保留 Windows 功能，縮減體積以適應某些記憶體較小的裝置。

## 開發

相容核心是由中國的浙大網新有限公司在 2005 年 9 月發起的自由軟體專案。作為專案負責人，毛德操先生提出了專案的設想和和開發路線。他寫了一系列闡述具體實現相容核心的文章，這些文章的組譯為相容核心白皮書。根據的相容核心白皮書，相容核心開發的主要工作是在 Linux 核心中實現「一個框架和兩個介面」：

* 一個符合 Windows 裝置驅動程式的特徵和要求的框架，即 Windows 裝置驅動框架，使得可以把多個 Windows 裝置驅動模組裝入核心，並使這些模組間的關係和執行條件跟它們在 Windows 核心中時相同。
* 一組由 Windows 核心匯出 (Export) 函式介面 (見 Windows DDK) 定義的匯出函式。對於裝置驅動程式而言，這些函式就相當於由核心提供的庫函式。
* Windows 的系統呼叫介面。微軟並沒有公開它的系統呼叫介面，但是在「Windows NT/2000 Native API Reference」和其他資料中已經揭開了這個秘密。在 Linux 核心中實現 Windows 的系統呼叫介面，就相當於用組合語言來實現另一種高階語言。這是因為，在核心裡面，可以使用的「磚塊」就不再是宏觀的 Linux 系統呼叫，而是 Linux 的許多微觀的核心函式了。

相容核心專案的成果為 Linux 核心修補程式。相容核心的開發者期望這些修補程式最終融入 Linux 標準核心成為 Linux 核心標準的一部分。那樣擅長開發 Windows 應用程式和裝置驅動的開發者就可以很方便地為 linux 平台開發軟體或把他們的產品移植到 linux 平台。對於 Windows 軟體開發公司來說，只需要開發維護一個代碼庫就可以實現跨平台，這將降低軟體跨平台所帶來的成本，增加這些公司把產品移植到 Linux 平台的意願。這些公司與 Linux 使用者都將從相容核心專案直接受益。

### 開發策略和線路

相容核心採用漸進方式進行開發，它以已經能正常執行的 Wine 和 NDISWrapper 為開發始點，通過開發自身的 Windows 核心功能模組替換 Wine 中相應的功能模組來實現 Windows 系統呼叫相關功能；通過改造和擴充 NDISWrapper 來實現 Windows 裝置驅動框架；通過利用嫁接（重新導向）等方法實現 Windows 核心匯出函式。具體開發策略和線路 如下：

* Windows 系統呼叫

　
: 相容核心以 Wine 為開發始點，相容核心開發在核內執行的核心功能模組來替代 Wine 中在使用者空間執行的功能模組，並通過對 Wine 打修補程式使 Windows 應用軟體轉而使用相容核心功能模組。即是：如果相容核心已經實現了該功能，則使用相容核心提供的功能；否則使用 Wine 提供的功能。每替換了一些 Wine 的功能模組，經除錯測試穩定後就可以發行一個相容核心版本。這個發行版本又是下一個版本的開發始點，周而復始直到把 Wine 的所有功能模組被相容核心模組替代。相容核心開發不限於替代 Wine 功能模組，Wine 在使用者空間受技術限制不能實現的功能相容核心也要加以實現。

* Windows 裝置驅動框架

　
: NDISWrapper 已經在 Linux 核心中實現了一個 WDM 的雛形，而 ReactOS 則已有一個基本可以執行的 Windows 裝置驅動框架。相容核心將以 NdisWrapper 為開發始點，借鑑 ReactOS 的代碼對 NdisWrapper 進行改造和擴充以實現 Windows 裝置驅動框架。

* Windows 核心匯出函式

　
: ReactOS 和 NdisWrapper 已經有一個基本的 Windows 核心匯出函式集合。相容核心在這個基本集合的基礎上逐步實現的自身的 Windows 核心匯出函式。具體實現方法是如果 Linux 核心中有對應物的可以通過對映 (重新導向)/ 嫁接 (適配) 的方法連接到 Linux 核心中的對應物上，小部分在 Linux 核心中沒有對應物則需要利用 Linux 核心材料加以實現。

### 歷史版本

一個早期的版本，unifiedkernel-2.6.13, 於 2006 年 2 月 15 日發佈。該版本實現了 Windows 系統調用機制。

### 現在和未來的開發

相容核心正在整合 QEMU 代碼以增加對 ARM 架構上直接執行 Windows 應用的 x86 架構二進位映像的支援。相容核心開發將有兩個分支。一個是 1.0 分支，這是針對 x86 架構上的跨作業系統相容。另一個是 2.0 分支，這是針對既跨作業系統又跨 CPU 架構的相容。1.0 分支的進展也體現在 2.0 分支中。 相容核心開發人員已經對 Windows 裝置驅動框架進行了討論，NidsWrapper 的代碼移植到相容核心的工作已經開展。預計不久將進行實現 Windows 裝置驅動框架的開發工作

## 可利用的資源

相容核心不是從零開始編程的，它是在其他專案已有的代碼基礎上進行開發的。它對這些專案進行整合和再發展。相容核心專案可利用的資源包括 Linux kernel、Reactos、Wine、kernel-win32 和 NDISwrapper 等，它們都是開源專案原始碼可以自由取得。

* Linux

　
: 相容核心是基於 Linux 核心的。它在 Linux 可載入核心模組 (LKMs) 中實現它的功能。與 ReactOS 專案從零開始編碼實現 Windows 核心不同，相容核心是利用 Linux 核心中豐富的核心功能函式來實現 Windows 核心功能的。其實現 Windows 機制的主要途徑如下:

1. Windows 系統呼叫介面的實現 —— 一些 Windows 的系統呼叫可以通過嫁接（重新導向）到適當的 Linux 系統呼叫或部分重用相應的 Linux 核心函式來實現，另一些在 Linux 核心中沒有對應物的功能則需要使用 Linux 低階的核內函式來實現。
2. Windows 裝置驅動框架 ——- 基本的裝置驅動框架對應著 Win2k 核心中的 I/O 管理，以及電源管理、隨插即用等機制，也涉及部分物件管理、系統組態、和安全管理方面的功能。。這個框架上面與有關檔案操作的系統呼叫 (open ()，close ()，read ()，write ()，ioctl () 等) 相銜接，中間實現基於「IO 請求包」IRP（IO Request Packet）的裝置驅動機制，下面則融入 Linux 核心的中斷回應 / 服務機制、包括「軟中斷」即 bh 函式的執行機制。主要包括裝置驅動程式的動態裝入和連接的開發和實現、IRP 的生成和傳遞、以及裝置驅動程式的啟動、同步、和終結開發和實現、 將裝置驅動程式的中斷服務登記嫁接到 Linux 的中斷機制上，將裝置驅動程式所關心的 Windows 核心執行狀態對映到 Linux 核心的執行狀態上、 將裝置驅動程式的 DPC 請求嫁接到 Linux 的 bh 函式機制上。
3. Windows 的裝置驅動模組 (.sys 檔案)—— 微軟持有著作權的.sys 檔案基本上是一些標準的、基本的、常用的外部裝置，包括磁碟、USB、圖形裝置、網路裝置等的裝置驅動模組。Linux 實際上已經具備相應的功能，只是需要將 Linux 核心 (包括裝置驅動模組) 中的這些函式和資料結構與具體.sys 的呼叫介面之間架起橋梁。但是也可能有一些微軟的.sys 模組在 Linux 核心中找不到對應物，那就需要仿製了。
4. Windows 裝置驅動支撐介面 —— 多數裝置驅動介面函式 (以及資料結構) 在 Linux 核心中都有對應物，需要做的就是把所需的支撐函式和資料結構通過對映 (重新導向)/ 嫁接 (適配) 落實到相應的 Linux 核心函式和資料結構上，包括一些適配的工作。也有些函式在 Linux 核心中沒有較為接近的對應物，那就要用 Linux 核心中的各種素材加以搭建。
* ReactOS

　
: ReactOS 是一個 MS Windows 核心的開源仿製品。與相容核心利用 Linux 核心材料構建 Windows 核心的開發路線不同，它是完全從零開始編碼製作 Windows 核心的。和相容核心一樣 ReactOS 只是一個核心，它依賴 Wine 專案的使用者空間庫檔案使整個系統能夠執行。相容核心參考 ReactOS 的代碼實現 Windows 核心的基本機制，包括行程 / 執行緒管理機制，記憶體管理機制，驅動系統框架等。

* Wine

　
: Wine 在使用者空間實現了一個把 Windows 程式對 Windows API 呼叫轉向 Linux API 呼叫的相容層，這個相容層還負有 Windows 核心的行程 / 執行緒管理等的職能。雖然 Wine 和相容核心均利用核心材料構建 Windows API 機制，但具體的實現方法是不同的，相容核心是在核心空間利用 Linux 核心的核內函式來實現的，而 Wine 利用的是宿主作業系統的 API 來實現。另外相容核心是在核內利用核心函式實現行程管理、執行緒管理、物件管理、虛擬記憶體管理、同步、系統呼叫、系統序號產生器制和裝置驅動程式框架等 Windows 基本機制的，而 Wine 是在使用者空間實現這些功能的。雖然相容核心採取的技術線路與 Wine 的不相同，但 Wine 的實現方法還是可以能為相容核心提供借鑑的，而 Wine 對 Windows 核心有關資料結構的研究成果則可以直接被相容核心利用。

　
: Windows 使用者空間庫檔案 (.dll 檔案) 雖然不是核心的一部分，但它們是作業系統能夠執行應用軟體不可或缺的部分。Windows 使用者空間庫檔案數量眾多，Wine 專案花了大量的精力仿製了這些檔案。相容核心只實現 Windows 核心相關功能，它依賴 Wine 提供 Windows 使用者空間庫檔案。大多數 Wine 的 dll 檔案可以直接用在相容核心上。

　
: 相容核心已經實現行程 / 執行緒管理、物件管理、虛擬記憶體管理等功能，但還有部分功能沒有實現。在過渡時期，相容核心利用 Wine 來提供它還沒有實現的功能。

* Kernel-win32 （頁面存檔備份，存於網際網路檔案館）

　
: Kernel-Win32 是一個試圖把 Wine 的部分模組移入 Linux 核心以提高 Wine 的執行效率的專案。相容核心利用 (部分是重實現) kernel-win32 專案代碼實現了相容核心的 Windows 系統呼叫機制。

* NDISwrapper

　
: NDISWrapper 在 Linux 核心中實現了 Windows 核心的一些部件，包括 NTOSKRNL API（一個基本的 WDM 控制器）和一系列諸如把 Wireless/NDIS/USB/PnP 等的 Windows 系統呼叫轉向 Linux 系統呼叫的封裝。NDISWrapper 不限於執行 NDIS 驅動，只要 WDM 驅動不呼叫它還未實現的 Windows 系統呼叫也是可以執行的。因此可以認為 NDISWrapper 是一個 WDM 的雛形。相容核心可以參考 NDISWrapper 和 ReactOS 的 WDM 實現構建自己的 WDM。

## 使用者

* MagicLinux - MagicLinux 是一個基於 Red Hat Linux 的中文 Linux 發行版。MagicLinux 2.1 之相容核心衍生版是第一個內建相容核心的發行版，它包含相容核心 0.2.2 版本。

## 硬體需求

相容核心最低的硬體需求是:

* 128MB RAM
* IDE 或 SATA 硬碟
* VGA 相容顯示卡
* PS/2 或 USB 鍵盤
* PS/2 或 USB 滑鼠

### 架構支援

* IA-32 (支援中)
* x86-64 (不支援，計劃中)
* 龍芯 3 (不支援，計劃中) -- Loongson 3 是一種 MIPS-64 64-bit 構架的通用 CPU，它計劃包含二百多條指令以便硬體仿真 x86 CPU 指令，從而使其能夠執行 Windows。

## 參考資料

* Linux Unified Kernel Aims to Combine Linux, NT Kernel （頁面存檔備份，存於網際網路檔案館）
* August 2013 Linux Kernel News （頁面存檔備份，存於網際網路檔案館）

## 外部連結

https://web.archive.org/web/20090224010114/http://www.longene.org/