Skip to content

Latest commit

 

History

History
67 lines (51 loc) · 6.89 KB

File metadata and controls

67 lines (51 loc) · 6.89 KB

Руководство по разработке и переносу приложений для VLSMC

Этот документ описывает процесс создания новых программ, адаптации существующего кода и общее видение развития пользовательского пространства (Ring 3) в операционной системе RAND Elecorner 36.

1. Алгоритм создания нового приложения

1.1. Точка входа и CRT0

Файл crt0.asm является обязательным, так как он подготавливает среду выполнения:

  • Стек: Настройка регистра ESP (обычно на вершину сегмента стека).
  • Инициализация: Обнуление секции .bss.
  • Вызов: Передача управления в main.
  • Завершение: Вызов sys_exit после возврата из main, чтобы процесс не "улетел" в пустую память.

1.2. Линкер-скрипт (user.ld)

Линкер-скрипт должен не только задавать точки входа, но и определять границы памяти:

  • _heap_start: Символ, указывающий на начало свободной памяти после секции .bss. Необходим для корректной работы malloc.
  • _stack_top: Конец доступной виртуальной памяти процесса, используемый для инициализации стека.

1.3. Сборка (Workflow)

Для компиляции приложения (пример для x86_64-linux-gnu):

  1. Компиляция: g++ -m32 -ffreestanding -fno-pie -fno-exceptions -fno-rtti -nostdlib -nostdinc -Iuser -c myapp.cpp -o myapp.o
  2. Линковка: ld -m elf_i386 -T user/user.ld user_crt0.o myapp.o -o MYAPP.ELF
  3. Размещение: mcopy -i data.img MYAPP.ELF ::/MYAPP.ELF (Примечание: для ISO или реальных дисков метод записи будет зависеть от используемой ФС).

2. Адаптация и перенос (Porting)

2.1. POSIX: Обертки вместо заглушек (Stubs)

Для работы сложных программ простых "заглушек" недостаточно. Требуется минимальный набор функциональных оберток:

  • open/read/write/close: Должны быть перенаправлены на App::readFile и соответствующий сисколл записи (в текущей реализации VLSMC файловая система пока не предоставляет дескрипторы файлов, поэтому требуется эмуляция через буферы).
  • sbrk: Прямое перенаправление на sys_sbrk.

2.2. Ограничения

  • Сигналы: В текущей версии API асинхронные сигналы (SIGINT и др.) не поддерживаются. Приложения работают в синхронном режиме.
  • Многозадачность: fork() не реализован. Создание новых потоков/процессов возможно только через системный spawnProcess.

2.3. Доступные функции стандартной библиотеки (Libc)

ОС предоставляет изолированную реализацию 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).

3. Будущее видение Ring 3

3.1. Динамическая линковка

  • Реализация формата .so с таблицей процедурных связей (PLT) и глобальной таблице смещений (GOT).
  • Системный загрузчик будет выполнять релокации символов при старте приложения.

3.2. Графическая подсистема и Shared Memory

  • Оконный менеджер предоставляет Shared Buffer ID. Приложение маппит его через sys_map_mmio (или аналогичный вызов для разделяемой памяти).
  • Синхронизация: Использование атомарных флагов в заголовке буфера для предотвращения одновременной записи (Double Buffering на уровне приложения).

4. Безопасность и отказоустойчивость

  • Нарушение границ: При попытке доступа к нераспределенной памяти или памяти ядра возникает исключение Page Fault (#PF). Ядро немедленно завершает процесс (Segmentation Fault) и выводит диагностическое сообщение в консоль.
  • Ошибки сисколлов: Большинство вызовов возвращают -1 или NULL при ошибке, устанавливая код в errno. Рекомендуется проверять результат каждого вызова.

5. Справочник системных вызовов (User-Level)

Вызов Описание Ограничения
sys_print Вывод строки Только символы ASCII/UTF-8
sys_sbrk Изменение размера кучи Ограничено физической RAM
sys_send_msg IPC сообщение Лимит размера 4 Кб
sys_map_mmio Маппинг памяти Требует прав Driver