Пусть это будет мой самый амбициозный проект. У меня такое ощущение, что мир ИТ ждет много изменений в будущем. Некоторые из них я могу попытаться предсказать, а некоторые даже сделать. В моем видении будущее должно быть насыщенным событиями, что требует перформанса. Это должно быть безопасно, что означает шифрование и конфиденциальность. Кроме того, он должен быть экологически чистым с низким энергопотреблением.

Я хочу положить эти три концепции в основу новой операционной системы для архитектуры ARMv8, написанной с нуля с помощью инструментов низкого уровня. Я считаю, что эта архитектура является наиболее перспективной на сегодняшний день, и я хочу наилучшим образом использовать аппаратное обеспечение для достижения максимальной производительности. Я планирую запускать его на портативных устройствах, таких как телефоны, планшеты, ноутбуки и небольшие компьютеры. В качестве платформы для разработки был выбран Raspberry Pi 3 из-за его открытости. Но первые шаги будут сделаны под QEMU.

Еженедельно я буду публиковать заметки о процессе разработки, решениях и алгоритмах. Сам проект и документация размещены на GitHub в репозитории «lowenware/os».

Архитектура aarch64, также известная как ARMv8, является относительно новой и очень привлекательной. Для тех разработчиков, кто знаком с ассемблером x86, могу сказать, что он сильно отличается. Например, ARMv8 не предоставляет привычных команд push/pop, но у вас будет набор мощных инструментов для загрузки и сохранения регистров из памяти и в память. Так же, как я говорил о push и pop, вы можете, например, хранить два регистра в стеке, используя всего одну команду: STP x0, x1, [sp, -16]! Вкратце это сохраняет значения из регистров x0 и x1 по адресу из регистра sp и вычитает его значение на 16 байт, что соответствует размеру двух 64-битных регистров. Команда LDP x0, x1, [sp], 16 загрузит значения обратно из стека, изменив его указатель. Сказать ли, что вместо sp может быть любой другой регистр? Еще одна интересная особенность заключается в том, что при вызове подпрограммы адрес возврата не сохраняется в стеке. Для этой цели ARMv8 предоставляет специальный регистр lr (реестр ссылок). Поскольку регистры намного быстрее, чем память, вы можете сэкономить процессорное время на подпрограммах, которые не вызывают внутри собственных подпрограмм. И еще одна вещь, которую (я почти уверен) оценят многие разработчики, это то, что вы можете указать регистры для всех операндов и назначения для всех арифметических команд, вместо того, чтобы помнить, где вы должны хранить их и где найти результат всех время. Например, ADD x0, x1, x2 рассчитает сумму x1 и x2 и сохранит результат в x0. . Сладко, не так ли?

Все эти функции и отличия я обнаружил при реализации отладочного вывода. Пройдет некоторое время, прежде чем я смогу вывести что-либо на экран, но сейчас есть лучшая возможность. Эмулятор QEMU может выводить все данные, отправленные на UART0 из гостевой ОС, на терминал вашего HOST-компьютера. Говоря о Raspberry Pi 3, это также возможно, если вы подключите плату нуль-модемным кабелем к вашему ПК. Реализация виртуального устройства QEMU довольно проста. Входной порт UART0 сопоставлен с адресом 0x09000000, и нет необходимости ждать готовности порта. Вам просто нужно хранить данные отладки байт за байтом по этому адресу. На данный момент у меня есть три процедуры _uart_putc, _uart_putx и _uart_puts для печати символов, целых чисел HEX и строк с нулевым символом в конце. Возможно позже мне тоже понадобится подпрограмма для вывода n байт.

Но просто распечатать некоторый вывод не всегда достаточно для отладки, и я подготовил среду для отладчика GNU (gdb), которая может быть связана с QEMU через TCP-порт для пошагового контроля выполнения.

Надеюсь, было интересно читать. Следующая функция, которую нужно реализовать и написать, — это выделение памяти. Быть в курсе!