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項目提供。

## 開發

兼容內核是由中國的浙大網新有限公司在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系統調用機制。

色彩｜意義

紅｜舊版本; 不支援

黃｜舊版本; 仍支援

綠｜當前版本

藍｜未來版本

版本｜發佈日期｜更新

0.1.0｜2006年4月30日｜、移植kernel-win32、Windows系統調用機制基於"int 2e"

0.2.0｜2006年12月31日｜、實現了Windows的進程/線程創建、執行部分Windows的APC機制

0.2.1｜2008年2月4日｜、實現了Windows的進程/線程管理、虛擬內存管理、同步管理、對象管理、加載EXE功能

0.2.2｜2008年10月31日｜、Token機制、GUI安裝程序

0.2.2-1｜2008年12月17日｜、修正錯誤

0.2.3｜2009年2月12日｜、移植Wine的註冊表管理機制

0.2.4｜2009年5月22日｜、移植wine的文件管理系統、實現了一些註冊管理的API、binary packages for popular distributions provided

0.2.4.1｜2009年8月31日｜、基於Linux內核2.6.30、支持新的文件系統 (ext4及其他)

0.3｜2010年5月31日｜、移植所有wineserver的功能到內核及擺脫wineserver

0.3.1｜2011年2月28日｜、支持非root使用者使用、支持程序中文路徑

0.3.2｜2011年6月8日｜、支持wineconsole。Windows平台的console程序，像cmd.exe可以像這樣運行了：wineconsole cmd.exe、改進了進程的創建方式，使得windows的native-app 和 wine的一些buitin-app可以互相創建了

1.0-rc1｜2013年12月31日｜、完全修改了整個架構，Longene不再需要內核補丁、Longene終於支持了SMP、安裝更方便，兼容性更好，穩定性更強

1.0-rc2｜2014年1月16日｜、將wine升級到1.7.10版本、解決普通使用者重啟後無法使用的問題、解決若干文件權限問題、修改文件加載方式、其他若干BUG

### 現在和未來的開發

兼容內核正在整合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機制的主要途徑如下:

- Windows系統調用接口的實現——一些Windows的系統調用可以通過嫁接（重定向）到適當的Linux系統調用或部分重用相應的Linux內核函數來實現,,另一些在Linux內核中沒有對應物的功能則需要使用Linux低級的核內函數來實現。
- Windows設備驅動框架——-基本的設備驅動框架對應著Win2k內核中的I/O管理，以及電源管理、即插即用等機制，也涉及部分對象管理、系統配置、和安全管理方面的功能。這個框架上面與有關文件操作的系統調用(open，close，read，write，ioctl等)相銜接，中間實現基於「IO請求包」IRP（IO Request Packet）的設備驅動機制，下面則融入Linux內核的中斷響應/服務機制、包括「軟中斷」即bh函數的執行機制。主要包括設備驅動程序的動態裝入和連接的開發和實現、IRP的生成和傳遞、以及設備驅動程序的啟動、同步、和終結開發和實現、將設備驅動程序的中斷服務登記嫁接到Linux的中斷機制上，將設備驅動程序所關心的Windows內核運行狀態映射到Linux內核的運行狀態上、將設備驅動程序的DPC請求嫁接到Linux的bh函數機制上。
- Windows的設備驅動模塊(.sys文件)——微軟持有版權的.sys文件基本上是一些標準的、基本的、常用的外部設備，包括磁碟、USB、圖形設備、網路設備等的設備驅動模塊。Linux實際上已經具備相應的功能，只是需要將Linux內核(包括設備驅動模塊)中的這些函數和數據結構與具體.sys的調用界面之間架起橋梁。但是也可能有一些微軟的.sys模塊在Linux內核中找不到對應物，那就需要仿製了。
- 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

## 基本資料

- 開發者：Insigma Technology
- 發行日期：2006年
- 軟體版本週期：1.0-rc2
- 程式語言：C
- 作業系統：Unix-like
- 類型：內核
- 許可協議：GNU General Public License 版本2
- 網站： www.longene.org