← Декабрь 2024 | ||||||
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 за неделю
Пишем свою операционную систему. Доступ к ListFS из обычной ОС
Всем доброго времени суток! Последний выпуск рассылки выходил очень давно. Приношу свои извинения, но у меня, к сожалению, стало слишком мало времени. Да и теперь, спустя такой длительный интервал времени, возникает желание переписать ОС с чистого листа, исправив старые ошибки (и добавив новых, кхе-кхе. Наверное, стоит оформить ОС как OpenSource проект, чтобы всегда был доступен полный исходный код, а все желающие могли вносить исправления (мне неоднократно приходили письма с просьбами выслать полный исход...
Пишем свою операционную систему. Улучшение обработки IRQ прерываний и многозадачности
Давненько не писал новых выпусков. пришло время это исправить. Сегодня мы сильно изменим структуру обработки IRQ-прерываний. Раньше, каждое прерывание описывалось отдельно. Теперь мы сведём обработку всех прерываний в одну функцию. Если сейчас выигрыш от этого не очевиден, то потом он будет заметнее. Ведь в конечном счёте ядро должно при возникновении IRQ-прерывания отправить сообщение программе-драйверу (у нас же микроядро. И меняться в этом сообщении будет только номер прерывания. Не будем же мы писать 1...
Пишем свою операционную систему. Начало реализации многозадачности
Во-первых, вот исправление функции list_remove из stdlib.c, чтобы она нормально компилировалась: void list_remove(ListItem *item) { mutex_get(&( item-> list->mutex, true); if ( item-> list->first = item) { item-> list->first = item->next; if ( item-> list->first = item) { item-> list->first = NULL; } } item->next->prev = item->prev; item->prev->next = item->next; item-> list->count-; mutex_release(&( item-> list->mutex); } Во-вторых, се...
Пишем свою операционную систему. Начало реализации многозадачности
Во-первых, вот исправление функции list_remove из stdlib.c, чтобы она нормально компилировалась: void list_remove(ListItem *item) { mutex_get(&( item-> list->mutex, true); if ( item-> list->first = item) { item-> list->first = item->next; if ( item-> list->first = item) { item-> list->first = NULL; } } item->next->prev = item->prev; item->prev->next = item->next; item-> list->count-; mutex_release(&( item-> list->mutex); } Во-вторых, се...
Пишем свою операционную систему. Улучшение стандартной библиотеки
Причина падения ОС при включении оптимизации была найдена - memset (как и memcpy) меняет значение регистра EDI, который считается неизменным по соглашению вызова C (вызываемая функция обязана сохранить его значение. Я принял достаточно радикальное решение - часть функций стандартной библиотеки будет вынесена в ассемблерный файл для лучшей оптимизации (строковые операции компилятор делает неэффективно) и простоты написания. Теперь в нашем проекте появляется файл stdlib.i386.asm: format ELF public memset pub...
Пишем свою операционную систему. Многозадачность
В этом выпуске мы рассмотрим теорию многозадачности и подготовим наш код к её поддержке. До конца в этом выпуске мы многозадачность не сделаем, потому что это достаточно сложная тема. Теория Многозадачность - это способность ОС выполнять несколько программ параллельно. В идеальной ситуации каждое приложение выполняется на отдельном ядре процессора, независимо и полностью параллельно. Однако, это идеальная ситуация и в реальности как правило недостижимая, поэтому сразу много процессов вынуждены делить один ...
Пишем свою операционную систему Менеджер виртуальной памяти
В этом выпуске мы наконец-то реализуем менеджер виртуальной памяти, который знает не только "что спроецировать", но и "куда спроецировать". Его реализацию на текущий момент можно считать черновой (в отличии от менеджера физической памяти) и безупречную работу я гарантировать не могу. Для начала исправим небольшую ошибку в map_pages: bool map_pages(phyaddr page_dir, void *vaddr, phyaddr paddr, size_t count, unsigned int flags) { for (; count; count) { phyaddr page_table = page_dir; char ...
Пишем свою операционную систему Защита памяти и работа над ошибками
В этом выпуске мы проставим правильные атрибуты для памяти ядра, а также исправим некоторые ошибки в коде. Открытие адресной линии A20 Работа с виртуальной машиной Bochs немного отличается от работы с реальным железом. Например, тем, что адресная линия A20 после загрузки в Bochs по умолчанию открыта. Это приводит к тому, что разработчику ОС не требуется открывать её вручную, потому что всё и так работает, однако ошибка проявится на реальном железе. Адресная линия A20 позволяет процессору обращаться к памят...
Пишем свою операционную систему. Немного улучшений менеджера памяти
В этом выпуске мы рассмотрим работу менеджера виртуальной памяти, а также улучшим некоторые другие части memory_manager.c. Заголовочный файл 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 32 #define PAGE_PRESENT (1 << 0) #define PAGE_WRITABLE (1 <<...
Пишем свою операционную систему. Менеджер физической памяти
Доброго времени суток! Сегодня в этом выпуске мы напишем реализацию менеджера физической памяти. Его задача - найти N свободных физических страниц, пометить их как занятые и отдать адрес первой. А также обратную операцию - пометка блока физических страниц как свободных. Мне известно 4 различных алгоритма: 1) Стек страниц. Создаётся специальная структура данных - массив физических адресов, количество элементов равно количеству страниц физической памяти. При 32-битном адресе это будет лишь 1/1024 всей памяти...