Найти в Дзене
Пишем операционную систему Триалогия - Прерывания: IDT, IOAPIC и LAPIC
В двух прошлых частях постоянно всплывал "тик таймера", запускающий переключение контекста. Но как этот тик вообще доходит до процессора? А нажатие клавиши, дочитанный сектор диска, пришедший сетевой пакет? Через прерывания! Это нервная система ядра, механизм, которым внешний мир получает право прервать процессор. Прерывание, это сигнал: "Стоп, займись мной немедленно". Процессор прерывает то, что делал, прыгает к обработчику, делает нужное и потом возвращается ровно туда, где был. Источников три:...
8 часов назад
Пишем операционную систему Триалогия - Планировщик: кто следующий?
В статье про многозадачность я оставил вопрос открытым -переключение контекста может прыгнуть к любому потоку, но какой будет выбран? Это решает планировщик, и он, без преувеличения, самая трудно сбалансированная часть всего ядра, потому что ему надо примирить две цели, которые противоречат друг другу. Одна цель, это приоритеты, к примеру приём из сети должен идти раньше фоновых часов, иначе пакеты потеряются. Важное вперёд. Другая цель, это "честность", но часы не должны ждать вечно лишь потому, что всегда найдётся что-то поважнее...
19 часов назад
Пишем операционную систему Триалогия - Многозадачность
До сих пор речь всегда шла об одном-единственном потоке исполнения: кусок кода, который берёт память, лезет к железу, читает файл. Но на рабочем столе работают оконный менеджер, терминал, часы и десяток фоновых сервисов ядра, вроде бы все разом. А на одном процессорном ядре в каждый момент может работать только один поток. Трюк за этим стар и прост: молниеносное переключение. Замечание сразу: тут речь о том, как происходит переключение задач (Task Switch). Какая задача будет выполняться следующй,...
1 день назад
Пишем операционную систему Триалогия - Аллокатор стеков ядра
В статье про память я его уже анонсировал: аллокатор, который выдаёт каждому потоку его 256 КБ в области стеков. Вот он. И это славный пример того, что нет одного правильного аллокатора, а требование выбирает инструмент. Каждому потоку, работающему в ядре, нужен свой стек: там лежат локальные переменные, адреса возврата вызовов функций и сохранённые регистры, когда планировщик переключается с одного потока на следующий. Двум потокам нельзя делить стек, иначе они затопчут друг другу данные. Значит,...
1 день назад
Пишем операционную систему Триалогия - MMIO: говорить с железом как с памятью
В статье про память в самом верху адресного пространства была область, которую я пометил "отдельная статья": окно MMIO по адресу 0xF0000000, размером 192 МБ. Теперь рассчитаемся по этому долгу. Вопрос за этим простой: как ядро вообще разговаривает с железом, с видеокартой, диском, сетевой картой? Исторически их два (DMA особый случай). Первый способ называется порт-I/O (или PMIO, port-mapped I/O): у процессора для него есть особые команды, in и out, и отдельное, крошечное адресное пространство из 65536 портов...
2 дня назад
Пишем операционную систему Триалогия - Аллокатор кучи (heap)
В прошлой части я закончил обещанием, что настоящие аллокаторы получат каждый свою часть. Вот первый: аллокатор кучи (heap allocator). Он управляет большой областью от 0x90000000 вверх (около 1,5 ГБ). Зачем она вообще нужна? Менеджер памяти из прошлой части мыслит целыми страницами по 4 КБ. А ядру (kernel) нужна память различного размера под структуры данных: 17 байт под имя, 200 байт под структуру, 1 килобайт под буфер. Целая страница 4 КБ на каждую мелочь была бы расточительством. Аллокатор нарезает...
2 дня назад
Пишем операционную систему Триалогия - Управление памятью и страничная память в ядре
В конце статьи про загрузку загрузчик передал ядру по части памяти две вещи: готовую, собранную вручную таблицу страниц и карту памяти от BIOS. Теперь посмотрим, что ядро из этого делает. Это обзор фундамента, а отдельные аллокаторы, которые сидят поверх него (куча, отображение MMIO, стеки потоков), позже получат каждый свою часть. Память у меня имеет три слоя, снизу вверх: 1. Физическая память - микросхемы RAM, которые реально стоят в машине. 2. Виртуальная память (страничная) - иллюзия аккуратного,...
3 дня назад
Пишем операционную систему Триалогия - Как работает загрузка
В обзоре я лишь грубо набросал цепочку загрузки: BIOS, загрузчик, ядро, рабочий стол. Теперь пройдём её по-настоящему, от самого первого сектора до момента, когда впервые запускается код на C. Это самая техническая часть пока что, и именно поэтому моя любимая, ведь тут происходит та магия, которой потом уже никогда не видно. У меня пока что сделана загрузка через BIOS. Когда ты включаешь компьютер, BIOS почти ничего за тебя не делает. Он грузит ровно 512 байт, первый сектор диска, по адресу 0x7C00 и передает управление по этому адрессу - прыгает (от jump - jmp в ассемблере)...
3 дня назад
Пишем операционную систему Триалогия - Общение между приложением и оконным менеджером
В конце прошлой части я обещал посмотреть, что ещё стоит поверх kcall (Kernel Calls): как программы "разговаривают" друг с другом и с оконным менеджером. Ровно этим мы сейчас и займёмся, на самом наглядном примере, какой у меня есть, на приложении, которое открывает окно. К этому надо привыкнуть. Во многих системах вся возня с окнами сидит глубоко внутри. У меня нет. Ядро вообще ничего не знает про окна. Оно знает экран и поток, который записывает туда пиксели, и больше ничего. Всё, что выглядит...
4 дня назад
Пишем операционную систему Триалогия - Мост между ядром и пользовательским пространством
В обзоре я упомянул его лишь мельком: мост между ядром и пользовательским пространством, систему, без которой ничего не работает. Он лежит под капотом и не отсвечивает, но если он заглючит, встаёт всё. Пора заглянуть внутрь. Кольцо - Ring, Поток - Thread, ..... , в статьях по програмированию постоянно приходится искать середину, все на русском языке или англицизмы использовать. Вроде все понимают, но выглядит тупо. Как в прочем и только с использованием русского языка непривычно. Программа у меня работает в ring 3, в пространстве пользователя...
4 дня назад
Пишем операционную систему Триалогия - Содержание
Это не руководство и не спецификация. Это история операционной системы, которую я пишу сам, кусок за куском, слой за слоем, и попытка рассказать её так, как я рассказал бы любопытному человеку за столом. Триалогия, это собственное ядро для 32-битного x86, собранное вручную. Оно стартует через свой загрузчик BIOS, переключается в защищённый режим, настраивает память и страничную трансляцию, и оттуда поднимает всё само: многозадачность со своим планировщиком, прерывания через IOAPIC и LAPIC, кучу,...
4 дня назад
Пишем операционную систему Триалогия - Попробовать самому
Хватит разговоров. В двух прошлых частях я рассказал, что такое Триалогия и как она устроена внутри. Теперь ты перестаёшь читать и запускаешь её сам. Не переживай, это проще, чем кажется и сломать ничего не выйдет, потому что всё работает в виртуальной машине, отгороженной от твоего настоящего компьютера. Две вещи. И то и другое бесплатно и есть под Windows, Linux и macOS. Какой путь выбрать дело вкуса. QEMU быстрее, если хочешь лишь заглянуть на минутку: одна команда и готово. VirtualBox настраивается...
4 дня назад