Это небольшая хобби, которую можно поиграть с вещами, которые я никогда не делал раньше ... она не предназначена для функциональной, полезной, безопасной или надежной. Это должно быть приблизительно весело для реализации.
Если вы хотите увидеть последние вещи, которые я задумал, ознакомьтесь с филиалом dev в этом репо. Как правило, master должен компилировать и запустить.
Начните с librs (эквивалент LIBC для этого проекта).
user/src/main.rs в качестве примера программы пользователя.cargo xbuild --target target.jsonПейджинг
memory::paging::map_regionСообщение с нулевой копией прохождения для IPC. Чтобы отправить сообщение,
Я сталкиваюсь с идеей отсутствия процессов вообще, просто дагами продолжений, которые могут или не могут принять участие в своих возможностях.
В настоящее время это чуть более 1500 LOC (не включая комментарии + witspace + зависимости). Неплохо!
Само ядро основано на продолжении, а не использует что-то вроде Kthreads. В первом проходе я просто заставляю вещи работать. Позже я мог бы вернуться и сделать это эффективным.
Никакого преодоления на основе таймера в ядра или пользовательском пространстве (хотя прерывания таймера действительно не происходят, чтобы таймеры могли работать). Нет замков, нет многопоточного в пользовательском пространстве. Каждый процесс является однопоточным и основанным на продолжении. Каждое Continuation может вернуть набор дополнительных продолжений, которые будут выполнены в любом порядке, ошибке или ничего. Продолжения также могут ждать событий, таких как ввод -вывод или увольнение другого процесса.
Одиночное пространство. Все живет в одном и том же месте. Биты записи таблицы страниц используются для отключения определенных частей адресного пространства для некоторых продолжений.
Маленькая куча ядра для динамического распределения памяти.
Обозначитель приятеля для физического распределения кадров.
Обозначатель приятелей для областей виртуального адреса пространства.
Простая система возможностей для управления доступом к ресурсам в системе, таких как области памяти.
Переключение на Usermode и обратно.
Системные вызовы с помощью инструкций syscall и sysret .
Загрузка бинарного эльфа, независимого от позиции в качестве задачи пользователя, запуска и выхода через Syscall.
Теперь, когда у меня есть в основном функционирующее базовое ядро, я могу начать играть с вещами!
ржавчина, ночью
rustc 1.45.0-nightly (99cb9ccb9 2020-05-11) llvm-tools-preview Rust Compount через rustup component add llvm-tools-preview
cargo xbuild и cargo bootimage через cargo install cargo-xbuild bootimage
build-essentials и стандартные UTILS: gcc , make , ld , objcopy , dd
qemu , чтобы бежать
Чтобы построить и бежать
$ cd os2/user
$ cargo xbuild --target x86_64-unknown-elf.json --release
$ cd ../kernel
$ bootimage run bootimage может быть проведено необязательно --release оптимизированные сборки.