Операционная система на основе x86 построена с нуля для целей обучения
int 64 который требует дескрипторов Gate для эскалации привилегийДля создания операционной системы (при условии GCC, NASM установлено),
makeБежать под Qemu
make qemuЗапустить (предполагая Bochs, установлен Bochs-SDL),
make runЗапустить под QEMU с поддержкой отладки (GDB)
make qemu_gdb(Прикрепите GDB, необходимые команды, уже представленные в файле .gdbinit в режиме верхнего уровня)
BIOS начинает процессор в 16-битном реальном режиме, Grub инициирует 32-битный защищенный режим. Изображение эльфа ядра оснащено многофузионным заголовком в соответствии с спецификацией GRUB, если Grub находит этот заголовок в первых 512 байтах изображения, то он загружает эльф в районе 0x100000, нижняя память принадлежит BIOS, а другие сопоставления оборудования/IO, такие как VGA. Код загрузки, выполняется из точки входа _start ядра, и (примечание BSS уже нулевой инициализирован Grub),
Простой first-fit распределитель стратегии, выделяющий память из пространства ядра, во время free он также управляет уплотнением смежных свободных блоков.
Для пользовательского пространства предоставляется Malloc/Free, который внутренне используемый системный вызов sbrk для увеличения разрыва системы (если это необходимо). Ядро выполняет необходимые настройки таблицы страниц и возврата увеличивает лимит разрыва системы.
Это разделено на картирование памяти пространства ядра и отображения памяти пользователя. Сопоставления пространства ядра остаются постоянными и являются частью каждого адресного пространства процесса, связанных только с клонированными, поскольку изменения из одного процесса в пространстве ядра также должны быть видны и другие процессы.
Пользовательские сопоставления пространства зависит от вызова exec , и у каждого процесса есть свое собственное ядро, а также пользовательский стек.
Во время переключателя контекста CR3 -регистр загружается с помощью базового адреса каталога текущих страниц и который также внутренне недействительный TLB (буфер перевода LookAside).
Пользовательские приложения хранятся в initramfs , архии формата CPIO в стандартном формате ELF. Во время ядра exec находит и анализирует изображение ELF, соответственно устанавливает свои страничные таблицы. Процесс Init запускает только shell , затем вешает там навсегда.
Планировщик работает от имени процесса выполнения в настоящее время, в основном в двух случаях,
Код режима ядра/сегменты данных отдельные, чем код пользовательского режима/сегменты данных с соответствующими программируемыми уровнями привилегий. При возвращении из исключения аппаратное обеспечение появляется CS (сегмент кода) и SS (сегмент стека) из стека, чтобы вернуться к более низкому уровню привилегий.
Мы программируем этот стек, соответственно, создавая новую задачу,
/* Task will start in CPL = 3, i.e. user mode */
task -> irqf -> cs = ( SEG_UCODE << 3 ) | DPL_USER ;
task -> irqf -> ds = ( SEG_UDATA << 3 ) | DPL_USER ;
task -> irqf -> eflags = 0x200 ;
task -> irqf -> ss = ( SEG_UDATA << 3 ) | DPL_USER ;X86 Adware Adware имеет встроенную поддержку для переключения задач, в основном переключение из пользовательского стека на стек ядра вместе с другими параметрами сегментации. Для этого каждая задача должна настроена с помощью собственных TSS, которая изменяется во время переключения контекста. Мы не будем использовать аппаратное переключение задач, но будем делать то же самое в самом программном обеспечении. В любом случае нам необходимо настроить на по крайней мере One TSS, который имеет допустимый режим ядра SS (сегмент стека) и ESP (указатель стека) для текущей задачи.
Случайный FAQ
Не стесняйтесь, чтобы рассылать и отправлять запрос на слияние