Если вы используете QEMU, как указано в README.md, то это ожидаемо. У меня в QEMU тоже всё работает очень медленно - не знаю, почему производительность так упала, но как есть.
Рекомендую попробовать VirtualBox - в нём работа идёт значительно шустрее, хотя всё равно не сравнится со скоростью на голом железе.
Данная функция используется для подсчёта времени и переключения задач.
Она принимает указатель на вершину стека, в который были сохранены регистры. После этого функция выполняет переключение на следующую задачу и возвращает указатель на вершину стека другой задачи.
Ну ошибки с размером переменных, по большей части. В вашем коде используется uint16_t, что ограничивает максимальное значение до 65535, тогда как вы указали FAT_ENTRIES = 600000. Это могло бы привести к проблемам или неопределённому поведению.
По большей части из ошибок, это ошибка типов (uint16_t), хотя по объёму это уже ближе к полноценной FAT32.
Я также внес небольшие оптимизации:
возможность читать и записывать файлы по фрагментам,
более точные проверки.
В результате теперь есть недо-реализованная FAT32, которая позволяет хранить файлы большего размера.
Если вам удастся создать качественную ОС на базе моего ядра — это будет здорово.
В принципе, у меня больше вопросов нет. Я не против, так как мы делаем два разных продукта: я — ядро, вы — ОС на его основе.
Есть небольшая просьба:
Если в дальнейшем в вашей ОС появятся драйверы (диски, устройства и т.д.), прошу предоставить возможность интегрировать их напрямую в моё ядро.
Сами программы и всё, что будет сделано вокруг ядра, я забирать не планирую, так как моя цель — разработка именно ядра, а не полноценной ОС.
Если вашей ОС потребуется реализовать дополнительные syscall или другой функционал, связанный с ядром, вы можете оставлять предложения в разделе Discussions на GitHub.
Хотелось бы подробнее узнать о вашей команде, так как, честно говоря, я впервые о ней слышу. В частности:
Какие проекты вы реализовывали ранее?
Немного информации о вас.
На данный момент в ядре нет полноценной командной системы, так как ещё не написаны программы (кроме терминала), которые могли бы выполняться. Инструкции по сборке приложений для ядра описаны в файле user/README.md.
Для написания программ не важна используемая система — главное, чтобы их можно было собирать в формате ELF-32 (в дальнейшем, после реализации Long Mode, — ELF-64).
Также требуется доработка приложения Terminal, чтобы оно корректно запускало программы через syscall.
Сейчас я работаю над реализацией загрузки в Long Mode. Полная загрузка и запуск через GRUB теперь работает. Сам Long Mode реализован, но многозадачность пока работает нестабильно — разбираюсь с этим. Если интересно, код доступен в ветке Experimental kernel.
Вопросы к вам:
Проект планируется остаться open source?
Будет ли возможность вносить изменения и дорабатывать его (например, создавать pull requests), если мне покажется интересна ваша реализация?
Создание ядра — мы настроили загрузчик, инициализировали GDT и IDT, подготовили окружение для работы в защищённом режиме.
2) Старт при помощи BIOS
Любая система и любой компьютер запускается через BIOS. Процесс выглядит так: Нажатие кнопки включения → BIOS подаёт питание на CPU → процессор начинает выполнять инструкции по адресу BIOS → поиск загрузочного устройства (в порядке, указанном в настройках BIOS) → копирование первого сектора (512 байт) в ОЗУ → загрузка загрузчика.
3) Зачем нужна cli перед созданием таблиц прерываний
Почему нельзя отключить прерывания только перед созданием таблицы?
Да, некоторые загрузчики могут автоматически устанавливать флаг CLI по умолчанию. Но это не гарантируется. Если при переходе в Protected Mode прерывания не отключены, ядро может сразу начать получать IRQ-сигналы (например, от клавиатуры, мыши, дисков, таймера). Процессор попытается обработать их, обратившись к адресам в таблице IDT, которой ещё нет. В итоге он попадёт на «мусор» в памяти, что приведёт к краху ядра или неопределённому поведению.
Поэтому при старте ядра не лишним будет самостоятельно отключить прерывания с помощью cli, чтобы избежать подобных проблем.
Команда cli используется для отключения прерываний до создания таблицы IDT (Interrupt Descriptor Table). Если не отключить прерывания заранее, процессор при их возникновении будет обращаться по неинициализированным адресам, что приведёт либо к крашу ядра, либо к неопределённому поведению.
После того как таблица прерываний создана и установлена, а также настроена необходимая маска прерываний, их можно снова включить с помощью команды sti. После этого прерывания будут обрабатываться корректно.
По умолчанию GRUB запускает ядро в protected mode (в котором оно сейчас работает). В этом режиме поддерживаются только 32-битные регистры. Для использования 64-битных регистров и архитектуры необходимо вручную реализовать переход в long mode.
Спасибо большое за ваш комментарий.
Я рад, что статья была для вас интересна и полезна.
Добрый день.
Смотрите пример функции
get_kmalloc_statsи её системного вызова - там наглядно показано, как вернуть структуру.Добрый день.
Если вы используете QEMU, как указано в README.md, то это ожидаемо.
У меня в QEMU тоже всё работает очень медленно - не знаю, почему производительность так упала, но как есть.
Рекомендую попробовать VirtualBox - в нём работа идёт значительно шустрее, хотя всё равно не сравнится со скоростью на голом железе.
Добрый день.
Пользовательские программы можно писать на языке C.
Используйте примеры linked.ld и Makefile из одной из существующих программ для сборки C-кода через команду
make.Данная функция используется для подсчёта времени и переключения задач.
Она принимает указатель на вершину стека, в который были сохранены регистры.
После этого функция выполняет переключение на следующую задачу и возвращает указатель на вершину стека другой задачи.
Ну ошибки с размером переменных, по большей части.
В вашем коде используется
uint16_t, что ограничивает максимальное значение до65535, тогда как вы указалиFAT_ENTRIES = 600000.Это могло бы привести к проблемам или неопределённому поведению.
По большей части из ошибок, это ошибка типов (
uint16_t), хотя по объёму это уже ближе к полноценнойFAT32.Я также внес небольшие оптимизации:
возможность читать и записывать файлы по фрагментам,
более точные проверки.
В результате теперь есть недо-реализованная FAT32, которая позволяет хранить файлы большего размера.
Скорее FAT32 с некоторыми особенностями FAT16.
То есть поддерживается:
больше хранимых данных,
увеличенная длина имён файлов,
большее количество файлов и файлов большего размера.
При этом, как и в FAT16, отсутствуют права доступа, принадлежность к пользователю и другие специфические особенности FAT16.
Добрый день!
Насчёт возраста у меня нет предубеждений.
Если вы способны внести свой вклад в это ядро, мы будем только рады и благодарны.
Добрый день!
Если вам удастся создать качественную ОС на базе моего ядра — это будет здорово.
В принципе, у меня больше вопросов нет.
Я не против, так как мы делаем два разных продукта: я — ядро, вы — ОС на его основе.
Есть небольшая просьба:
Если в дальнейшем в вашей ОС появятся драйверы (диски, устройства и т.д.), прошу предоставить возможность интегрировать их напрямую в моё ядро.
Сами программы и всё, что будет сделано вокруг ядра, я забирать не планирую, так как моя цель — разработка именно ядра, а не полноценной ОС.
Если вашей ОС потребуется реализовать дополнительные
syscallили другой функционал, связанный с ядром, вы можете оставлять предложения в разделе Discussions на GitHub.Желаю вам успехов в развитии вашей EXOS!
Ладно, насчёт UEFI действительно вышла ошибка — похоже, в информации, на которую я опирался, была неточность.
Добрый день.
Ваше предложение звучит очень интересно.
Хотелось бы подробнее узнать о вашей команде, так как, честно говоря, я впервые о ней слышу. В частности:
Какие проекты вы реализовывали ранее?
Немного информации о вас.
На данный момент в ядре нет полноценной командной системы, так как ещё не написаны программы (кроме терминала), которые могли бы выполняться.
Инструкции по сборке приложений для ядра описаны в файле
user/README.md.Для написания программ не важна используемая система — главное, чтобы их можно было собирать в формате ELF-32 (в дальнейшем, после реализации Long Mode, — ELF-64).
Также требуется доработка приложения Terminal, чтобы оно корректно запускало программы через syscall.
Сейчас я работаю над реализацией загрузки в Long Mode.
Полная загрузка и запуск через GRUB теперь работает. Сам Long Mode реализован, но многозадачность пока работает нестабильно — разбираюсь с этим.
Если интересно, код доступен в ветке
Experimental kernel.Вопросы к вам:
Проект планируется остаться open source?
Будет ли возможность вносить изменения и дорабатывать его (например, создавать pull requests), если мне покажется интересна ваша реализация?
Как говорила моя преподавательница по матану:
Так что разбираемся.
1) Переход в защищённый режим
2) Старт при помощи BIOS
Любая система и любой компьютер запускается через BIOS.
Процесс выглядит так:
Нажатие кнопки включения → BIOS подаёт питание на CPU → процессор начинает выполнять инструкции по адресу BIOS → поиск загрузочного устройства (в порядке, указанном в настройках BIOS) → копирование первого сектора (512 байт) в ОЗУ → загрузка загрузчика.
3) Зачем нужна
cliперед созданием таблиц прерыванийПочему нельзя отключить прерывания только перед созданием таблицы?
Да, некоторые загрузчики могут автоматически устанавливать флаг
CLIпо умолчанию. Но это не гарантируется. Если при переходе в Protected Mode прерывания не отключены, ядро может сразу начать получать IRQ-сигналы (например, от клавиатуры, мыши, дисков, таймера).Процессор попытается обработать их, обратившись к адресам в таблице IDT, которой ещё нет. В итоге он попадёт на «мусор» в памяти, что приведёт к краху ядра или неопределённому поведению.
Поэтому при старте ядра не лишним будет самостоятельно отключить прерывания с помощью
cli, чтобы избежать подобных проблем.Надеюсь, я ответил на ваш вопрос.
Вроде, исправил же.
Не знаю, что там должно быть при смене origin, но, как есть.
Добрый день.
Добавил комментарии в начале каждого примера кода с указанием, где находится соответствующий файл.
«Прикол», который вы видите, связана с переносом проекта с моего личного GitLab-сервера на GitHub, поэтому аватарка пользователя не отображается.
Добрый день.
Команда
cliиспользуется для отключения прерываний до создания таблицы IDT (Interrupt Descriptor Table).Если не отключить прерывания заранее, процессор при их возникновении будет обращаться по неинициализированным адресам, что приведёт либо к крашу ядра, либо к неопределённому поведению.
После того как таблица прерываний создана и установлена, а также настроена необходимая маска прерываний, их можно снова включить с помощью команды
sti. После этого прерывания будут обрабатываться корректно.Добрый день.
По умолчанию GRUB запускает ядро в protected mode (в котором оно сейчас работает). В этом режиме поддерживаются только 32-битные регистры.
Для использования 64-битных регистров и архитектуры необходимо вручную реализовать переход в long mode.
Возможно, это будет добавлено позже.
А.
Понял.
Исправил.
Добрый день.
Терминал пока версии 0.1. Весь функционал будет постепенно добавляться и дополняться. На данный момент это предрелизная версия.
Обновите окно.
Добрый день.
Это ядро запускается как ELF-файл через загрузчик GRUB.