Search
Write a publication
Pull to refresh

Comments 23

Ох уж эти попытки структурирования в листинге ассемблера...

Круто - слов нет, одни приятные эмоции. А что Вас побудило создать её?

Спасибо ♥️

Приятно получать такие комментарии. К написанию меня побудило то, что я бросил себе вызов, "смогу ли я?". И "научный" интерес как ОС работают "изнутри"

В дальнейшем планирую улучшать её, или даже перейти в UEFI

"...Регистр начала стека sp устанавливаем 0x7Bff - ближайшая пустая область в оперативной памяти. А регистр конца стека ss обнуляем (стек растёт вниз)..." 

Так неправильно, нужно 0x7С00, (выравнивание).

Приму к сведению 🫡

Или просто глянуть, как сделано у других:

Вообще, процесс загрузки сильно сложней -- в частности, она может производиться не только с дисков.

в последних двух байтах первого сектора которого находится специальная запись двухбайтовая 0x550xAA, указывающая, что он содержит загрузчик ядра. Обычно сектор равняется 512 байт, но на некоторых устройствах оооочень редко может быть другое количество байт на сектор

Угу, размер сектора не обязательно равен 512 байтам. А вот насчёт сигнатуры 55AA сказано неверно: она находится не в последних двух байтах первого сектора, а в байтах по смещениям 510 и 511 от начала первого сектора. Т.е. если сектор имеет размер 4 килобайта, весь загрузчик, включая эту сигнатуру, будет занимать его первые 512 байт, а остальные 3,5 килобайта игнорируются.

BootLoader должен после своего запуска найти на диске ядро системы, загрузить его с диска в оперативную память, перейти из реального режима (x16) в защищённый режим (x32) и передать управление ядру

Вообще, в общем случае, первичный загрузчик (тот, что загружается кодом BIOS) ищет и загружает вторичный загрузчик, а уже вторичный что-то там делает для загрузки ОС.

Регистр начала стека sp устанавливаем 0x7Bff - ближайшая пустая область в оперативной памяти. А регистр конца стека ss обнуляем (стек растёт вниз).

Насчёт выравнивания стека уже сказали (хотя я, честно говоря, не помню, является ли это требованием для IA-32 aka x86). А вот SS -- это не регистр конца стека, это регистр сегмента стека. Его содержимое совместно с SP и формирует физический адрес памяти, где находится текущая вершина стека.

В современном мире используется LBA запись, в то время, как биос для считывания использует систему CHS.

Вообще-то, BIOS, кроме самых ранних версий, успешно работает и с LBA, только номера функций другие. И они (эти функции), кажется, не умеют работать с дискетами -- только с жёсткими дисками.

Корневой каталог расположен после загрузочного сектора и таблиц FAT.

В FAT12 и FAT16 -- да, в FAT32 -- нет.

Отнимаем от si 3 - первые две записи в FAT заняты корневым каталогом и меткой тома

Неверно. Нулевой элемент FAT содержит в своём первом байте значение, хранящееся в поле BPB_Media; остальные его биты всегда установлены.

Первый элемент FAT12 всегда содержит значение, отмечающее конец цепочки кластеров файла. В FAT16 и FAT32 изначально это тоже признак конца цепочки кластеров, однако биты 15:14 в FAT16 и 27:26 в FAT32 имеют специальное назначение:

  • 15/27 — если установлен, том является «чистым»; если сброшен, том является «грязным», т. е. он не был должным образом демонтирован драйвером перед завершением его использования, а соответственно, информация на нём может быть повреждена;

  • 14/26 — если установлен, ошибок ввода-вывода при работе с томом не возникало; если сброшен, обращение к некоторым секторам раздела вызывало ошибки ввода-вывода.

Ну, я намеренно многое опустил.

Но на счёт выравнивания стека и регистра ss вы правы.

15/27 — если установлен, том является «чистым»; если сброшен, том является «грязным», т. е. он не был должным образом демонтирован драйвером перед завершением его использования, а соответственно, информация на нём может быть повреждена;

14/26 — если установлен, ошибок ввода-вывода при работе с томом не возникало; если сброшен, обращение к некоторым секторам раздела вызывало ошибки ввода-вывода.

Ого, этого я не знал🫠

Спасибо

Корневой каталог расположен после загрузочного сектора и таблиц FAT.

В FAT12 и FAT16 -- да, в FAT32 -- нет.

Технически - да. Область данных идёт после таблиц FAT. Ну а корень у FAT32 это цепочка кластеров начиная с кластера №2 (как уже сказано №0 и №1 - служебные везде). Таким образом они обошли жёсткое ограничение на количество файлов в корне, которое было у FAT12 и FAT16.

Не обязательно от кластера №2, положение корневого каталога (номер его первого кластера) в FAT32 указывается полем BPB_RootClus.

Тоже верно, но в 99% случаев это будет №2.

Очень красиво и интересно, это вы сделали?

Прочитайте про Терри Девиса. Я сам недавно узнал, занимательная личность была. Есть даже стримы на ютубе, как он писал Темпл ОС. Довольно легендарный человек, был в своих кругах

Где сама операционная система, её прикладные программы, команды управления, графический интерфейс командной строки, визуальный интерфейс с окошками, ромбиками, треугольниками, командерами или ещё чем?

Написание операционной системы на ассемблере, это дохлый треш. Надо использовать объектный язык программирования, Visual C++, да, да, именно его, пишем в винде, в хорошей среде разработке, на хорошем объектном языке, с использованием необходимых библиотек, и написанием своих, проект компилируем в то, что нам нужно, загрузчик, фигусчик и прочее, так же можем при сборке проекта использовать, чтобы в итоге он переводился а ассемблер и далее, собирался в итоговую программу. Если необходимо использовать, какие-то команды ассемблера для железа, так как не нашли доки или не додумались, как их же с C++ передать, то в необходимых местах делаем вставки кода асма, язык C++ при использовании Visual C++ это позволяет.

А сколько нафиг пошло систем 60-70-х годов...

Извините конечно, что не оправдал ваши высокие ожидания в этой статье.

Над всем, что вы написали выше я уже задумался. И более того уже начал. Как будет готово что-нибудь стоящее обзора, я обязательно сделаю статью про это в качестве продолжения данной статьи.

Здравствуйте! Спасибо большое за статью! Очень интересная тема!

Под спойлером "Формулы для перевода LBA в CHS" похоже не хватает делителя в формуле для вычисления head. Я так понимаю, делителем будет H.

В коде формула такаяh = ((LBA - (s-1)) / SECTORS_PER_TRACK) % HEADS_COUNT

Поправьте, пожалуйста, если есть возможность.

Спасибо за отзыв.

Чуть позже исправлю, на данный момент я в другом городе, а мой пк в другом

Sign up to leave a comment.

Articles