Microsoft жжет. Недавно мы писали о присутствии специальных системных файлов с названиями LXss.sys и LXCore.sys в новейшем билде Windows 10, который используется разработчиками программ и драйверов, а также тестировщиками в служебных целях. В драйверах содержался код разбора заголовков ELF-файлов, а также прочие системные функции, характерные для Linux и отсутствующие в Windows NT by design. Уже тогда стало очевидно, что Microsoft собирается всерьез заняться интеграцией подсистемы Linux в Windows 10.



У компании уже имелся подобный опыт. Оригинальная концепция Windows NT (на которой основана Windows 10) подразумевала присутствие там трех подсистем: родной MS Win32, UNIX POSIX, а также IBM OS/2. Обе последние подсистемы отвалились где-то по дороге, которая вела к превращению Windows 2000 в Windows XP, а сама POSIX перекочевала в отдельный инструмент без возможности присутствия в дистрибутиве Windows по умолчанию. То же касается микропроцессорной архитектуры Alpha, от поддержки которой Microsoft также отказалась с выходом Windows 2000. Остается только гадать, сколько продержится в Windows подсистема Linux.

Стоит отметить, что во-первых, архитектура ядра Windows 10, как и прочих версий Windows NT, подразумевает под собой интеграцию других ОС, хотя бы на уровне поддержки запуска там приложений с возможностью реализации соответствующих системных вызовов с правильной семантикой. Для этого был введен вспомогательный уровень подсистем, который в случае с Win32 называется NT layer (ntdll). Прочие библиотеки подсистем также имели доступ к ядру и могли воспроизводить то поведение системных вызовов, которое было нужно конкретной подсистеме (например, fork в POSIX, которая выполняла ветвление процессов).

Во-вторых, концепции Windows NT и Linux во многом похожи: обе основаны на монолитном ядре, разбитом на подсистемы, обе используют схожие механизмы реализации объектов ядра и межпроцессного взаимодействия, а также обе берут свои истоки у концепции ядра оригинальной UNIX.

Нам сложно сказать, что именно подвигло Microsoft на интеграцию в Windows 10 второй подсистемы, однако, как и в прочих случаях компания подошла к этому весьма основательно, не опираясь на какие-либо подходы псевдо-эмуляции или виртуальных машин. Все вышеперечисленные подсистемы разрабатывались исключительно как native и имели схожие с Win32 полномочия в реализации функций собственных подсистем.

И так, по сути. Анонс новой подсистемы состоялся на известной конференции Microsoft под названием Build 2016, на которой анонсируются программные новинки компании. Было заявлено, что в будущей версии Windows 10 пользователи смогут пользоваться услугами командного интерпретатора Linux, известного как bash, что в свою очередь сразу указывает на присутствие в Windows загрузчика исполняемых ELF-файлов, а также среды (подсистемы) для их исполнения и стандартных инструментов типа ssh, grep, sed, и awk. В качестве эталона была выбрана Ubuntu Linux.


Рис. Слайд презентации «Linux on Windows». На слайде указано, что речь идет именно о полноценной подсистеме Linux, а не о псевдо-эмуляции или виртуальных машинах. Да, Linux становится частью Windows 10 и так же как POSIX и OS/2 будет работать в пользовательском режиме с реализацией семантики системных вызовов на уровне ядра.


Рис. Собственно архитектура или все то, что мы говорили выше, плюс специальная поддержка семантики системных вызовов Linux на уровне ядра, за что и отвечают два драйвера, указанных в самом начале.


Рис. Так как Linux становится полноценной подсистемой и частью Windows, ее командный интерпретатор можно вызвать через оболочку Windows Shell или же командный интерпретатор, как и показано на слайде.


Рис. 3. Демонстрация работы известной UNIX-команды ls для вывода списка содержимого директории.


Рис. 4. Утилита readelf для анализа заголовка ELF-файла в действии.


Рис. 5. Компилятор исполняемых файлов gcc.


Рис. Есть над чем поработать. :)

Полное видео демонстрации работы подсистемы Linux на Windows можно посмотреть здесь.