Этот документ описывает процесс создания новых программ, адаптации существующего кода и общее видение развития пользовательского пространства (Ring 3) в операционной системе RAND Elecorner 36.
Файл crt0.asm является обязательным, так как он подготавливает среду выполнения:
- Стек: Настройка регистра
ESP(обычно на вершину сегмента стека). - Инициализация: Обнуление секции
.bss. - Вызов: Передача управления в
main. - Завершение: Вызов
sys_exitпосле возврата изmain, чтобы процесс не "улетел" в пустую память.
Линкер-скрипт должен не только задавать точки входа, но и определять границы памяти:
_heap_start: Символ, указывающий на начало свободной памяти после секции.bss. Необходим для корректной работыmalloc._stack_top: Конец доступной виртуальной памяти процесса, используемый для инициализации стека.
Для компиляции приложения (пример для x86_64-linux-gnu):
- Компиляция:
g++ -m32 -ffreestanding -fno-pie -fno-exceptions -fno-rtti -nostdlib -nostdinc -Iuser -c myapp.cpp -o myapp.o - Линковка:
ld -m elf_i386 -T user/user.ld user_crt0.o myapp.o -o MYAPP.ELF - Размещение:
mcopy -i data.img MYAPP.ELF ::/MYAPP.ELF(Примечание: для ISO или реальных дисков метод записи будет зависеть от используемой ФС).
Для работы сложных программ простых "заглушек" недостаточно. Требуется минимальный набор функциональных оберток:
open/read/write/close: Должны быть перенаправлены наApp::readFileи соответствующий сисколл записи (в текущей реализации VLSMC файловая система пока не предоставляет дескрипторы файлов, поэтому требуется эмуляция через буферы).sbrk: Прямое перенаправление наsys_sbrk.
- Сигналы: В текущей версии API асинхронные сигналы (SIGINT и др.) не поддерживаются. Приложения работают в синхронном режиме.
- Многозадачность:
fork()не реализован. Создание новых потоков/процессов возможно только через системныйspawnProcess.
ОС предоставляет изолированную реализацию libc для пользовательских процессов (Ring 3). Подключение заголовочных файлов осуществляется напрямую (#include "libc/include/string.h").
- Память (malloc.h):
malloc,free,calloc,realloc. Менеджер осуществляет автоматическое слияние (coalescing) блоков для предотвращения фрагментации и управляет границами кучи поверх вызововsys_sbrk. - Примитивы памяти (string.h):
memcpy,memmove,memset,memcmp. Безопасно работают с перекрывающимися областями (overlap). - Работа со строками (string.h):
strlen,strnlen,strcpy,strlcpy,strcmp,strncmp,strchr,strstr. Реализована строгая проверка границ для минимизации уязвимостей (функции с суффиксомlилиn).
- Реализация формата
.soс таблицей процедурных связей (PLT) и глобальной таблице смещений (GOT). - Системный загрузчик будет выполнять релокации символов при старте приложения.
- Оконный менеджер предоставляет
Shared Buffer ID. Приложение маппит его черезsys_map_mmio(или аналогичный вызов для разделяемой памяти). - Синхронизация: Использование атомарных флагов в заголовке буфера для предотвращения одновременной записи (Double Buffering на уровне приложения).
- Нарушение границ: При попытке доступа к нераспределенной памяти или памяти ядра возникает исключение Page Fault (#PF). Ядро немедленно завершает процесс (Segmentation Fault) и выводит диагностическое сообщение в консоль.
- Ошибки сисколлов: Большинство вызовов возвращают
-1илиNULLпри ошибке, устанавливая код вerrno. Рекомендуется проверять результат каждого вызова.
| Вызов | Описание | Ограничения |
|---|---|---|
sys_print |
Вывод строки | Только символы ASCII/UTF-8 |
sys_sbrk |
Изменение размера кучи | Ограничено физической RAM |
sys_send_msg |
IPC сообщение | Лимит размера 4 Кб |
sys_map_mmio |
Маппинг памяти | Требует прав Driver |