← Январь 2025 | ||||||
1
|
2
|
3
|
4
|
5
|
||
---|---|---|---|---|---|---|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
31
|
За последние 60 дней ни разу не выходила
Открыта:
28-06-2012
Пишем свою операционную систему на Ассемблере и Си с нуля. Свой начальный загрузчик, своя файловая система, своя архитектура и т. д.
Рассылка может быть полезна для ознакомления с принципами работы операционных систем и обучения низкоуровневому программированию.
Итоги рассылки (готовый код операционной системы) в случае успеха преобразуются в самостоятельный проект.
Статистика
0 за неделю
Пишем свою операционную систему. Менеджер памяти
Пришло время начать писать менеджер памяти - важнейший компонент любой операционной системы. Однако до его реализации в коде почему-то не дошла ни одна из известных мне рассылок. Напишем заголовочный файл memory_manager.h, обозначив задачи на этот выпуск: #ifndef MEMORY_MANAGER_H #define MEMORY_MANAGER_H #include "stdlib.h" #define PAGE_SIZE 0x1000 #define PAGE_OFFSET_BITS 12 #define PAGE_OFFSET_MASK 0xFFF #define PAGE_TABLE_INDEX_BITS 10 #define PAGE_TABLE_INDEX_MASK 0x3FF #define PHYADDR_BITS 3...
Пишем свою операционную систему. Работа с клавиатурой
Доброго времени суток! До предыдущего выпуска пользователь не как не мог взаимодействовать с нашей операционной системой, лишь наблюдать её работу. Теперь она уже умеет как-то реагировать на нажатия клавиш, отображая текстовые сообщения, но этого мало для нормального ввода данных. Однако сначала приведу Makefile для предыдущего выпуска: ifdef OS LDFLAGS = -mi386pe else LDFLAGS = -melf_i386 endif CFLAGS = -m32 -ffreestanding all: script.ld startup.o stdlib.o main.o interrupts.o tty.o ld (LDFLAGS) -T script....
Пишем свою операционную систему. Обработка прерываний
Доброго времени суток! В предыдущем выпуске мы реализовали более-менее полноценный вывод текстовой информации на экран с возможностью управления позицией курсора и цветом текста, однако до сих пор пользователь никак не мог взаимодействовать с нашей ОС. Сегодня мы исправим этот недостаток, написав простой драйвер клавиатуры PS/2 (USB клавиатуры эмулируют PS/2, так что и они будут поддерживаться. Прерывания Нам уже известно два механизма взаимодействия процессора с остальными устройствами - через специальные...
Пишем свою операционную систему. Bugfix и printf
Приветствую всех своих читателей! Недавно заметил ошибку в написанном нами ещё давно startup.asm: аргументы передавались не в том порядке, в котором их принимает kernel_main. Это не проявлялось бы, пока мы не начали использовать значения этих аргументов. Вот правильная версия: format ELF public _start extrn kernel_main section ".text" executable _start: movzx edx, dl push ebx push esi push edx lgdt [gdtr] call kernel_main add esp, 3 * 4 : cli hlt jmp @b section ".data" writable gdt: dq ...
Пишем свою операционную систему. Драйвер текстового экрана
До этого момента мы выводили текст на экран лишь с помощью прямого копирования байт в видео-память. Было бы не плохо реализовать функции вроде printf для более удобного вывода на экран. Вообще-то я хочу получить в итоге микроядро, и драйверу консоли там не место, однако поскольку эта рассылка имеет цель не только задокументировать ход работы, но и наглядно показать процесс разработки, я пока немного нарушу последовательность и напишу драйвер для ядра. Ничто не мешает в будущем удалить лишние модули из ядра...
Пишем свою операционную систему. Стандартная библиотека
Заголовочный файл стандартной библиотеки В прошлом выпуске мы наконец-то перешли с Ассемблера на язык высокого уровня Си и написали простейшее ядро. Поскольку мы пишем свою ОС, в нашем распоряжении лишь аппаратные возможности и конструкции языка Си, никакой стандартной библиотеки и функций - ведь они рассчитаны на работу под существующей системой (если вы компилируете программу в Linux, функции рассчитаны на работу с системными вызовами Linux, если под Windows, то функции уже другие и т. д. Сегодня мы напи...
Пишем свою операционную систему. Переходим на Си
Приветствую всех своих читателей! Предыдущие выпуски могли быть несколько запутанными. Начальная загрузка, Assembler, BIOS. Сегодня мы наконец переходим к более интересной и понятной части - мы начинаем писать ядро. И писать мы его будем на языке высокого уровня Си. В начальный загрузчик осталось внести всего пару дополнений и он будет полностью готов грузить любые 32-битные ядра. Определение объёма оперативной памяти Конечно, можно подсчитать объём памяти вручную в ядре - перебирать адреса от 0x100000 и п...
Пишем свою операционную систему. Страничная адресация
Доброго времени суток! В прошлом выпуске мы остановились на том, что перешли в защищённый режим и вывели один символ на экран. Сейчас пришло время рассказать об одной вещи, которая является, пожалуй, ключевым элементом в построении многозадачности и вообще сильно влияет на архитектуру любой полноценной операционной системы. Это - страничная трансляция адресов. Для начала познакомимся с тремя видами адреса - физический адрес , линейный адрес и виртуальный адрес . Во-первых, физический адрес - это непосредст...
Пишем свою операционную систему. Переход в защищённый режим
После недельного перерыва вновь могу обрадовать вас новым выпуском своей рассылки. Итак, как вы помните, в реальном режиме работы процессора нам доступен всего лишь 1 мегабайт адресного пространства (из которых обычной памятью является всего лишь 640 килобайт. Так это и было во времена первых процессоров вроде 8086, но постепенно объёма оперативной памяти стало не хватать. В то же время требовалось сохранить полную обратную совместимость, чтобы 16-разрядные операционные системы вроде DOS смогли нормально р...
Пишем свою операционную систему. Загрузка ядра и модулей
Приветствую всех! В прошлом выпуске мы написали подпрограммы для работы с файловой системой ListFS и реализовали загрузку продолжения загрузчика из файла на диске. Теперь мы не ограничены 512 байтами и можем дописать начальный загрузчик. Я не буду его жёстко привязывать к своему ядру - загрузчик будет читать конфигурационный файл, в котором содержится информация о расположении ядра и модулей, загружать все необходимые файлы в память и передавать управление ядра, предварительно переведя процессор в нужный р...