- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF131:java
Материал из Linuxformat.
Содержание |
Ядро на Java
- Думаете, такой высокоуровневый язык, как Java, не подходит для системного программирования? Роман Ярыженко уверит вас в обратном!
Если вы хотя бы изредка следите за событиями в мире ИТ, то наверняка слышали о Singularity – исследовательском проекте, являющим собой попытку Microsoft создать полноценную операционную систему на платформе .NET (а если нет, см. http://research.microsoft.com/en-us/projects/singularity/). Сама концепция ОС на управляемом коде породила в сообществе множество жарких споров. Мы не будем занимать в них ни ту, ни другую сторону – а просто расскажем вам еще об одном аналогичном проекте. На сей раз он будет свободным (лицензия LGPL) и ориентированным на извечного конкурента .NET (или правильнее будет сказать наоборот?) – платформу Java. Имя ему – JNode, что, в свою очередь, является сокращением от английского «Java New Operating System Design Effort» – «Новая попытка спроектировать операционную систему на Java». Но почему новая?
Сначала было...
Когда появились первые кракеры со своими инструментами, эксплуатирующими уязвимости вроде переполнения буфера, ИТ-общественности пришлось начать думать о том, как защититься от них. К сожалению, язык C, который и по сей день является самым распространенным средством системного программирования, имеет с точки зрения безопасности фундаментальные (конструктивные) недостатки, связанные с использованием указателей. В те далекие времена, конечно, думали в первую очередь о производительности, и конструкция вроде
char buf[256]; scanf(“ %s», buf);
мало кого смущала. Впрочем, и когда взломщики стали неизбежным злом, разработчики средств защиты не отказались от C совсем, а лишь попытались сделать его надежнее. Это, безусловно, смягчило проблему, но не решило ее до конца.
В середине 90‑х годов теперь уже прошлого столетия теперь уже бывшая компания Sun Microsystems представила платформу Java с одноименным языком программирования. Последний позиционировался Sun как кросс-платформенный, легкий (думаю, вы можете с этим поспорить) и безопасный. Справедливости ради надо отметить, что Sun не была здесь пионером – языки со схожими чертами предлагались и до нее. Но они, по причине ли плохого маркетинга, либо покакой-то другой, не получили широкого распространения. С самого момента создания Java предпринимались попытки перенести на нее все необходимые приложения, чтобы создать операционную среду. Сначала это была JavaOS, потом – JBS, и, наконец, появился JNode.
Цель разработчиков JNode, заявленная на сайте проекта (http://www.jnode.org) – это «создание на базе Java простой в применении и установке операционной системы для личного использования. Любое Java-приложение должно запускаться быстро и безопасно».
Первая публичная версия JNode была выпущена в середине 2003 года. На момент написания статьи, последний официальный релиз имел номер 0.2.8 и датировался январем 2009 года. За прошедшие полтора года в системе, несомненно, произошли некоторые изменения, поэтому мы будем ориентироваться на «ночные сборки», на самом деле представляющие собой ежесуточные снимки Subversion-репозитория JNode.
Действительно просто
Поскольку история проекта (пока еще!) не очень длинна и не изобилует интересными подробностями, останавливаться на ее деталях мы не будем, и перейдем непосредственно к сборке JNode. Можно, конечно, взять готовый образ, но гораздо интереснее скомпилировать все самостоятельно из исходных текстов. Для этих целей нам понадобятся:
- Собственно исходные коды (их можно загрузить с сайта http://www.jnode.eu/releases/nightly-builds/jnode_svn_sources.tbz или взять LXFDVD).
- JVM и JDK 1.6 (подойдет и OpenJDK, и официальная сборка от Sun – как минимум одна из них должна присутствовать в репозиториях вашего дистрибутива).
- Ассемблер nasm (http://www.nasm.us).
«Но постойте! Разве GCC не нужен?» – вероятно, спросит грамотный читатель. Как это ни странно, нет. JNode почти полностью написан на Java – исключение составляют порядка тридцати файлов на ассемблере. Как же у разработчиков получается увязать между собой низкоуровневый язык и Java? Все дело в том, что после компиляции с помощью javac часть байт-кода, которая, собственно, и есть ядро (если его можно так назвать), преобразуется в родной код для процессоров x86 или x64. Все это, конечно, сродни «черной магии», в основе которой лежит специальный JIT-компилятор байт-кода, созданный разработчиками JNode – L1A (Level 1A). Чтобы отличить, вызывается ли он во время сборки или же во время выполнения, используется специальная переменная. Поскольку код, составляющий загрузочный образ, не задействует динамическую составляющую языка Java, компиляция выполняется не сложнее, чем в случае того же GCC (ведь фундаментальные отличия между C и Java кроются не в синтаксисе, а в управляемой природе последней). Правда, с оптимизацией у L1A пока еще не очень хорошо, но для проекта версии 0.2 это, в общем, простительно.
Предположим, вы скачали и распаковали исходный код, а также установили необходимые пакеты. Что теперь? Находясь в каталоге с исходными кодами, скомандуйте:
./build.sh
Пока идет сборка, давайте рассмотрим особенности ОС.
JNode изнутри
Это может показаться странным, но у JNode нет ядра в привычном понимании этого слова. Операционная система имеет трех уровневую структуру. В самом низу расположены виртуальная машина Java (ВМ) и ее базовые компоненты: например, сборщик мусора. Часть ВМ, написанная на ассемблере, по каким-то причинам называется «наноядром». Это не вполне точно, так как «наноядро» не может работать в отрыве от ВМ (в частности, ассемблерный код вызывает методы, которые на нем не реализованы), но, в конце концов, это вопрос терминологии. Выше расположены библиотека классов, драйверы, файловые системы и (по желанию) GUI. Как можно писать на Java драйверы, требующие низкоуровневого взаимодействия с оборудованием – например, реакции на прерывания? Все просто. Драйвер регистрирует в ассемблерном коде обработчик IRQHandler, а при возникновении прерывания увеличивается их счетчик, после чего планировщик распределяет каждое прерывание на соответствующие потоки с обработчиком. Еще выше находятся пользовательские приложения.
Это может показаться странным, но JNode не пользуется аппаратными кольцами x86, выполняя весь код в привилегированном режиме ring 0. Безопасность обеспечивается средствами платформы Java, производящей проверку байт-кода как при загрузке, так и при выполнении. Следовательно, прямой доступ к памяти пользовательских приложений и ВМ получить затруднительно. Также в JNode нет понятия «процесс», поскольку в Java они не поддерживаются. Но зато есть потоки и так называемые «Isolates»; последние можно считать аналогом процессов. Из дисковых файловых систем в JNode в данный момент поддерживаются (в разной степени) FAT, ext2, HFS+, NTFS, ISO9660, из сетевых – NFS и CIFS. Есть еще несколько псевдофайловых систем, таких как, например, JIFS (аналогичен proc в Linux).
Для пользователя
Но что это? JNode уже скомпилировался! ISO-образ системы можно найти в каталоге путь_к_JNode/all/build/cdroms/, но желая попробовать его в виртуальной машине, имейте в виду, что в VirtualBox он работает очень медленно, а в Qemu не поддерживается графика. Увы, разработчики ориентируются на VMware.
В качестве загрузчика в JNode используется Grub. Рекомендую выбрать пункт «JNode (all plugins)», с ним можно запустить больше приложений. Старт системы можно видеть на рисунке: все, что появляется после строки «before start_vm», выводится откомпилированным кодом Java.
Увидев стандартное приглашение, можно нажать Tab для получения списка доступных команд. Для некоторых из них доступно даже автодополнение ключей. Команды достаточно знакомые (grep, find, tar и пр.), но поклонников Norton Commander ждет приятный сюрприз – файловый менеджер cc (нет, это не компилятор C).
Графический интерфейс, хоть и в зачаточном состоянии, в JNode тоже имеется. Подсистема рассчитана на VMware; имеются драйверы для старых видеокарт ATI и Nvidia. Прежде чем активировать GUI, наберите gc (принудительная сборка мусора, может занять секунд пять), а после этого – startawt. Потребуется некоторое время, чтобы графическая подсистема запустилась; возможно, надо будет пошевелить мышью. Интерфейс... в нем нет ничего особенного, разве что он аскетичен и иногда «притормаживает». Зато в меню есть пара простеньких игр.
Что же дальше?
На данный момент (после семи лет разработки), JNode находится примерно на уровне ранних версий ядра Linux. Нет многих драйверов устройств, не реализованы утилиты командной строки, графическая и сетевая подсистема находятся в зачаточном состоянии... Все это говорит, во-первых, о малочисленности разработчиков, а во-вторых... JNode, в общем-то, нельзя назвать ОС – это скорее концепция.
Вычислительные мощности современных компьютеров позволяют выполнять управляемый код практически без проблем с производительностью. Разработчики JNode пошли еще дальше и решили, что на Java можно писать не только приложения, но и саму ОС. Это значит, что такая система, если она когда-нибудь достигнет промышленного уровня, будет надежнее и безопаснее, нежели ее «неуправляемые» аналоги.